[docker] run 명령어

Hyeseong·2020년 12월 1일
1

RUN 커맨드

docker container run
혹은
docker run

2가지 명령어를 통해서 컨테이너의 생성 및 시작을 진행합니다.

구문

docker container run [옵션] 이미지명[:태그명][인수]

****

run 명령어 옵션

옵션에 값을 설정할 때 =와 “는 생략해도 됩니다.

  • -a, --attach=[]: 컨테이너에 표준 입력(stdin), 표준 출력(stdout), 표준 에러(stderr)를 연결합니다.
    • --attach=”stdin”
  • --add-host=[]: 컨테이너의 /etc/hosts에 호스트 이름과 IP 주소를 추가합니다.
    • --add-host=hello:192.168.0.10
  • -c, --cpu-shares=0: CPU 자원 분배 설정입니다. 설정의 기본 값은 1024이며 각 값은 상대적으로 적용됩니다.
    • --cpu-shares=2048처럼 설정하면 기본 값 보다 두 배 많은 CPU 자원을 할당합니다.
    • 이 설정 값은 리눅스 커널의 cgroups에서 사용됩니다.
  • --cap-add=[]: 컨테이너에서 cgroups의 특정 Capability를 사용합니다. ALL을 지정하면 모든 Capability를 사용합니다.
  • --cap-drop=[]: 컨테이너에서 cgroups의 특정 Capability를 제외합니다.
  • --cidfile=””: cid 파일 경로를 설정합니다. cid 파일에는 생성된 컨테이너의 ID가 저장됩니다.
  • --cpuset=””: 멀티코어 CPU에서 컨테이너가 실행될 코어를 설정합니다.
    • --cpuset=”0,1”처럼 설정하면 첫 번째, 두 번째 CPU 코어를 사용합니다.
    • --cpuset=”0-3”처럼 설정하면 첫 번째 CPU 코어부터 네 번째까지 사용합니다.
  • -d, --detach=false: Detached 모드입니다. 보통 데몬 모드라고 부르며 컨테이너가 백그라운드로 실행됩니다.
  • --device=[]: 호스트의 장치를 컨테이너에서 사용할 수 있도록 연결합니다. <호스트 장치>:<컨테이너 장치> 형식입니다.
    • --device=”/dev/sda1:/dev/sda1”처럼 설정하면 호스트의 /dev/sda1 블록 장치를 컨테이너에서도 사용할 수 있습니다.
  • --dns=[]: 컨테이너에서 사용할 DNS 서버를 설정합니다.
    • --dns=”8.8.8.8”
  • --dns-search=[]: 컨테이너에서 사용할 DNS 검색 도메인을 설정합니다.
    • --dns-search=”example.com”처럼 설정하면 DNS 서버에 hello를 질의할 때 hello.example.com을 먼저를 찾습니다.
  • -e, --env=[]: 컨테이너에 환경 변수를 설정합니다. 보통 설정 값이나 비밀번호를 전달할 때 사용합니다.
    • -e MYSQL_ROOT_PASSWORD=examplepassword
  • --entrypoint=””: Dockerfile의 ENTRYPOINT 설정을 무시하고 강제로 다른 값을 설정합니다.
    • --entrypoint=”/bin/bash”
  • --env-file=[]: 컨테이너에 환경 변수가 설정된 파일을 적용합니다.
    • --env-file=”/etc/environment”
  • --expose=[]: 컨테이너의 포트를 호스트와 연결만 하고 외부에는 노출하지 않습니다.
    • --expose=”3306”
  • -h, --hostname=””: 컨테이너의 호스트 이름을 설정합니다.
  • -i, --interactive=false: 표준 입력(stdin)을 활성화하며 컨테이너와 연결(attach)되어 있지 않더라도 표준 입력을 유지합니다. 보통 이 옵션을 사용하여 Bash에 명령을 입력합니다.
  • --link=[]: 컨테이너끼리 연결합니다. <컨테이너 이름>:<별칭> 형식입니다.
    • --link=”db:db”
  • --lxc-conf=[]: LXC 드라이버를 사용한다면 LXC 옵션을 설정할 수 있습니다.
    • --lxc-conf=”lxc.cgroup.cpuset.cpus = 0,1”
  • -m, --memory=””: 메모리 한계를 설정합니다. <숫자><단위> 형식이며 단위는 b, k, m, g를 사용할 수 있습니다.
    • --memory=”100000b”
    • --memory=”1000k”
    • --memory=”128m”
    • --memory=”1g”
  • --name=””: 컨테이너에 이름을 설정합니다.
  • --net=”bridge”: 컨테이너의 네트워크 모드를 설정합니다.
    • bridge: Docker 네트워크 브리지에 새 네트워크를 생성합니다.
    • none: 네트워크를 사용하지 않습니다.
    • container:<컨테이너 이름, ID>: 다른 컨테이너의 네트워크를 함께 사용합니다.
    • host: 컨테이너 안에서 호스트의 네트워크를 그대로 사용합니다. 호스트 네트워크를 사용하면 D-Bus를 통하여 호스트의 모든 시스템 서비스에 접근할 수 있으므로 보안에 취약해집니다.
  • -P, --publish-all=false: 호스트에 연결된 컨테이너의 모든 포트를 외부에 노출합니다.
  • -p, --publish=[]: 호스트에 연결된 컨테이너의 특정 포트를 외부에 노출합니다. 보통 웹 서버의 포트를 노출할 때 주로 사용합니다.
    • <호스트 포트>:<컨테이너 포트> 예) -p 80:80
    • <IP 주소>:<호스트 포트>:<컨테이너 포트> 호스트에 네트워크 인터페이스가 여러 개이거나 IP 주소가 여러 개 일 때 사용합니다. 예) -p 192.168.0.10:80:80
    • <IP 주소>::<컨테이너 포트> 호스트 포트를 설정하지 않으면 호스트의 포트 번호가 무작위로 설정됩니다. 예) -p 192.168.0.10::80
    • <컨테이너 포트> 컨테이너 포트만 설정하면 호스트의 포트 번호가 무작위로 설정됩니다. 예) -p 80
  • --privileged=false: 컨테이너 안에서 호스트의 리눅스 커널 기능(Capability)을 모두 사용합니다.
  • --restart=””: 컨테이너 안의 프로세스 종료 시 재시작 정책을 설정합니다.
    • no: 프로세스가 종료되더라도 컨테이너를 재시작하지 않습니다. 예) --restart=”no”
    • on-failure: 프로세스의 Exit Code가 0이 아닐 때만 재시작합니다. 재시도 횟수를 지정할 수 있습니다. 횟수를 지정하지 않으면 계속 재시작합니다. 예) --restart=”on-failure:10”
    • always: 프로세스의 Exit Code와 상관없이 재시작합니다. 예) --restart=”always”
  • --rm=false: 컨테이너 안의 프로세스가 종료되면 컨테이너를 자동으로 삭제합니다. -d 옵션과 함께 사용할 수 없습니다.
  • --security-opt=[]: SELinux, AppArmor 옵션을 설정합니다.
    • --security-opt=”label:level:TopSecret”
  • --sig-proxy=true: 모든 시그널을 프로세스에 전달합니다(TTY 모드가 아닐 때도). 단 SIGCHLD, SIGKILL, SIGSTOP 시그널은 전달하지 않습니다.
  • -t, --tty=false: TTY 모드(pseudo-TTY)를 사용합니다. Bash를 사용하려면 이 옵션을 설정해야 합니다. 이 옵션을 설정하지 않으면 명령을 입력할 수는 있지만 셸이 표시되지 않습니다.
  • -u, --user=””: 컨테이너가 실행될 리눅스 사용자 계정 이름 또는 UID를 설정합니다.
  • -v, --volume=[]: 데이터 볼륨을 설정입니다. 호스트와 공유할 디렉터리를 설정하여 파일을 컨테이너에 저장하지 않고 호스트에 바로 저장합니다. 호스트 디렉터리 뒤에 :ro, :rw를 붙여서 읽기 쓰기 설정을 할 수 있으며 기본 값은 :rw입니다. 자세한 내용은 ‘6.4 Docker 데이터 볼륨 사용하기’를 참조하기 바랍니다.
    • <컨테이너 디렉터리> 예) -v /data
    • <호스트 디렉터리>:<컨테이너 디렉터리> 예) -v /data:/data
    • <호스트 디렉터리>:<컨테이너 디렉터리>:<ro, rw> 예) -v /data:/data:ro
    • <호스트 파일>:<컨테이너 파일> 예) -v /var/run/docker.sock:/var/run/docker.sock
  • --volumes-from=[]: 데이터 볼륨 컨테이너를 연결하며 <컨테이너 이름, ID>:<ro, rw> 형식으로 설정합니다. 기본적으로 읽기 쓰기 설정은 -v 옵션의 설정을 따릅니다. 자세한 내용은 ‘6.5 Docker 데이터 볼륨 컨테이너 사용하기’를 참조하기 바랍니다.
    • --volumes-from=”hello”
    • --volumes-from=”hello:ro”처럼 설정하면 데이터 볼륨을 읽기 전용으로 사용합니다.
    • --volumes-from=”hello:rw”처럼 설정하면 데이터 볼륨에 읽기 쓰기 모두 할 수 있습니다.
  • -w, --workdir=””: 컨테이너 안의 프로세스가 실행될 디렉터리를 설정합니다.
    • --workdir=”/var/www”

