Docker를 사용하면서 가장 자주 접하는 커맨드는 단연 컨테이너를 실행하기 위해서 쓰이는 docker run일 것이다
docker run 커맨드는 상당히 여러가지 옵션을 통해 다양한 방식으로 컨테이너를 실행할 수 있도록 해준다
이중에서 자주 쓰이는 옵션 위주로 dockr run 커맨드를 어떻게 사용하는지 알아보자
$ docker run (<옵션>) <이미지 식별자> (<명령어>) (<인자>)
여기서 이미지 식별자는 필수이며 이미지 ID나 리파지토리(repository):태그(tag)를 사용할 수 있다
많은 경우 컨테이너를 백그라운드에서 실행해야 하는데, 이 때는 -d 옵션
을 사용하면 된다
-d 옵션을 사용하면 컨테이너가 detached 모드에서 실행되며, 실행 결과로 컨테이너 ID만을 출력한다
예를 들어, python:3.8-alpine 이미지로 부터 python -m http.server 명령어를 백그라운드로 실행해보자
$ docker run -d python:3.8-alpine python -m http.server
0b920d2f561437418b8fdc0e9bcfdd4c9d634983ded18ba35a4dbae012753a72
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e4fe552200f python:3.8-alpine "python -m http.serv…" 5 seconds ago Up 4 seconds gifted_chaplygin
docker ps 커맨드를 날려보니, 방금 백그라운드로 실행한 컨테이너가 보인다
이 명령어를 -d 옵션없이 실행했다면, 해당 터미널에서 Ctrl + C를 눌러서 빠져나오는 순간 해당 컨테이너는 종료된다
$ docker run python:3.8-alpine python -m http.server
^CServing HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Keyboard interrupt received, exiting.
$
-i
옵션과 -t
옵션은 같이 쓰이는 경우가 매우 많은데, 이 두 옵션은 컨테이너를 종료하지 않은체로, 터미널의 입력을 계속해서 컨테이너로 전달하기 위해서 사용한다
따라서, -it
옵션은 특히 컨테이너의 쉘(shell)이나 CLI 도구를 사용할 때 매우 유용하게 사용된다
--rm
옵션은 컨테이너를 일회성으로 실행할 때 주로 쓰이는데, 컨테이너가 종료될 때 컨테이너와 관련된 리소스(파일 시스템, 볼륨)까지 깨끗이 제거해준다
Docker 컨테이너를 제어할 때 컨테이너 ID를 사용하면 읽거나 기억하기가 어려워서 불편하게 느껴진다
이럴 경우, --name 옵션을 사용해서 컨테이너에 이름을 부여해주면 해당 이름으로 컨테이너를 식별할 수 있다
아래 예제에서는 my-server라는 이름으로 컨테이너를 실행한 후에, docker kill 커맨드로 해당 컨테이너를 종료하거나, docker rm 커맨드로 해당 컨테이너를 삭제할 때 컨테이너 이름을 컨테이너 ID 대신에 사용하고 있다
-p 옵션은 호스트와 컨테이너 간의 포트(port) 배포(publish)/바인드(bind)를 위해서 사용된다
호스트(host) 컴퓨터에서 컨테이너에서 리스닝하고 있는 포트로 접속할 수 있도록 설정해준다
아래 커맨드는 컨테이너 내부에서 80 포트로 리스닝하고 있는 HTTP 서버를 호스트 컴퓨터에서 818 포트로 접속할 수 있도록 해준다
818포트가 로컬호스트의 포트이고, 80번은 컨테이너의 포트
docker container run --name 컨테이너_이름 -p 818:80 httpd
Docker 컨테이너의 환경변수를 설정하기 위해서는 -e 옵션을 사용한다
또한, -e 옵션을 사용하면 Dockerfile의 ENV 설정도 덮어써지게 된다
-v 옵션은 호스트와 컨테이너 간의 볼륨(volumn) 설정을 위해서 사용된다
호스트(host) 컴퓨터의 파일 시스템의 특정 경로를 컨테이너의 파일 시스템의 특정 경로로 마운트(mount)를 해준다
-w 옵션은 Dockerfile의 WORKDIR 설정을 덮어쓰기 위해서 사용된다
--entrypoint 옵션은 Dockerfile의 ENTRYPOINT 설정을 덮어쓰기 위해서 사용한다
예를 들어, python:3.8-alpine 이미지로 부터 python --version을 실행하고 싶다면 다음과 같이 커맨드를 실행하면 된다
docker cp [host 파일경로] [container name]:[container 내부 경로]
ex
docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/
docker cp [container name]:[container 내부 경로] [host 파일경로]
docker container commit <컨테이너_이름> <REPOSITORY:TAG>
docker container commit 컨테이너_이름 my_pacman:1.0
Dockerfile을 작성했으면 docker build 명령어로 이미지를 생성할 수 있다
--tag(또는 -t) 옵션은 새로 생성할 이미지 이름을 지정한다
리포지토리 이름을 지정하고,태그를 지정한다
마지막에 점(.)은 Dockerfile의 위치를 경로를 지정한다
파일 이름이 Dockerfile이 아닌 경우 --file(또는 -f) 옵션을 사용해서 파일 이름을 지정한다