docker container create

docker container create

docker container create는 새 컨테이너를 만드는 명령이에요. 시작하지 않고 컨테이너만 준비해 두고 싶을 때 사용해요.

출처: 문서

본문

docker create 명령은 옵션 대부분을 docker run 명령과 공유해요. 사용 가능한 플래그와 옵션의 상세는 docker run CLI reference를 참고해요.

docker container create(줄여서 docker create)는 지정한 이미지에서 새 컨테이너를 만들지만 시작하지는 않아요. Docker 데몬이 이미지 위에 쓰기 가능한 컨테이너 레이어를 만들고 지정한 명령을 실행할 준비를 하며, 컨테이너 ID를 STDOUT으로 출력해요. docker run -d와 비슷하지만 컨테이너를 시작하지 않는다는 점이 달라요. 나중에 docker container start(또는 docker start)로 컨테이너를 시작할 수 있어요.

컨테이너를 필요할 때 바로 시작할 수 있게 미리 구성해 두고 싶을 때 유용해요. 새 컨테이너의 초기 상태는 created예요.

The docker create command shares most of its options with the docker run command.

지원하는 옵션은 다음과 같아요.

옵션 기본값 설명
--add-host 커스텀 host-to-IP 매핑을 추가해요 (host:ip)
--annotation 컨테이너에 주석(annotation)을 추가해요 (OCI 런타임으로 전달돼요)
-a, --attach STDIN·STDOUT·STDERR에 연결해요
--blkio-weight 블록 IO(상대 가중치)를 정해요. 10~1000 사이, 0이면 비활성화 (기본 0)
--blkio-weight-device 블록 IO 가중치(상대 디바이스 가중치)를 정해요
--cap-add Linux 역량(capability)을 추가해요
--cap-drop Linux 역량을 빼요
--cgroup-parent 컨테이너의 상위 cgroup을 정해요
--cgroupns 사용할 cgroup 네임스페이스를 정해요 (host
--cidfile 컨테이너 ID를 파일에 써요
--cpu-count CPU 개수를 정해요 (Windows 전용)
--cpu-percent CPU 비율을 정해요 (Windows 전용)
--cpu-period CPU CFS(Completely Fair Scheduler) 주기를 제한해요
--cpu-quota CPU CFS 할당량을 제한해요
--cpu-rt-period CPU 실시간 주기를 마이크로초로 제한해요
--cpu-rt-runtime CPU 실시간 런타임을 마이크로초로 제한해요
-c, --cpu-shares CPU 공유(상대 가중치)를 정해요
--cpus CPU 개수를 정해요
--cpuset-cpus 실행을 허용할 CPU를 정해요 (0-3, 0,1)
--cpuset-mems 실행을 허용할 MEM을 정해요 (0-3, 0,1)
--device 컨테이너에 호스트 디바이스를 추가해요
--device-cgroup-rule cgroup 허용 디바이스 목록에 규칙을 추가해요
--device-read-bps 디바이스의 읽기 속도를 제한해요 (초당 바이트)
--device-read-iops 디바이스의 읽기 속도를 제한해요 (초당 IO)
--device-write-bps 디바이스의 쓰기 속도를 제한해요 (초당 바이트)
--device-write-iops 디바이스의 쓰기 속도를 제한해요 (초당 IO)
--dns 커스텀 DNS 서버를 설정해요
--dns-option DNS 옵션을 설정해요
--dns-search 커스텀 DNS 검색 도메인을 설정해요
--domainname 컨테이너 NIS 도메인 이름을 설정해요
--entrypoint 이미지의 기본 ENTRYPOINT를 덮어써요
-e, --env 환경 변수를 설정해요
--env-file 환경 변수 파일을 읽어요
--expose 포트 또는 포트 범위를 노출해요
--gpus 컨테이너에 추가할 GPU 디바이스를 정해요 ('all'이면 모든 GPU 전달)
--group-add 추가로 포함할 그룹을 더해요
--health-cmd 헬스 체크를 실행할 명령을 정해요
--health-interval 체크를 실행할 간격을 정해요 (ms
--health-retries 비정상으로 판정할 연속 실패 횟수를 정해요
--health-start-interval 시작 구간에 체크를 실행할 간격을 정해요 (ms
--health-start-period 헬스 재시도 카운트다운 전 컨테이너 초기화 시간을 정해요 (ms
--health-timeout 체크 하나에 허용할 최대 시간을 정해요 (ms
--help 사용법을 출력해요
-h, --hostname 컨테이너 호스트 이름을 정해요
--init 컨테이너 안에서 신호를 전달하고 프로세스를 정리하는 init을 실행해요
-i, --interactive STDIN을 유지해요
--io-maxbandwidth 시스템 드라이브의 최대 IO 대역폭을 제한해요 (Windows 전용)
--io-maxiops 시스템 드라이브의 최대 IOps를 제한해요 (Windows 전용)
--ip <nil> IPv4 주소를 정해요 (예: 172.30.100.104)
--ip6 <nil> IPv6 주소를 정해요 (예: 2001:db8::33)
--ipc 사용할 IPC 모드를 정해요
--isolation 컨테이너 격리 기술을 정해요
-l, --label 컨테이너에 메타데이터를 설정해요
--label-file 줄 단위 라벨 파일을 읽어요
--link 다른 컨테이너에 링크를 추가해요
--link-local-ip 컨테이너 IPv4/IPv6 link-local 주소를 정해요
--log-driver 컨테이너의 로깅 드라이버를 정해요
--log-opt 로그 드라이버 옵션을 정해요
--mac-address 컨테이너 MAC 주소를 정해요 (예: 92:d0:c6:0a:29:33)
-m, --memory 메모리 제한을 정해요
--memory-reservation 메모리 소프트 제한을 정해요
--memory-swap 메모리와 스왑의 합과 같은 스왑 제한: '-1'이면 무제한 스왑
--memory-swappiness -1 컨테이너 메모리 스와피니스를 조정해요 (0~100)
--mount 컨테이너에 파일시스템 마운트를 추가해요
--name 컨테이너에 이름을 지정해요
--network 컨테이너를 네트워크에 연결해요
--network-alias 컨테이너에 네트워크 범위 별칭을 추가해요
--no-healthcheck 컨테이너가 지정한 HEALTHCHECK를 비활성화해요
--oom-kill-disable OOM Killer를 비활성화해요
--oom-score-adj 호스트 OOM 선호도를 조정해요 (-1000~1000)
--pid 사용할 PID 네임스페이스를 정해요
--pids-limit 컨테이너 pids 제한을 조정해요 (무제한은 -1)
--platform 서버가 멀티플랫폼을 지원하면 플랫폼을 설정해요
--privileged 컨테이너에 확장 권한을 부여해요
-p, --publish 컨테이너의 포트를 호스트에 게시해요
-P, --publish-all 노출된 모든 포트를 임의 포트로 게시해요
--pull missing 생성 전에 이미지를 가져올지 정해요 (always, missing, never)
-q, --quiet 구성만 검증하고 아무것도 출력하지 않아요
--read-only 컨테이너 루트 파일시스템을 읽기 전용으로 마운트해요
--restart no 컨테이너 종료 시 적용할 재시작 정책을 정해요
--rm 종료 시 컨테이너와 익명 볼륨을 자동으로 제거해요
--runtime 컨테이너에 사용할 런타임을 정해요
--security-opt 보안 옵션을 정해요
--shm-size /dev/shm 크기를 정해요
--stop-signal 컨테이너를 멈추는 신호를 정해요
--stop-timeout 컨테이너를 멈추는 타임아웃(초)을 정해요
--storage-opt 컨테이너의 스토리지 드라이버 옵션을 정해요
--sysctl sysctl 옵션을 정해요
--tmpfs tmpfs 디렉터리를 마운트해요
-t, --tty 의사-TTY를 할당해요
--ulimit ulimit 옵션을 정해요
--umask <nil> 컨테이너의 umask를 설정해요
--use-api-socket experimental (CLI) Docker API 소켓과 필요한 인증을 바인드 마운트해요
-u, --user 사용자 이름 또는 UID를 정해요
--userns 사용할 사용자 네임스페이스를 정해요
--uts 사용할 UTS 네임스페이스를 정해요
-v, --volume 볼륨을 바인드 마운트해요
--volume-driver 볼륨 드라이버를 정해요
--volumes-from 지정한 컨테이너에서 볼륨을 마운트해요
-w, --workdir 컨테이너 안 작업 디렉터리를 정해요

Create and start a container

다음 예제는 의사-TTY가 연결된 대화형 컨테이너를 만들고, 시작한 뒤 연결해요.

$ docker container create -i -t --name mycontainer alpine
6d8af538ec541dd581ebc2a24153a28329acb5268abe5ef868c1f1a261221752

$ docker container start --attach -i mycontainer
/ # echo hello world
hello world

위는 docker run과 동등해요.

$ docker run -it --name mycontainer2 alpine
/ # echo hello world
hello world

Initialize volumes

컨테이너 볼륨은 docker create 단계(즉 docker run도 마찬가지)에서 초기화돼요. 예를 들어 data 볼륨 컨테이너를 create한 뒤 다른 컨테이너에서 사용할 수 있어요.

$ docker create -v /data --name data ubuntu

240633dfbb98128fa77473d3d9018f6123b99c454b3251427ae190a7d951ad57

$ docker run --rm --volumes-from data ubuntu ls -la /data

total 8
drwxr-xr-x  2 root root 4096 Dec  5 04:10 .
drwxr-xr-x 48 root root 4096 Dec  5 04:11 ..

마찬가지로 호스트 디렉터리를 바인드 마운트한 볼륨 컨테이너를 create하고, 이후 컨테이너에서 사용할 수도 있어요.

$ docker create -v /home/docker:/docker --name docker ubuntu

더 알아보기