이 글을 읽는 사람은 먼저 Container 정리부터 정리하고 읽는 것을 추천한다.
Docker는 컨테이너 기반의 애플리케이션 개발, 배포, 실행을 자동화하는 오픈소스로 대부분의 기업들에서 컨테이너 관련 기술로 채택하는 기술이다.
1. Docker 개념
Docker Image
- 컨테이너를 실행하기 위한 읽기 전용 템플릿
- 애플리케이션과 실행 환경 (라이브러리, 의존성) 포함
- 이미지 빌드를 위해서는
Dockerfile스크립트 파일이 필요: 단계별로 애플리케이션 설치 및 환경 설정 정의
Docker Container
- 이미지에서 생성된 실행 가능한 인스턴스
- 애플리케이션과 환경이 실행되는 독립적인 단위
Docker Registry
- 이미지 저장소 (ex. Docker Hub, AWS ECR, GCP Container Registry 등 포함)
2. Docker 명령어 정리
1) Docker 설치 확인
- version 확인:
docker --version$ docker --version Docker version 20.10.23, build 7155243
- info 확인:
docker info$ docker info Client: Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc., v0.10.3) compose: Docker Compose (Docker Inc., v2.15.1) dev: Docker Dev Environments (Docker Inc., v0.1.0) extension: Manages Docker extensions (Docker Inc., v0.2.18) sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0) scan: Docker Scan (Docker Inc., v0.25.0) scout: Command line tool for Docker Scout (Docker Inc., v0.6.0) Server: Containers: 4 Running: 0 Paused: 0 Stopped: 4 Images: 14 Server Version: 20.10.23 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: cgroupfs Cgroup Version: 2 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc Default Runtime: runc Init Binary: docker-init containerd version: 2456e983eb9e37e47538f59ea18f2043c9a73640 runc version: v1.1.4-0-g5fd4c4d init version: de40ad0 Security Options: seccomp Profile: default cgroupns Kernel Version: 5.15.49-linuxkit Operating System: Docker Desktop OSType: linux Architecture: aarch64 CPUs: 4 Total Memory: 7.668GiB Name: docker-desktop ID: 276G:OJLG:WHVN:JV37:CX4G:VAC2:K2AY:TJPC:M2RA:D5NR:DWTP:HU2G Docker Root Dir: /var/lib/docker Debug Mode: false HTTP Proxy: http.docker.internal:3128 HTTPS Proxy: http.docker.internal:3128 No Proxy: hubproxy.docker.internal Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: hubproxy.docker.internal:5000 127.0.0.0/8 Live Restore Enabled: false
2) Docker 이미지 관리
- Docker Hub에서 이미지 검색:
docker search <이미지명>
$ docker search test
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
immcantation/test Immcantation unit test image 1
pachyderm/test 0
islandora/test This image is exclusively used for manually … 0
okteto/test 0
amir20/test 0
kubeovn/test 0
voxpupuli/test Container repo to test container build and V… 0
corpusops/test 0
ratelimitpreview/test 0
test/testimage20130921141042 0
test/testimage20130919235830 0
test/testimage20130921221004 0
test/testimage20130919223925 0
test/testimage20130921190956 0
test/testimage20130922032014 0
doct15/test 0
flypenguin/test A test container for ... k8s :) 0 [OK]
brimworks/test 0
flvranckx/test test 0
chiphwang/test 0
divyag2411/test 0
realmaccess/test 0
devopsatburst/test 0
hopar/test test descr 0
femycatherine/test test 0
- 특정 이미지를 로컬로 다운로드:
docker pull <이미지명>:<태그>
$ docker pull nginx:latest
latest: Pulling from library/nginx
Digest: sha256:bc5eac5eafc581aeda3008b4b1f07ebba230de2f27d47767129a6a905c84f470
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest
- 로컬에 저장된 이미지 나열:
docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
django-app latest cbb6dff7c55a 2 days ago 2.12GB
postgres 15-alpine c558f49f952d 3 days ago 256MB
python 3.12-slim e359a8be29f6 5 weeks ago 150MB
redis alpine 4a6fa001a1b0 7 weeks ago 48.3MB
nginx latest 7a3f95c07812 7 weeks ago 197MB
- 로컬에 저장된 이미지 삭제: `docker rmi <이미지ID>
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python latest 62639b6c3f3e 5 weeks ago 1.02GB
$ docker rmi 626 # 전부 다 안써도 특정 이미지인지 인지할 수 있으면 됨
Untagged: python:latest
Untagged: python@sha256:bc78d3c007f86dbb87d711b8b082d9d564b8025487e780d24ccb8581d83ef8b0
Deleted: sha256:62639b6c3f3e77ebbbf3f18802d08351636f8dd6e0a94d1b225e9f5dc1c88044
Deleted: sha256:476e07a0f38bafed4e474712d0e3d37dbcb7ff90d06e17bb8d1fc4b2f14e7d35
Deleted: sha256:2c190c9407be9104a7d2b741a4d91364bf2be04b81784dddaf13c9f188562e4d
Deleted: sha256:e00fefe3633c24a34f09149c5f3dbc2330630a365ffedff052f988c3585a1ee2
Deleted: sha256:c6d7f5d3800ca99cabcb02e8b21872f3a09cebe3973f5c98ebb3840435e0fd0f
Deleted: sha256:d4a8223e1c6c5461929b8b25b9bdb78d194803d9ca62f94f43df43d8e4b17e47
Deleted: sha256:a354dc33fe33b2600cf4fb75dd3ad14d4e0eecb77da53b75d7aefa7487e3bd17
Deleted: sha256:ec8ae7dad7aba50e0f8bff1dc969d34d3584fb7ada6ce9948dad83e95939b5cc
3) Docker 컨테이너 관리
- 컨테이너 실행:
docker run <컨테이너명> -p <호스트포트>:<컨테이너포트> <이미지명> <option: 컨테이너 내부 명령어>-d: 백그라운드 실행--name <컨테이너명>: 컨테이너 이름 설정-p <호스트포트>:<컨테이너포트>: 포트 매핑-e <변수=값>: 환경변수
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python latest 62639b6c3f3e 5 weeks ago 1.02GB
python 3.12-slim e359a8be29f6 5 weeks ago 150MB
# my-python이라는 컨테이너명으로
# 컨테이너 포트가 56인걸 호스트포트 1234로 연결
# 이미지명은 python이며, 백그라운드에서 실행
$ docker run -d --name my-python -p 1234:56 python
b7711eb537add805b8628277d4c677dd3d91e009d3b64bbac81e60fa84f53928
# 환경변수가 Foo를 설정하고 값을 bar로 설정
# 컨테이너 실행 이미지는 python:3.12-slim
# 컨테이너 내부 실행 명령어는 env (컨테이너 내부의 모든 환경변수 출력하는 unix 명령어)
$ docker run -e FOO=bar python:3.12-slim env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=b20562c470be
FOO=bar
LANG=C.UTF-8
GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305
PYTHON_VERSION=3.12.7
PYTHON_SHA256=24887b92e2afd4a2ac602419ad4b596372f67ac9b077190f459aba390faf5550
HOME=/root
- 실행 중인 컨테이너 확인:
docker ps
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
django-app latest cbb6dff7c55a 2 days ago 2.12GB
$ docker run -d django-app:latest
275bdef89cc40711dad78833d7b5aeb27f75b4e423bea1279564a99dece45178
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
275bdef89cc4 django-app:latest "/bin/bash -c 'sourc…" 3 seconds ago Up 2 seconds 8000/tcp relaxed_euclid
- 모든 컨테이너 확인 (중단된 컨테이너 포함):
docker ps -a
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
275bdef89cc4 django-app:latest "/bin/bash -c 'sourc…" About a minute ago Up About a minute 8000/tcp relaxed_euclid
f6d665ae418b python:3.12-slim "python3" 2 minutes ago Exited (0) 2 minutes ago intelligent_easley
7c72d2379677 python:3.12-slim "-d" 2 minutes ago
- 컨테이너 내부 접속: `docker exec -it <컨테이너ID> /bin/bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
275bdef89cc4 django-app:latest "/bin/bash -c 'sourc…" 7 minutes ago Up 7 minutes 8000/tcp relaxed_euclid
$ docker exec -it 275bdef89cc4 /bin/bash
$ root@275bdef89cc4:/app#
- 실행 중인 컨테이너 중지:
docker stop <컨테이너ID>
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
275bdef89cc4 django-app:latest "/bin/bash -c 'sourc…" 8 minutes ago Up 8 minutes 8000/tcp relaxed_euclid
$ docker stop 275bdef89cc4
275bdef89cc4
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$
- 중단된 컨테이너 시작:
docker start <컨테이너ID>
$ docker ps # 실행 중인 컨테이너 없음
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a # 중단된 컨테이너를 확인해봄
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
275bdef89cc4 django-app:latest "/bin/bash -c 'sourc…" 10 minutes ago Exited (0) 2 minutes ago relaxed_euclid
$ docker start 275bdef89cc4 # 최근에 중단된거 재시작
275bdef89cc4
$ $docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
275bdef89cc4 django-app:latest "/bin/bash -c 'sourc…" 11 minutes ago Up 3 seconds 8000/tcp relaxed_euclid
- 중단된 컨테이너 삭제:
docker rm <컨테이너ID>
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
275bdef89cc4 django-app:latest "/bin/bash -c 'sourc…" 15 minutes ago Exited (0) 4 minutes ago relaxed_euclid
f6d665ae418b python:3.12-slim "python3" 17 minutes ago Exited (0) 17 minutes ago intelligent_easley
7c72d2379677 python:3.12-slim "-d" 17 minutes ago Created adoring_jang
$ docker rm 27 # ID를 전부 다 쓰지 않아도, 해당 이미지를 찾을 수 있을 만큼만 작성해도 알아서 찾아서 종료함. 여러개 연속으로 쓰면 모두 타겟 잡아서 종료
27
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f6d665ae418b python:3.12-slim "python3" 17 minutes ago Exited (0) 17 minutes ago intelligent_easley
7c72d2379677 python:3.12-slim "-d" 17 minutes ago Created adoring_jang
4) Docker 컨테이너 로그 확인
- 컨테이너 실행 로그 출력:
docker logs <컨테이너ID>
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
django-app latest cbb6dff7c55a 2 days ago 2.12GB
$ docker run -d django-app
bdb4eb9c03161d8427278f3cfa5e96505d52d0aa76064ad0145ee88506cdbd5b
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bdb4eb9c0316 django-app "/bin/bash -c 'sourc…" 5 seconds ago Up 4 seconds 8000/tcp awesome_mccarthy
$ docker logs bdb4
Applying database migrations...
Collecting static files...
168 static files copied to '/app/src/static'.
Starting Gunicorn...
[2024-11-11 17:32:11 +0000] [1] [INFO] Starting gunicorn 23.0.0
[2024-11-11 17:32:11 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2024-11-11 17:32:11 +0000] [1] [INFO] Using worker: sync
[2024-11-11 17:32:11 +0000] [609] [INFO] Booting worker with pid: 609
5) Docker 네트워크 관리
- 네트워크 생성:
docker network create <네트워크명>
$ docker network create mynw
beb1bf647de5e6a2ea2debcd45a095b2c94b217a0c645e05ff33fd122ffdfe8a
- 컨테이너를 특정 네트워크에 연결:
docker run --name <컨테이너명> --network <네트워크명> <이미지명>
$ docker run -d django-app
b4aa6fefecb97198ea2f7824f43e7eeb62ec3f065722b84a2d34ff9e1f834708
$ docker run --name b4aa --network mynw
Applying database migrations...
Collecting static files...
168 static files copied to '/app/src/static'.
Starting Gunicorn...
[2024-11-11 17:32:11 +0000] [1] [INFO] Starting gunicorn 23.0.0
[2024-11-11 17:32:11 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2024-11-11 17:32:11 +0000] [1] [INFO] Using worker: sync
[2024-11-11 17:32:11 +0000] [609] [INFO] Booting worker with pid: 609
- Docker 네트워크 리스트 확인:
docker network ls
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
63d6218decce bridge bridge local
8207a8266c78 host host local
beb1bf647de5 mynw bridge local
5db98f6636e1 none null local
- 사용자 정의 네트워크 삭제:
docker network rm <네트워크명>
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
63d6218decce bridge bridge local
8207a8266c78 host host local
beb1bf647de5 mynw bridge local
5db98f6636e1 none null local
$ docker network rm mynw
mynw
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
63d6218decce bridge bridge local
8207a8266c78 host host local
5db98f6636e1 none null local
$ docker network rm bridge # 사전 정의된 것에 대해서는 오류 발생
Error response from daemon: bridge is a pre-defined network and cannot be removed
6) Docker Volume 관리
- 데이터를 저장할 볼륨 생성:
docker volume create <볼륨명>
$ docker volume create myvo
myvo
- 볼륨을 컨테이너에 마운트:
docker run -d --name <컨테이너명> -v <볼륨명>:<컨테이너경로> <이미지명>
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7a3f95c07812 7 weeks ago 197MB
$ docker run -d --name my-nginx -v myvo:/app/data nginx
007310e795a8096434dac9a75b83e238c0a698e36f660fe0e4552cf4b2d34df5
- 생성된 볼륨 리스트 확인:
docker volume ls
$ docker volume ls
docker volume ls
DRIVER VOLUME NAME
local back_media_volume
local back_postgres_data
local back_static_volume
local myvo
- 특정 볼륨 삭제:
docker volume rm <볼륨명>
$ docker volume ls
DRIVER VOLUME NAME
local back_media_volume
local back_postgres_data
local back_static_volume
local myvo
$ docker volume rm back_postgres_data
back_postgres_data
# 이미 볼륨이 컨테이너에 마운트 되어있으면 삭제 불가능
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
007310e795a8 nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 80/tcp my-nginx # 여기에 myvo가 마운트 되어있음
$ docker volume rm myvo
Error response from daemon: remove myvo: volume is in use - [007310e795a8096434dac9a75b83e238c0a698e36f660fe0e4552cf4b2d34df5]
7) Dockerfile로 이미지 빌드
docker build -t <이미지명>:<태그> <Dockerfile 경로>
$ docker build -t my-app:1.0 .
[+] Building 0.0s (2/2) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 2B 0.0s
=> [internal] load . dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha56:84b400a8fb9307f2ddc1dc29eef33c2bb664e2bdac75449d1f14e4cabaeb429 0.0s
=> => naming to docker.io/library/my-app 0.0s
# 플랫폼이 다를 경우에는 --platform 명령어를 사용할 것
$ docker build --platform linux/amd64,linux/arm64 -t my-app:1.0 .
8) Docker 레지스트리
- 이미지 태그 지정:
docker tag <이미지명>:<태그> <레지스트리URL>/<이미지명>:<태그>
docker tag my-app:1.0 my-registry-url/my-app:1.0
- 이미지 푸시:
docker push <레지스트리URL>/<이미지명>:<태그>
docker push my-registry-url/my-app:1.0
- 이미지 풀:
docker pull <레지스트리URL>/<이미지명>:<태그>
docker pull my-registry-ur/my-app:1.0
9) Docker Compose
- docker-compose.yaml 파일 기반으로 컨테이너 실행:
docker-compose up
docker-compose up
- 실행 중인 docker-compose 서비스를 종료하고 네트웤, 볼륨 제거:
docker-compose down
docker-compose down
10) 기타 유용한 명령어
# 컨테이너 상세정보 출력
docker inspect <컨테이너ID>
# 로컬 이미지 크기 확인
docker image ls --format "{{.Repository}}: {{.Size}}"
# docker가 사용하는 디스크 용량 확인
docker system df
# 캐시 정리
docker system prune