Docker CLI 명령 정리

2023년 6월 22일 수정

이 글은 DockerCLI로 다룰 때 사용하는 명령어를 일부 정리한다.

imges: 이미지 리스트

현재 로컬에 다운로드 받거나 생성한 이미지 리스트를 볼 수 있다.

docker images

pull: 이미지 다운로드

이미지를 다운로드 받는다. 로컬에서 돌리려면 반드시 필요한 과정이다.

docker pull IMAGE_NAME[:TAG]

하지만 이 명령 없이도 다른 명령으로 필요할 때 자동으로 이미지를 다운로드를 받기 때문에 이 명령을 수동으로 사용할 일이 과연 얼마나 있을지는 잘 모르겠다.

build: 이미지 만들기

현재 디렉터리에 있는 Dockerfile 을 이용해 이미지를 빌드한다.

docker build .

마지막의 . 은 빌드하는 디렉터리가 현재 디렉터리임을 의미한다. 즉 현재 디렉터리에 있는 자원을 이용한다는 의미다.

별도로 태그를 붙이거나 이름을 짓고 싶다면 -t 옵션을 붙일 수 있다.

docker build -t myimage .

이미지 스펙 파일은 Dockerfile 이라는 이름을 써야하지만 물론 마음대로 이름을 지을 수도 있다. 대신 이름을 마음대로 지었다면 -f 옵션으로 이름을 알려주어야 한다.

docker build -f /foo/bar/some/docker-file-name .

옵션 순서에 주의하자.

run: 컨테이너 실행시키기

이미지를 실행시켜서 컨테이너를 띄운다.

docker run IMAGE_NAME

정확하게 말해서 run 명령은 createstart 명령이 결합된 형태이지만, 아무래도 이렇게 나눠서 쓰기 보다는 그냥 run 커맨드가 편한 것 같다.

백그라운드 잡으로 돌리기 위해 -d 옵션을 줄 수 있다.

docker run -d IMAGE_NAME

이 외에 실행 시에 엄청난 옵션을 다룰 일이 많다. 특히 개발 단계에서는 아래와 같은 옵션들을 쓸 수도 있다.

docker run \
    --rm \
    -it \
    --name "container-name"
    --net NETWORK_NAME \
    -p 8000:8000 \
    -v /foo/bar:/tmp/foo/bar \
    -e ENV_NAME="value" \
    IMAGE_NAME:TAG_NAME
--rm
컨테이너가 종료되면 자동으로 컨테이너를 삭제한다.
-it
-i-t 옵션을 한 번에 적은 것으로 커맨드를 터미널 인터랙티브로 실행시킨다. 을 띄우려면 필수다.
--name NAME
컨테이너 이름을 지을 수 있다.
--net NETWORK
네트워크를 별도로 선택할 수 있다.
-p HOST:CONTAINER
호스트 포트와 컨테이너 내부 포트를 연결한다.
-v HOST:CONTAINER
호스트 파일 시스템과 컨테이너 내부 파일 시스템을 연결한다.
-e NAME=VALUE
환경변수를 전달한다.

exec: 컨테이너에서 명령 실행

run 이 컨테이너를 띄우는 것이라면 exec 는 이미 떠있는 컨테이너에 명령을 내릴 때 사용한다.

docker exec -it CONTAINER COMMAND
-it
동일하게 터미널에서 명령을 입력하고 결과를 보기 위해선 필수다.
CONTAINER
컨테이너 ID를 쓸 수도 있고, 만약 이름을 별도로 지었다면 그 이름도 쓸 수 있다.
COMMAND
컨테이너에서 실행시킬 명령을 적는 곳인데, 자체를 실행시키는 명령을 적을 수도 있고 CLI 커맨드를 그대로 적어서 컨테이너에서 실행시킬 수 있다.

log: 로그 보기

-d 옵션 없이 포그라운드로 돌렸다면 바로 터미널에서 로그가 보이겠지만 그렇지 않고 백그라운드 잡으로 돌려놓은 상태라면 로그를 보기위해 이 명령을 사용할 수 있다.

docker logs -f CONTAINER

-f 옵션은 tail 의 그것과 비슷하게 업데이트되는 것을 지속적으로 볼 수 있는 옵션이다. 나머지 컨테이너는 ID나 혹은 이름을 넣을 수도 있다.

ps: 컨테이너 상태 보기

아래 명령은 실행 중인 컨테이너 목록을 보여준다.

docker ps

추가로 여기에 아래 옵션을 더 쓸 수도 있다.

-a
실행 중이던 아니던 모든 컨테이너 리스트를 조회
-q
주변의 꾸미는 내용은 다 생략하고 컨테이너 고유 번호 만을 출력한다. 스크립팅 시 다른 커맨드에 인자로 넘겨야 할 때 유용하다.

stop: 컨테이너 종료

docker stop CONTAINER

종료만 하지 삭제하지는 않는다.

kill: 컨테이너 강제 종료

docker kill CONTAINER

이름처럼 좀 세게(?) 죽인다.

만약 모든 컨테이너를 kill 하고 싶다면 아래처럼 스크립팅 할 수 있다.

docker kill $(docker ps -q)

rm: 컨테이너 삭제

docker rm CONTAINER

컨테이너 목록에서 해당 중지된 컨테이너를 삭제한다. create 명령의 상반된 용도다.

만약 모든 컨테이너를 삭제하고 싶다면 아래와 같이 스크립팅 할 수 있다.

docker rm $(docker ps -a -q)

network: 커스텀 네트워크

이 명령은 별도의 네트워크를 관리하고 싶을 때 사용한다.

ls 명령으로 현재 네트워크 목록을 만들 수 있다.

docker network ls

create 명령으로 별도의 네트워크를 생성할 수 있다.

docker network create NAME

rm 명령으로 생성한 네트워크를 삭제할 수 있다.

docker network rm NAME

rm 대신 prune 으로 모든 커스텀 네트워크를 삭제할 수 있다. 기본 네트워크는 삭제되지 않으니 걱정없이 사용할 수 있다.

docker network prune

rmi: 이미지 삭제하기

자주 쓸 일은 없지만 rmi 명령으로 다운로드 받은 이미지를 삭제할 수 있다. 주로 시스템 공간을 비울 때 사용된다.

docker rmi IMAGE_NAME

history: 도커 이미지 업데이트 내역

제목대로 이미지의 히스토리를 볼 수 있다.

docker history IMAGE_NAME