kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

Docker

docker command 정리

까마기 2020. 9. 7. 13:20
반응형

 

1. 모든 이미지 & 모든 컨테이너 삭제하기
# docker rmi $(docker images -f "dangling=true" -q)
모든 도커 컨테이너 삭제(remove all docker containers) : 구동중인 모든 도커 컨테이너들을 중지시키고, 삭제한다.

# docker rmi $(docker images -q)


# docker stop $(docker ps -a -q)
 
모든 컨테이너 삭제
# docker rm $(docker ps -a -q)

2. 컨테이너 삭제

동작중인 컨테이너 확인
$ docker ps

정지된 컨테이너 확인
$ docker ps -a

컨테이너 삭제
$ docker rm [컨테이너id]

삭제된 것 확인
$ docker ps -a

복수개 삭제도 가능
$ docker rm [컨테이너id], [컨테이너id]

컨테이너 모두 삭제
$ docker rm `docker ps -a -q`


3. 이미지 삭제

현재 이미지 확인
$ docker images

이미지 삭제
$ docker rmi [이미지id]

컨테이너를 삭제하기 전에 이미지를 삭제할 경우
-f 옵션을 붙이면 컨테이너도 강제삭제
$ docker rmi -f [이미지id]

 

 
4. docker container에 실행 명령 전달하기
# docker exec -it [cointainer명 또는 name] [실행명령]
# docker exec -i -t redis /bin/bash
# docker exec -it [container명] /bin/sh
 
5. 컨테이너에 명령어 직접 전달하여 실행
# docker exec -i [container명 또는 name] [실행명령]
# docker exec -i redis redis-server --requirepass k9803048
 
6. database dump
# docker exec -i dbmaster mysql -uroot -p[패스워드] DB명 < 파일명.sql
 
7. docker file build
# docker build -t [컨테이너명] [경로]
# docker build -t bcg:web ./

 

 
* docker file build no-cache
# docker build -t bcg:web ./ --no-cache
 
* docker file build cache specific
# docker build -t bcg:web ./ --build-arg CACHE_DATE=$(date)
 
* docker file build 파일지정
docker build -f ./Dockerfile_daemon ./ -t bcg:web
 
8. docker run 명령
[Docker] run 명령을 통해 image에서 컨테이너 재 생성
docker run -d --name 지정할이름 image명

docker run -d --privileged --sysctl net.core.somaxconn=4096 --ulimit nofile=512000:512000 --ulimit nproc=512000:512000 --name new_backoffice -p 80:80 49236605475f



docker run --privileged --sysctl net.core.somaxconn=4096
 
# docker run --entrypoint "/bin/ls" daemon:1.0 -al /home/app/bcg/log
# docker run -d --name daemon \
  --entrypoint "/home/app/bcg/shell/god_start.sh" \
  --volume=/data/log/:/home/app/bcg/log/ \
  [A, B]
 
* docker monitoring
sudo docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8081:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest
 
# docker run -d --name redis -p 6379:6379  -e REDIS_PASSWORD=k9803048 bitnami/redis:latest
# docker run -d --name dbmaster -v /dbdata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=k9803048 -e MYSQL_USER=shkim -e MYSQL_PASSWORD=k9803048 -e MYSQL_DATABASE=kiwoom_development -p 3306:3306 mysql:5.7
# docker run -d --name rabbitmq -p 5672:5672 rabbitmq:3-management
# docker run -d --name pusher -p 8080:8080 -p 4567:4567 -e APPKEY=39a88ff7dc71a7e0aeb1 -e APPSECRET=4eabcfde8566874641bf -e REDIS_HOST=redis -e REDIS_PORT=6379 -e REDIS_DB=5 antillion/slan

 

9. docker commit

 

docker commit 현재컨테이너명 새로운컨테이너명

 

10. docker-compose 명령

docker-compose 커맨드 예

 

docker-compose -f docker-compose.yml up -d lp

 

 

11. docker container 파일로 백업하기

 

- docker 추출 (container export)

docker container export [컨테이너명 또는 컨테이너ID] > [백업할 파일명, 보틍 .tar]

 

ex) # docker container export docker_webapp_1 > test.tar

- docker 삽입 (container import) 

https://jybaek.tistory.com/566

 

12. docker container log 확인 - docker-compose logs -f

 

13 docker stats

 

14. docker 파일 공유

 

 