백그라운드 실행 -d 옵션

예시

docker run -d centos /bin/ping localhost

위 예시 설명:

  • docker run은 커넽이너를 생성 및 실행
  • -d 백그라운드에서 실행하는 옵션
  • centos(혹은 이미지명)
  • /bin/ping localhost는 컨테이너에서 실행할 명령어

백그라운드에서 실행되고 있는지 아닌지를 확인할 때는 docker logs명령을 사용합니다. docker container logs 명령은 컨테이너의 로그를 확인하는 명령입니다. 로그를 확인하고 싶은 컨테이너 식별자를 지정하여 실행합니다. 아래 예시를 확인해주세요.
참고로 -t 옵션은 타임스탬프를 표시하는 것입니다.

명령을 실행한 후에도 컨테이너는 남습니다. 실행 후의 컨테이너를 자동으로 삭제하고 싶을 때는 --rm 옵션을 지저압니다.

명령의 실행 결과에 따라 컨테이너를 재시작할 때는 --restart 옵션을 지정합니다.

--restart 옵션

  • no : 재시작하지 않는다

  • on-failure : 종료 스테이터스가 0이 아닐 떄 재시작한다.

  • on-failure:횟수 n : 종료 스테이터스가 0이 아닐때 n번 재시작한다.

  • always : 항상 재시작 한다.

  • unless-stopped : 최근 컨테이너가 정지 상태가 아니라면 항상 재시작한다.

    아래에서 --restart옵션 always값을 사용하고여 exit 명령어로 나와도 계속 컨테이너가 실행한 모습을 확인 할 수 있습니다.

