Docker
컨테이너 운영
수색…
통사론
- 도커 실행 [옵션] 이미지 [명령] [ARG ...]
컨테이너 실행하기
docker run hello-world
이것은 Docker Hub에서 최신 hello-world 이미지를 가져오고 (아직 가지고 있지 않다면), 새 컨테이너를 만들고 실행합니다. 설치가 올바르게 작동하고있는 것으로 나타나는 메시지가 나타납니다.
컨테이너에서 다른 명령 실행하기
docker run docker/whalesay cowsay 'Hello, StackExchange!'
이 명령은 Docker에게 docker/whalesay
이미지로부터 컨테이너를 생성하고 cowsay 'Hello, StackExchange!'
명령을 실행하도록 cowsay 'Hello, StackExchange!'
그 안에. Hello, StackExchange!
말하는 고래 사진을 인쇄해야합니다 Hello, StackExchange!
귀하의 터미널에.
이미지의 진입 점이 기본값이면 이미지에서 사용할 수있는 명령을 실행할 수 있습니다.
docker run docker/whalesay ls /
이미지를 빌드하는 동안 변경된 경우 다시 기본값으로 되돌려 야합니다.
docker run --entrypoint=/bin/bash docker/whalesay -c ls /
컨테이너를 실행 한 후 자동으로 삭제합니다.
일반적으로 Docker 컨테이너는 종료 한 후에도 계속 유지됩니다. 이렇게하면 컨테이너를 다시 실행하고 파일 시스템을 검사 할 수 있습니다. 그러나 때로는 컨테이너를 실행하고 종료 한 후 즉시 삭제하려고합니다. 예를 들어 명령을 실행하거나 파일 시스템에서 파일을 표시합니다. Docker는이 목적을 위해 --rm
명령 줄 옵션을 제공합니다.
docker run --rm ubuntu cat /etc/hosts
이렇게하면 "우분투"이미지에서 컨테이너를 만들고 / etc / hosts 파일의 내용을 표시 한 다음 종료 직후 컨테이너를 삭제합니다. 이렇게하면 실험을 마친 후 컨테이너를 정리하지 않아도됩니다.
참고 :
--rm
플래그는 docker <1.13.0의-d
(--detach
) 플래그와 함께 작동하지 않습니다.
--rm
플래그가 설정되면 Docker는 컨테이너가 제거 될 때 컨테이너와 연관된 볼륨도 제거합니다. 이것은 docker rm -v my-container
를 실행하는 것과 비슷합니다. 이름없이 지정된 볼륨 만 제거됩니다 .
예를 들어, docker run -it --rm -v /etc -v logs:/var/log centos /bin/produce_some_logs
를 실행하면 /etc
의 볼륨은 제거되지만 /var/log
볼륨은 삭제되지 않습니다. --volumes-from을 통해 상속 된 볼륨은 동일한 논리로 제거됩니다. 원래 볼륨에 이름이 지정되어 있으면 제거되지 않습니다.
이름 지정하기
기본적으로 docker run
으로 작성된 컨테이너에는 small_roentgen
또는 modest_dubinsky
와 같은 임의의 이름이 지정됩니다. 이 이름은 컨테이너의 목적을 식별하는 데 특히 도움이되지 않습니다. --name
명령 행 옵션을 전달하여 컨테이너 이름을 제공 할 수 있습니다.
docker run --name my-ubuntu ubuntu:14.04
이름은 고유해야합니다. 다른 컨테이너가 이미 사용하고있는 이름을 전달하면 Docker는 오류를 인쇄하고 새 컨테이너를 만들지 않습니다.
이름을 지정하면 Docker 네트워크에서 컨테이너를 참조 할 때 유용합니다. 이것은 배경 및 전경 Docker 컨테이너 모두에서 작동합니다.
기본 브리지 네트워크의 컨테이너는 이름으로 통신하도록 연결 되어야합니다 .
컨테이너 포트를 호스트에 바인딩
docker run -p "8080:8080" myApp
docker run -p "192.168.1.12:80:80" nginx
docker run -P myApp
EXPOSE
Dockerfile 지시문이나 docker run
위한 --expose
명령 행 옵션을 통해 이미지에 노출 된 호스트의 포트를 사용하려면 해당 포트를 -p
또는 -P
명령을 사용하여 호스트에 바인딩해야합니다 라인 옵션. -p
사용하면 특정 포트 (및 선택적 호스트 인터페이스)가 지정되어야합니다. 대문자 -P
명령 행 옵션을 사용하면 Docker가 컨테이너의 이미지에있는 노출 된 모든 포트를 호스트에 바인드 합니다 .
컨테이너 재시작 정책 (부팅시 컨테이너 시작)
docker run --restart=always -d <container>
기본적으로 Docker는 호스트 시스템이 재부팅 된 후 Docker 데몬이 다시 시작될 때 컨테이너를 다시 시작하지 않습니다. Docker는 --restart
명령 행 옵션을 제공하여 컨테이너에 대한 다시 시작 정책을 제공합니다. --restart=always
제공하면 Docker 데몬이 다시 시작된 후에 항상 컨테이너가 다시 시작됩니다. 그러나 해당 컨테이너가 수동으로 중지되면 (예 : docker stop <container>
) docker stop <container>
에 다시 시작 정책이 적용되지 않습니다.
요구 사항 ( --restart=[policy]
)에 따라 --restart
옵션에 대해 여러 옵션을 지정할 수 있습니다. 이 옵션은 부팅시 컨테이너가 시작되는 방법에도 영향을줍니다.
정책 | 결과 |
---|---|
아니 | 기본값 . 컨테이너가 중지되면 컨테이너를 자동으로 다시 시작하지 않습니다. |
실패시 : [max-retries] | 컨테이너가 실패로 끝날 때만 재시작하십시오 ( non-zero exit status ). 무기한 재시작을 피하기 위해 (문제가있는 경우), Docker 데몬이 시도하는 재시작 재시도 횟수를 제한 할 수 있습니다. |
항상 | 종료 상태에 관계없이 항상 컨테이너를 다시 시작하십시오. always 를 지정하면 Docker 디먼은 컨테이너를 무한정 다시 시작하려고 시도합니다. 컨테이너는 현재 컨테이너의 현재 상태와 상관없이 항상 데몬 시작시 시작됩니다. |
~하지 않는 한 | 컨테이너의 종료 상태에 관계없이 항상 컨테이너를 재시작하십시오. 그러나 컨테이너가 이전에 중지 상태가되면 데몬 시작시 시작하지 마십시오. |
백그라운드에서 컨테이너 실행
컨테이너가 백그라운드에서 실행되도록하려면 컨테이너를 시작할 때 -d
명령 줄 옵션을 제공하십시오.
docker run -d busybox top
옵션 -d
는 분리 모드로 컨테이너를 실행합니다. 또한 -d=true
와 같습니다.
분리 모드의 컨테이너는 중지 될 때 자동으로 제거 할 수 없으므로 -rm 옵션을 -d 옵션과 함께 사용할 수 없습니다.
컨테이너에 볼륨 할당
Docker 볼륨은 컨테이너의 수명을 초과하여 지속되는 파일 또는 디렉토리입니다. 호스트 파일이나 디렉토리를 볼륨으로 컨테이너에 마운트 할 수 있습니다 (UnionFS를 우회).
-v
명령 행 옵션을 사용하여 볼륨을 추가하십시오.
docker run -d -v "/data" awesome/app bootstrap.sh
이렇게하면 볼륨이 만들어지고 컨테이너 안의 경로 /data
마운트됩니다.
- 주 : 컨테이너를 제거 할 때
--rm
플래그를 사용하여 볼륨을 자동으로 제거 할 수 있습니다.
호스트 디렉토리 마운트
호스트 파일이나 디렉토리를 컨테이너에 마운트하려면 :
docker run -d -v "/home/foo/data:/data" awesome/app bootstrap.sh
- 호스트 디렉토리를 지정할 때 절대 경로가 제공되어야합니다.
이 호스트 디렉토리 마운트 /home/foo/data
상 /data
컨테이너 내부를. 이 "바인드 마운트 호스트 디렉토리"볼륨은 Linux mount --bind
바인드와 동일한 것으로 컨테이너의 수명 기간 동안 호스트 디렉토리를 지정된 컨테이너 경로에 임시로 마운트합니다. 호스트 또는 컨테이너에서 볼륨의 변경 사항은 디스크의 동일한 대상이기 때문에 다른 볼륨에 즉시 반영됩니다.
상대 폴더를 마운트하는 UNIX 예제
docker run -d -v $(pwd)/data:/data awesome/app bootstrap.sh
볼륨 이름 지정
볼륨은 호스트 디렉토리 경로 대신 문자열을 제공하여 이름을 지정할 수 있으며, docker는 해당 이름을 사용하여 볼륨을 생성합니다.
docker run -d -v "my-volume:/data" awesome/app bootstrap.sh
명명 된 볼륨을 만든 후에는 해당 이름을 사용하여 다른 컨테이너와 볼륨을 공유 할 수 있습니다.
환경 변수 설정
$ docker run -e "ENV_VAR=foo" ubuntu /bin/bash
-e
및 --env
는 모두 컨테이너 내부의 환경 변수를 정의하는 데 사용할 수 있습니다. 텍스트 파일을 사용하여 많은 환경 변수를 제공 할 수 있습니다.
$ docker run --env-file ./env.list ubuntu /bin/bash
예제 환경 변수 파일 :
# This is a comment
TEST_HOST=10.10.0.127
--env-file
플래그는 파일 이름을 인수로 사용하고 각 행이 --env
전달 된 인수를 모방 한 VARIABLE=VALUE
형식 --env
합니다. 주석 행 앞에 #
이 붙어야합니다.
이 세 플래그의 순서에 관계없이 --env-file
이 먼저 처리 된 다음 -e
/ --env
플래그가 처리됩니다. 이렇게하면 -e
또는 --env
를 사용하여 개별적으로 제공되는 환경 변수는 --env-var
텍스트 파일에 제공된 변수를 무시합니다.
호스트 이름 지정하기
기본적으로 고정 실행으로 작성된 컨테이너에는 임의의 호스트 이름이 지정됩니다. --hostname 플래그를 전달하여 컨테이너에 다른 호스트 이름을 지정할 수 있습니다.
docker run --hostname redbox -d ubuntu:14.04
대화 형으로 컨테이너 실행
대화 형으로 컨테이너를 실행하려면 -it
옵션을 전달하십시오.
$ docker run -it ubuntu:14.04 bash
root@8ef2356d919a:/# echo hi
hi
root@8ef2356d919a:/#
-i
STDIN을 열린 상태로 유지하고 -t
는 의사 TTY를 할당합니다.
메모리 / 스왑 한계가있는 컨테이너 실행 중
메모리 제한 설정 및 스왑 제한 해제
docker run -it -m 300M --memory-swap -1 ubuntu:14.04 /bin/bash
메모리와 스왑 한계를 설정하십시오. 이 경우 컨테이너는 300M 메모리와 700M 스왑을 사용할 수 있습니다.
docker run -it -m 300M --memory-swap 1G ubuntu:14.04 /bin/bash
실행중인 (분리 된) 컨테이너로 쉘 가져 오기
실행중인 컨테이너에 로그인하십시오.
사용자는 exec
명령을 사용하여 새 대화식 bash 쉘에서 실행중인 컨테이너를 입력 할 수 있습니다.
컨테이너가 jovial_morse
라고 jovial_morse
다음을 실행하여 대화식 pseudo-TTY bash 쉘을 얻을 수 있습니다.
docker exec -it jovial_morse bash
특정 사용자와 함께 실행중인 컨테이너에 로그인하십시오.
특정 사용자로 컨테이너를 입력하려면 -u
또는 --user
매개 변수를 사용하여 컨테이너를 설정할 수 있습니다. 사용자 이름은 컨테이너에 존재해야합니다.
-u, --user
사용자 이름 또는 UID (형식 :<name|uid>[:<group|gid>]
)
이 명령은 dockeruser
사용자와 함께 jovial_morse
로그인합니다.
docker exec -it -u dockeruser jovial_morse bash
실행중인 컨테이너에 root로 로그인하십시오.
루트로 로그인하려면 -u root
매개 변수를 사용하기 만하면됩니다. 루트 사용자는 항상 존재합니다.
docker exec -it -u root jovial_morse bash
이미지에 로그인하십시오.
run
명령으로 이미지에 로그인 할 수도 있지만 컨테이너 이름 대신 이미지 이름이 필요합니다.
docker run -it dockerimage bash
중간 이미지에 로그인 (디버그)
Dockerfile 빌드 중에 생성되는 중간 이미지에도 로그인 할 수 있습니다.
docker build .
출력 docker build .
$ docker build .
Uploading context 10240 bytes
Step 1 : FROM busybox
Pulling repository busybox
---> e9aa60c60128MB/2.284 MB (100%) endpoint: https://cdn-registry-1.docker.io/v1/
Step 2 : RUN ls -lh /
---> Running in 9c9e81692ae9
total 24
drwxr-xr-x 2 root root 4.0K Mar 12 2013 bin
drwxr-xr-x 5 root root 4.0K Oct 19 00:19 dev
drwxr-xr-x 2 root root 4.0K Oct 19 00:19 etc
drwxr-xr-x 2 root root 4.0K Nov 15 23:34 lib
lrwxrwxrwx 1 root root 3 Mar 12 2013 lib64 -> lib
dr-xr-xr-x 116 root root 0 Nov 15 23:34 proc
lrwxrwxrwx 1 root root 3 Mar 12 2013 sbin -> bin
dr-xr-xr-x 13 root root 0 Nov 15 23:34 sys
drwxr-xr-x 2 root root 4.0K Mar 12 2013 tmp
drwxr-xr-x 2 root root 4.0K Nov 15 23:34 usr
---> b35f4035db3f
Step 3 : CMD echo Hello world
---> Running in 02071fceb21b
---> f52f38b7823e
---> Running in 02071fceb21b
출력 ---> Running in 02071fceb21b
때 다음 이미지에 로그인 할 수 있습니다.
docker run -it 02071fceb21b bash
컨테이너로 stdin 전달하기
데이터베이스 덤프를 복원하거나 호스트의 파이프를 통해 일부 정보를 전달하려는 경우 -i
플래그를 docker run
또는 docker exec
대한 인수로 사용할 수 있습니다.
예를 들어, 호스트 dump.sql
파일에서 호스트에있는 데이터베이스 덤프를 컨테이너 화 된 mariadb 클라이언트에 dump.sql
경우 다음 명령을 수행 할 수 있습니다.
docker exec -i mariadb bash -c 'mariadb "-p$MARIADB_PASSWORD" ' < dump.sql
일반적으로,
docker exec -i container command < file.stdin
또는
docker exec -i container command <<EOF
inline-document-from-host-shell-HEREDOC-syntax
EOF
컨테이너에서 분리
할당 된 pty ( docker run -it ...
)가있는 실행중인 컨테이너에 연결되어있는 동안 Control P - Control Q 를 눌러 분리 할 수 있습니다.
이미지 entrypoint 지시어 무시
docker run --name="test-app" --entrypoint="/bin/bash" example-app
이 명령은 컨테이너 test-app
가 작성 될 때 example-app
이미지의 ENTRYPOINT
지정 문을 대체합니다. 별도로 지정하지 않는 한 이미지의 CMD
지시문은 변경되지 않습니다.
docker run --name="test-app" --entrypoint="/bin/bash" example-app /app/test.sh
위의 예에서 이미지의 ENTRYPOINT
와 CMD
가 모두 무시되었습니다. 이 컨테이너 프로세스는 /bin/bash /app/test.sh
됩니다.
컨테이너에 호스트 항목 추가
docker run --add-host="app-backend:10.15.1.24" awesome-app
이 명령은 --add-host <name>:<address>
형식을 따르는 항목을 컨테이너의 /etc/hosts
파일에 추가합니다. 이 예제에서 app-backend
라는 이름은 10.15.1.24
해석됩니다. 이것은 특히 프로그래밍 방식으로 서로 다른 앱 구성 요소를 묶는 데 유용합니다.
명령이 실행되고 있지 않을 때 컨테이너가 멈추는 것을 방지하십시오.
포 그라운드에서 명령이 실행되고 있지 않으면 컨테이너가 중지됩니다. -t
옵션을 사용하면 -d
옵션으로 분리해도 컨테이너가 중지되지 않습니다.
docker run -t -d debian bash
컨테이너 중지
docker stop mynginx
또한 컨테이너 ID를 사용하여 이름 대신 컨테이너를 중지 할 수도 있습니다.
이렇게하면 필요한 경우 SIGTERM 신호를 보낸 다음 SIGKILL 신호를 보내 실행중인 컨테이너를 중지합니다.
또한, kill 명령을 사용하여 -s
옵션을 사용하여 SIGKILL 또는 다른 지정된 신호를 즉시 전송할 수 있습니다.
docker kill mynginx
지정된 신호 :
docker kill -s SIGINT mynginx
컨테이너를 중지해도 삭제되지 않습니다. 정지 된 컨테이너를 보려면 docker ps -a
를 사용하십시오.
실행중인 컨테이너에서 다른 명령 실행
필요한 경우 Docker에게 exec
명령을 사용하여 이미 실행중인 컨테이너에서 추가 명령을 실행하도록 지시 할 수 있습니다. docker ps
얻을 수있는 컨테이너의 ID가 필요합니다.
docker exec 294fbc4c24b3 echo "Hello World"
-it
옵션을 사용하면 대화식 쉘을 연결할 수 있습니다.
docker exec -it 294fbc4c24b3 bash
Linux 컨테이너에서 GUI 애플리케이션 실행하기
기본적으로 Docker 컨테이너는 GUI 응용 프로그램을 실행할 수 없습니다.
그 전에 X11 소켓을 컨테이너에 먼저 전달해야하므로 직접 사용할 수 있습니다. DISPLAY 환경 변수도 전달해야합니다.
docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY <image-name>
먼저 X 서버 호스트에 대한 권한을 설정하지 않았으므로이 작업은 실패합니다.
cannot connect to X server unix:0
가장 빠른 방법 (가장 안전하지는 않음)은 다음을 사용하여 직접 액세스를 허용하는 것입니다.
xhost +local:root
컨테이너로 끝나면 다음과 같이 원래 상태로 돌아갈 수 있습니다.
xhost -local:root
또 다른 (더 안전한) 방법은 Dockerfile을 준비하여 사용자 자격 증명을 사용하여 X 서버에 액세스하는 새 이미지를 작성하는 것입니다.
FROM <iamge-name>
MAINTAINER <you>
# Arguments picked from the command line!
ARG user
ARG uid
ARG gid
#Add new user with our credentials
ENV USERNAME ${user}
RUN useradd -m $USERNAME && \
echo "$USERNAME:$USERNAME" | chpasswd && \
usermod --shell /bin/bash $USERNAME && \
usermod --uid ${uid} $USERNAME && \
groupmod --gid ${gid} $USERNAME
USER ${user}
WORKDIR /home/${user}
명령 줄에서 docker build
를 호출 할 때 Dockerfile에 나타나는 ARG 변수를 전달해야합니다.
docker build --build-arg user=$USER --build-arg uid=$(id -u) --build-arg gid=$(id -g) -t <new-image-with-X11-enabled-name> -f <Dockerfile-for-X11> .
이제 새 컨테이너를 생성하기 전에 액세스 권한이있는 xauth 파일을 만들어야합니다.
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f /tmp/.docker.xauth nmerge -
이 파일은 생성 / 실행시 컨테이너에 마운트해야합니다.
docker run -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /tmp/.docker.xauth:/tmp/.docker.xauth:rw -e XAUTHORITY=/tmp/.docker.xauth