[Docker] 파일 복사

- 호스트 -> 컨테이너
docker cp [host 파일경로] [container name]:[container 내부 경로]

anchore라는 name을 가진 컨테이너가 실행중이다.
이 컨테이너에 호스트에 있는 docker-cp-test 라는 파일을 복사해 보자.

- docker cp 명령어로 호스트의 파일 docker-cp-test를 anchore 컨테이너의 test 디렉터리 하위로 복사했다.
anchore 컨테이너에 들어가 test 디렉터리를 확인해 보면 호스트에서 복사한 파일이 복사가 되어 있는 것을 확인할 수 있다.


- 컨테이너 -> 호스트

# docker cp [container name]:[container 내부 경로] [host 파일경로]


도커 컨테이너와 호스트 컴퓨터 간에 파일을 공유해야 할 때는 다음 방법을 사용할 수 있다.
1)  공유 폴더를 이용하는 법

만약 docker container run 명령으로 도커 컨테이너를 시작할 때 -v 옵션으로 컨테이너-호스트 간의 공유 폴더를 만들었다면 공유 폴더에 공유하고자 하는 폴더를 넣은 뒤 리눅스 mv 명령이나 호스트의 파일 복사 명령으로 원하는 위치로 이동하면 된다. 



예를 들어 test.txt 이라는 파일을 윈도우즈 호스트에서 도커 컨테이너로 이동하려고 하는 경우를 생각하자. 또 호스트의 사용자 홈 디렉터리가 도커 컨테이너의 ~/hosthome 이라는 폴더 이름으로 공유되고 있다고 가정하자. 
- test.txt 파일을 호스트의 사용자 홈 디렉터리로 복사한다. 
- 도커 컨테이너의 터미널(콘솔)을 열고 도커 컨테이너 안에서 다음과 같이 명령한다. 
dockeruser@306d4d3d002b:~$ mv ~/hosthome/test.txt ~ 

 

2) docker container cp 명령을 사용하는 법
이 방법은 공유 폴더를 지정하지 않은 상태에서도 쓸 수 있다. 도커 터미널에서 다음과 같이 명령하면 된다. 
$ docker container cp 컨테이너_이름:컨테이너_폴더나_파일_이름 호스트컴퓨터의_폴더 
예를 들어 rpython 이란 이름의 컨테이너 내에 있는 /home/dockeruser/notebook 폴더를 통째로 호스트 컴퓨터의 d:/ 라는 폴더 아래로 복사하고 싶으면 다음과 같이 명령한다. 
$ docker container cp rpython:/home/dockeruser/notebook d:/ 
만약 data 폴더 안에 untitled.ipynb 라는 파일만 있었으면 다음과 같이 notebook 폴더가 만들어지고 그 아래에 untitled.ipynb 파일이 있는 것을 볼 수 있다. 

$ dir d:/notebook/ 
untitled.ipynb 
만약 datascienceschool/rpython 이미지를 사용하고 있다면 /home/dockeruser 폴더를 통째로 복사하지 않도록 주의한다. 이 폴더 아래에는 Anaconda 설치 파일도 함께 있어서 필요없이 많은 파이썬 실행 파일과 패키지 파일까지 복사된다. 
이 방법의 단점은 아직까지 * 등의 와일드 카드(wild card)를 지원하지 않는다는 점이다. 따라서 정확한 파일이름이나 폴더 이름을 지정해야 한다. 
반대로 호스트 컴퓨터에 백업해 놓은 파일이나 폴더를 컨테이너 안으로 복사하려면 다음과 같이 파일 인수를 바꾸면 된다. 
$ docker container cp d:/notebook rpython:/home/dockeruser/ 
다만 이 경우에는 호스트 컴퓨터의 사용자와 컨테이너의 사용자가 다르면 권한(permission) 오류가 발생할 수 있으므로 도커 컨테이너 안에서 다음과 같이 폴더 소유자를 변경해 주어야 한다. 

$ docker attach rpython 
dockeruser@bbbd63bfa054:~$ sudo chown dockeruser:dockeruser -R /home/dockeruser/notebook 