참고! --rm 옵션과 --restart 옵션은 동시에 사용할 수 없으므로 주의하기 바랍니다.

컨테이너의 네트워크 설정

docker run 네트워크옵션 이미지명:태그명 인수

--add-host= 호스트명:ip주소 : 컨테이너의 /etc/hosts에 호스트명과 IP정의
--dns=IP주소 : 컨테이너용 DNS 서버의 IP 주소 지
--expose : 지정한 범위의 포트 번호를 할당
--mac-address=MAC주소 : 컨테이너의 MAC주소 지정
--net=[bridge | none | container<name | id> |host |NETWORK : 컨테이너의 네트워크를 지정
--hostname, -h : 컨테이너 자신의 호스트명을 지정
--publish, -p호스트의 포트번호: 컨테이너의 포트번호 : 호스트와 컨테이너의 포트 매핑
--publish-all, -P(대문자) : 호스트에 임의의 포트를 컨테이너에 지정

컨테이너를 시작할 떄 네트워크에 관한 설정을 할 수 있습니다.
컨테이너의 포트번호와 호스트 OS의 포트번호를 매핑할 때

$ docker run -d -p 8080:80 nginx

DNS 서버를 설정

$ docker run -d --dns 192.168.1.1 nginx

MAC 주소를 지정할 때는

$ docker run -d --mac-address="92:d0:c6:0a:29:33" centos

$ docker container inspect --format={% raw %}"{{ .Config.MacAddress }}"{% endraw %}

호스트명과 IP 주소 정의

$ docker run -it --add-host test.com:192.168.1.1 centos

아래 명령을 실행하고 컨테이너 안의 /etc/hosts를 확인하면 컨테이너 자신의 호스트명이 www.test.com과 node1.test.com(192.168.1.1)으로 정의되어 있는 것을 알 수 있어요.

docker에서는 기본적으로 호스트OS와 브리지 연결을 하지만 --net 옵션을 사용하면 아래와 같은 네트워크 설정이 가능해요.

--net 옵션

  • bridge : 브리지 연결(기본값)을 사용한다.

  • none : 네트워크에 연결하지 않는다.

  • container: name | id : 다른 컨테이너의 네트워크를 사용한다.

  • host : 컨테이너가 호스트 OS의 네트워크를 사용한다.

  • NETWORK : 사용자 정의 네트워크를 사용합니다

    사용자 정의 네트워크

docker network create

이 네트워크를 작성하려면 docker 네트워크 드라이버 또는 외부 네트워크 드라이버 플러그인을 사용해야합니다. 똑같은 네트워크에 대해 여러 컨테이너가 연결을 할 수 있습니다. 사용자 정의 네트워크에 연결하면 컨테이너는 컨테이너의 이름이나 IP 주소로 서로 통신을 할 수 있습니다.
그리고 오버레이 네트워크나 커스텀 플러그인을 사용하면 멀티호스트에 대한 연결을 할 수 있습니다.
컨테이너가 동일한 멀티 호스트 네트워크에 연결되어 있으면 이 네트워크를 통해 통신이 가능합니다.

아래의 예는 외부 브리지 네트워크 드라이버를 사용하여 'webap-net'이라는 이름의 네트워크를 작성하고, 작성한 네트워크 상에서 컨테이너를 실행합니다.

$ docker network create -d bridge webap-net 
$ docker run --net=webap-net -it centos

자원을 지정하여 컨테이너 실행

CPU or Memory와 같은 자원을 지정하여 컨테이너를 생성 및 실행하는 옵션은 아래와 같아요.

  • --cpu-shares, -c
  • --memory, -m : 사용할 메모리를 제한하여 실행
  • --volume=호스트의디렉토리:컨테이너의디렉토리, -v : 호스트와 컨테이너의 디렉토리를 공유

컨테이너를 시작 할 떄 CPU | MEMORY 자원을 제한할 수 있습니다.

$ docker container run --cpu-shares=512 --memory=1g centos
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.

디렉토리 공유

호스트 OS와 컨테이너 안의 디렉토리를 공유하고 싶을 떄는 -v(--volume)옵션을 사용합니다.
예를들어 호스트의 /users/asa/webap 폴터들 컨테이의 /usr/share/nginx/html 디렉토리와 공유하고 싶을 떄는 아래와 같이 하면됩니다.

$ docker run -v /users/asa/webap:/usr/share/nginx/html nginx

컨테이너를 생성 및 시작하는 환경을 지정

docker run 환결설정옵션 이미지명:태그명 인수

환경변수 설정

hyeseong-kisti-desck@ubuntu:~$ docker run -it -e foo=bar centos /bin/bash

[root@b293ad62be6a /]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASHRCSOURCED=Y
BASH_ALIASES=()
...
...
foo=bar
...
...

환경변수 일괄 설정

환경변수를 정의한 파일로부터 일괄적으로 등록하고 싶은 경우는 아래의 명령을 실행합니다. 이 예에서는 env_list라는 이름의 파일 안에 환경변수를 정해 놓고 있습니다.

hyeseong-kisti-desck@ubuntu:~/Documents$ docker container run -it --env-file=env_list centos /bin/bash

[root@735edac1a7ec /]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASHRCSOURCED=Y
...
...
foo=bar
hoge=fuga
...
...
{ 
    [ -z "$AWKPATH" ] && AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`;
    export AWKPATH="$*:$AWKPATH"
}

컨테이너의 작업 디렉토리를 지정하여 실행하고 싶은 경우에는 --workdir, -w 옵션을 사용합니다.

hyeseong-kisti-desck@ubuntu:~/Documents$ docker run -it -w=/tensorflow centos /bin/bash
[root@d69dc90dc1e5 tensorflow]# 

또한 컨테이너를 시작할 때 파일 시스템을 읽기 전용으로 하고 싶을 때는 --read-only 옵션을 설정합니다.

ps 명령어 옵션

컨테이너 목록 필터링 -f

필터링 조건은 key=value로 지정합니다.

출력 형식 지정

  • .ID
  • .Image
  • .COmmand
  • .CreatedAt
  • .RunningFor
  • .Ports
  • .Status
  • .Size
  • .Names
  • .Mounts
  • .Networks

컨테이너 ID와 가동중인지 아닌지의 상태르 콜론으로 구분하여 표시하려면 아래와 같이해보세요.

출력 형식 지정

<INPUT>
docker ps -a --format {% raw %}'{{.Names}}:{{.Status}}'{% endraw %}

<OUTPUT>
dreamy_stonebraker:Exited (127) 6 minutes ago
sad_borg:Exited (0) 10 minutes ago
elated_northcutt:Exited (0) 14 minutes ago
suspicious_kowalevski:Exited (0) 15 minutes ago
upbeat_ellis:Exited (1) 16 minutes ago
agitated_mendel:Exited (0) 38 minutes ago
awesome_golick:Exited (0) 55 minutes ago
exciting_hellman:Exited (0) 56 minutes ago
youthful_archimedes:Exited (0) About an hour ago
elated_sinoussi:Exited (0) About an hour ago
modest_hellman:Up 40 minutes
unruffled_gould:Exited (137) 40 minutes ago

테이블로 구분하여 출력

<INPUT>
$ docker ps -a --format 'table {% raw %}{{.Names}}\t{{.Status}}\t{{.Mounts}}{% endraw %}'

<OUTPUT>
NAMES                   STATUS                         MOUNTS
dreamy_stonebraker      Exited (127) 9 minutes ago     
sad_borg                Exited (0) 13 minutes ago      
elated_northcutt        Exited (0) 16 minutes ago      
suspicious_kowalevski   Exited (0) 17 minutes ago      
upbeat_ellis            Exited (1) 19 minutes ago      
agitated_mendel         Exited (0) 41 minutes ago      
awesome_golick          Exited (0) 58 minutes ago      
exciting_hellman        Exited (0) 59 minutes ago      
youthful_archimedes     Exited (0) About an hour ago   
elated_sinoussi         Exited (0) About an hour ago   
modest_hellman          Up 42 minutes                  
unruffled_gould         Exited (137) 43 minutes ago

stat 명령어 - 컨테이너 가동 확인

<INPUT>
$ docker stats modest_hellman(컨테이너이름)


<OUTPUT>
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
0b10e29a88a9        modest_hellman      0.00%               2.395MiB / 1.914GiB   0.12%               11.3kB / 0B         6.01MB / 0B         1

프로세스 확인

hyeseong-kisti-desck@ubuntu:~/Documents$ docker top modest_hellman 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                1761                1727                0                   21:24               pts/0               00:00:00            /bin/bash

stop 명령어

옵션

--time, -t : 컨테이너의 정지 시간을 지정(기본값은 10초)

docker container stop -t 2 [컨테이너식별자]
# 2초후에 컨테이너를 정지시킴

restart 명령

hyeseong-kisti-desck@ubuntu:~$ docker restart -t 5 sad_borg elated_northcutt suspicious_kowalevski 
sad_borg
elated_northcutt
suspicious_kowalevski

hyeseong-kisti-desck@ubuntu:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
735edac1a7ec        centos              "/bin/bash"         28 minutes ago      Up 4 seconds                            sad_borg
0f56e70ad51f        centos              "/bin/bash"         29 minutes ago      Up 4 seconds                            elated_northcutt
a8f9e8edab4f        centos              "/bin/bash"         30 minutes ago      Up 3 seconds                            suspicious_kowalevski
0b10e29a88a9        centos              "/bin/bash"         4 hours ago         Up 54 minutes                           modest_hellman

rm 명령어

주요 옵션

  • --force, -f : 실행중인 컨테이너를 강제로 삭제
  • --volume, -v: 할당한 볼륨을 삭제

정지중인 모든 컨테이너 삭제

pause/unpause 명령어

잠깐! 그럼 stop과 pause의 차이는?

컨테이너에서 프로세스(pause)를 모두 중단 VS 컨테이너 그 자체를 중지(stop)

profile
어제보다 오늘 그리고 오늘 보다 내일...

1개의 댓글

comment-user-thumbnail
2022년 12월 11일

안녕하세요 운영자님
인카토스입니다.
먼저, 댓글로 인사를 드리게 된 점 양해 부탁 드립니다.
이렇게 연락 드린 이유는 이번에 저희가 제작한 도커 각티슈케이스 제품 협찬을 제안드리고 싶어서 연락 드렸습니다.
개발자들에게 많은 사랑은 받은 각티슈케이스입니다.
저희 상품 블로그 포스팅이 가능하실지 여쭙고자 연락드렸습니다.
포스팅이 어려우시다면 도커 글 하단에 이미지와 링크만 좀 달아주셔도 좋을거같습니다.

연락드릴수 있는방법이 댓글밖에 보이지 않아 이렇게 먼저 연락드립니다.

협찬제안에 긍정적인 검토 부탁드리고 제안이 마음에 드신다면 하기 메일로 메일주시면 제품 보내드리도록 하겠습니다.

sungjh0726@naver.com

감사합니다.
인카토스 드림.

답글 달기