Docker 정리


이 글을 읽는 사람은 먼저 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

Author: Ruby Kim
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Ruby Kim !
Comments
  TOC