3) scp 파일 전송 프로그램을 이용하는 법
만약 도커 컨데이터와 호스트 간에 공유 폴더는 설정되어 있지 않지만 도커 컨테이너 안에서 ssh 서버가 가동 중이라면 scp 파일 전송 프로그램을 이용할 수 있다. datascienceschool/rpython 도커 이미지에는 이미 ssh 서버가 가동되도록 설정되어 있기 때문에 scp를 사용할 수 있다.
호스트 컴퓨터가 맥이라면 이미 scp 프로그램이 있을 것이다. 윈도우라면 putty 프로그램 다운로드 웹 사이트에서 윈도우용 scp 프로그램인 pscp 프로그램을 내려받을 수 있다.

다음으로는 도커 컨데이터에서 가동 중인 ssh 서버의 포트 번호를 알아야 한다. 원래 ssh 서버 포트는 22번이지만 도커 호스트에서도 22번을 사용하기 때문에 보통 다른 포트 번호로 가동한다. 포트 번호는 자동으로 랜덤하게 지정되었을 수도 있고 docker run 명령시에 -p 옵션으로 지정하였을 수도 있다. 만약 이 글을 순서대로 따라왔다면 아마도 8022 포트를 사용할 것이다. 현재 사용하는 포트 번호는 docker container port 명령으로 알 수 있다.

이제 다음과 같이 명령한다. 암호를 입력하라는 프롬프트가 나오면 도커 컨테이너 암호를 넣는다. 이 때 다음과 같은 점에 주의한다.
*  윈도우즈에서는 scp 대신 pscp 명령을 사용한다.
*  포트 번호는 8022이 아닌 경우에는 자신이 사용하는 포트 번호를 사용한다.
*  사용자가 dockeruser가 아니면 자신이 사용하는 사용자 아이디와 디렉터리를 사용한다.

$ scp -P 8022 test.txt dockeruser@192.168.99.100:/home/dockeruser
dockeruser@192.168.99.100's password:

 

15. docker container name 변경

docker rename [old] [new]

 

16. docker create image from container

17. 실행중인 docker 컨테이너 환경변수 변경

- container id 알아내기
# docker inspect my_container

- config 파일 변경
# vi /var/lib/docker/containers/{container-id}/config.v2.json

- docker 컨테이너 재시작
# docker restart my_container

 

 

18. docker container 백업/복원

 

id : karas639

pw : zc*********

 


● 컨테이너 백업
도커 이미지는 OS 를 담고 있으며, 하나 이상의 이미지를 가질수 있다.
도커 컨테이너는 이미지로부터 생성되는 실행중인 인스턴스이다.

도커 컨테이너 백업을 위해서는 commit 을 해야한다.
commit 을 하면 현재 상태가 도커 이미지로 저장된다.

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78727078a04b debian:8 "/bin/bash" 13 seconds ago Up 11 seconds container1
위의 docker ps 명령의 결과로 하나의 컨테이너가 up 상태임을 확인 할 수 있다.
컨테이너 아이디는 78727078a04b 이고, 컨테이너 이름은 container1 이다.
이제, commit 명령을 사용하여 현재 실행 상태를 스냅샷 떠보자.

# docker commit -p 78727078a04b container1
e09f9ac65c8b3095927c14ca0594868f73831bde0800ce66415afeb91aea93cf
-p 옵션은 커밋하기 위해 컨테이너를 일시 중지 시키는 옵션이다.
커밋 명령을 통해 container1 이란 이름의 이미지가 하나 생성되었음을 아래와 같이 확인 할 수 있다.

# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
container1 latest e09f9ac65c8b 39 seconds ago 125.1 MB
이제 재배포 할 수 있는 컨테이너 백업 이미지 하나를 얻게 되었다.
다른 도커 호스트 시스템에 우리의 container1 이미지를 재배포(redeploy)하려면
개인 도커 레포지토리에 이미지를 푸쉬해야 한다.

# docker login
# docker push container1
또는 tar 로 묶어서 자유롭게 원하는 도커 호스트 시스템에 배포할 수도 있다.

# docker save -o ~/container1.tar container1
[root@localhost lubos]# ls -l ~/container1.tar
-rw-r--r--. 1 root root 131017216 Jun 14 20:31 /root/container1.tar


● 컨테이너 복원
앞서 도커 컨테이너를 백업하는 방법에 대해 알아보았다.
이번 섹션에서는 백업을 어떻게 복원하는지 알아보기로 한다.

개인 도커 레포지토리에 백업본을 push 한 경우에는 간단히 run 명령을 사용하여
container1 이미지로부터 새로운 인스턴스를 시작하면 된다.

