도커 컨테이너 실행하기

도커 컨테이너 실행하기 (docker container run)

이미지를 만들었다면 이제 그 이미지로 실제 컨테이너를 띄워야 해요. 컨테이너를 만들고 바로 실행하는 명령이 docker container run(줄여서 docker run)이에요. 단순히 실행하는 것뿐 아니라, 포트·볼륨·환경변수·네트워크 같은 것을 이 명령의 옵션으로 지정할 수 있죠.

docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] 형태로 쓰고, 이름 있는 볼륨과 환경변수부터 시작해 옵션을 하나씩 더해 나가면 익히기 쉬워요. 첫 실행이지만 자주 쓰는 옵션 위주로 정리해 볼게요.

출처: docker container run — Docker Docs

기본 사용법

docker run은 이미지에서 새 컨테이너를 만들고 실행해요. 이미지는 필수고, 그 뒤에 컨테이너 안에서 실행할 명령을 선택적으로 붙일 수 있어요.

$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

주요 옵션

| 옵션 | 기본값 | 설명 | | --add-host | | host:ip 형태의 커스텀 host-to-IP 매핑을 추가해요. | | -a, --attach | | STDIN·STDOUT·STDERR에 붙습니다. | | --cidfile | | 컨테이너 ID를 파일에 기록해요. | | --env-file | | 환경변수가 적힌 파일을 읽어요. | | --label-file | | 줄 단위 구분 라벨 파일을 읽어요. | | --platform | | 서버가 멀티 플랫폼을 지원한다면 플랫폼을 지정해요. |

볼륨 마운트 (-v)

도커 엔진 23부터 호스트의 상대 경로도 쓸 수 있어요. 다음 예시는 현재 디렉토리의 content를 컨테이너의 /content에 마운트하고, 그 경로를 작업 디렉토리로 잡은 뒤 컨테이너 안에서 pwd를 실행해요.

$ docker run -v ./content:/content -w /content -i -t ubuntu pwd

없는 경로를 마운트하려 하면? 예를 들어 호스트에 없는 /doesnt/exist를 마운트하면 도커는 그 디렉토리를 만들어 버려요.

$ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash

읽기 전용 볼륨 (--read-only)

--read-only 플래그는 컨테이너 루트 파일시스템을 읽기 전용으로 마운트해서, 지정한 볼륨 외의 위치에 쓰는 것을 막아요. 볼륨과 함께 쓰면 컨테이너가 어디에 파일을 쓸 수 있는지 통제할 수 있죠.

Windows 호스트에서는 경로 형태가 조금 달라요.

net use z: \\remotemachine\share
docker run -v z:\foo:c:\dest ...
docker run -v \\uncpath\to\directory:c:\dest ...
docker run -v c:\foo\somefile.txt:c:\dest ...
docker run -v c:\foo:c: ...
docker run -v c:\foo:c:\existing-directory-with-contents ...

노출된 모든 포트 공개 (-P)

-P(--publish-all)는 Dockerfile의 EXPOSE 지시어나 docker run--expose 플래그로 명시적으로 노출 표시된 포트만 호스트에 공개해요. 이미지가 어떤 포트를 열어 두는지 그대로 호스트로 펴 보여주는 옵션이죠.

환경변수 설정 (-e, --env, --env-file)

-e·--env·--env-file 플래그로 컨테이너 안의 단순(배열이 아닌) 환경변수를 설정하거나, 이미지의 Dockerfile에 정의된 변수를 덮어쓸 수 있어요. docker run 시점에 변수와 값을 함께 지정하면 돼요.

$ docker run -e MYVAR=hello -e ANOTHER=world myimage

컨테이너를 네트워크에 연결 (--network)

여러 컨테이너를 같은 네트워크에 연결하면, 각 컨테이너는 상대방의 IP 주소나 이름만으로 통신할 수 있어요. overlay 네트워크나 멀티호스트를 지원하는 커스텀 플러그인이라면 호스트 밖을 가로질러 통신할 수도 있어요.

다른 컨테이너의 볼륨 공유 (--volumes-from)

--volumes-from은 참조 컨테이너의 볼륨을 읽기 전용·읽기 쓰기 모드로 마운트해요. 기본적으로 참조 컨테이너와 같은 모드(읽기 쓰기 또는 읽기 전용)로 마운트돼요. 결과적으로 도커는 그 내용에 공유 콘텐츠 라벨을 붙여, 모든 컨테이너가 읽고 쓸 수 있게 해요. Z 옵션은 비공유 라벨을 붙여 현재 컨테이너만 쓸 수 있게 해요.

임시 컨테이너 정리 (--rm)

짧게 돌다 끝나는 포그라운드 프로세스라면 컨테이너 파일시스템이 계속 쌓일 수 있어요. 컨테이너가 종료될 때 자동으로 정리하고 싶다면 --rm 플래그를 써요.

호스트 파일에 항목 추가 (--add-host)

--add-host는 컨테이너의 hosts 파일에 항목을 추가해요. 호스트의 HTTP 서버에 접근하는 예시를 볼게요.

$ echo "hello from host!" > ./hello
$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
$ docker run \
  --add-host host.docker.internal=host-gateway \
  curlimages/curl -s host.docker.internal:8000/hello
hello from host!

--add-host: 구분자도 받아요.

$ docker run --add-host=my-hostname:8.8.8.8 --rm -it alpine

더 알아보기