tar 로 묶어서 백업한 경우 load 명령을 사용하여 도커의 로컬 이미지 레포지토리에 넣어주어야 한다.
-i 옵션은 --input 임.
# docker load -i /root/container1.tar
확인을 위해 아래 명령을 입력해보자.
# docker images
이미지 목록에 복원된 container1 이 나오면,
run 명령을 이용하여 container1 이미지로부터 새로운 인스턴스를 시작할 수 있다.

 

18-1. 컨테이너 작업 및 commit 및 tag 설정 후 docker hub로 공유하여 관리하기

------------------docker 컨테이너 작업 예시 -----------
docker login

 

docker pull karas639/ubuntu:latest
docker run -d -p 80:80 -p 5601:5601 karas639/ubuntu
(port 추가 시 -p 옵션 추가하여 실행)
 
접속 및 작업 후--->
 
docker commit -p 컨테이너 id
docker images -> image id 확인
docker tag 저장된image id karas639/ubuntu:latest
docker push karas639/ubuntu

19. [Docker] 한번 생성한 컨테이너 계속사용하기 exit & restart


docker run 및 --name 옵션으로 컨테이너 이름 지정 및 접속 후
#exit 명령어를 실행하여 컨테이너를 Stop 시킴

윈도우 호스트 창에서 docker restart 지정한컨테이너이름
-> 기존에 사용했던 컨테이너로 재접속

완전히 껐다가 다시 접근할 때에는

# docker start 컨테이너이름
# docker attach 컨테이너이름

 

 

20. docker tag 달기

docker tag 8516816a424c 376112396982.dkr.ecr.ap-southeast-1.amazonaws.com/exvina-exchange-web:stg_last

 

# docker image tag cilk-elk-kibana karas639/docker-elk_kibana
# docker image tag docker-elk_kibana karas639/docker-elk_kibana:v1
# docker images | grep v1
# docker image tag docker-elk_elastice karas639/docker-elk_elastic:v1
# docker image tag docker-elk_elastic karas639/docker-elk_elastic:v1
# docker image tag docker-elk_elasticsearch karas639/docker-elk_elasticsearch:v1
# docker image tag docker-elk_logstash karas639/docker-elk_logstash:v1
# docker image push karas639/docker-elk_elasticsearch:v1
# docker image push karas639/docker-elk_logstash:v1
# docker image push karas639/docker-elk_kibana:v1


21. Docker 컨테이너(Container) 커밋(Commit)하기
* 현재까지 작업해 놓은 ubuntu 컨테이너를 그대로 저장하고 싶다.
*  실행중인 컨테이너를 커밋해보자.
# docker commit CONTAINER IMAGE_NAME

--> $ docker commit ubuntu-cpp-driver ubuntu-cpp-driver
sha256:85b8eb5a23e6c850c4f4d298119275ec5a85bc43c78414372aee2859e9ad9e54
*  container 이름이 ubuntu-cpp-driver 였고, 이를 이미지로 저장할 때 이미지 이름도 동일하게 했다.
*  docker images로 확인해보자.

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-cpp-driver latest 85b8eb5a23e6 About a minute ago 582MB

22. Docker 이미지(Image) Push하기
*  Docker cloud 에 로그인 하기
# docker login

 

*  docker user id 변수 지정해놓기
# export DOCKER_ID_USER="nicewoong"

 

*  Docker Image 에 태그 달기
# docker tag ubuntu-cpp-driver $DOCKER_ID_USER/ubuntu-cpp-driver

 

*  Tag 가 적용되어 있는 Image 를 Docker Cloud 에 Push
# docker push $DOCKER_ID_USER/ubuntu-cpp-driver
The push refers to a repository [docker.io/nicewoong/ubuntu-cpp-driver]
441a4ecb7164: Pushing [==================================================>] 472.2MB
7f7a065d245a: Mounted from nicewoong/ubuntu-bluecoat
f96e6b25195f: Mounted from nicewoong/ubuntu-bluecoat
c56153825175: Mounted from nicewoong/ubuntu-bluecoat
ae620432889d: Mounted from nicewoong/ubuntu-bluecoat
a2022691bf95: Mounted from nicewoong/ubuntu-bluecoat

docker hub에 올린 내 이미지 다운로드 하기

참고 URL : caylent.com/docker-commands-cheat-sheet

반응형