Ubuntu에 Docker를 설치하는 방법부터 이미지·컨테이너 명령, docker run 옵션, docker commit, Dockerfile 명령어, 디스크 정리까지 자주 찾아보는 내용을 한 글에 모았습니다. 개념 설명은 시리즈 본편에 맡기고, 이 글은 필요할 때 펼쳐 보는 레퍼런스로 씁니다.
컨테이너부터 Kubernetes까지 시리즈의 부록입니다. 명령이 왜 그렇게 동작하는지는 [Docker] 컨테이너 개념 정리부터 차례로 보면 되고, 전체 순서는 시리즈 목차에 있습니다. 명령과 출력은 Docker Engine 29, Ubuntu 24.04 기준입니다.
1. Ubuntu에 Docker 설치
설치 방법은 두 가지입니다. 운영 서버는 Docker 공식 apt 저장소를 등록해서 설치하고, 테스트용 VM처럼 빨리 써 보기만 할 때는 설치 스크립트를 씁니다. 공식 문서 기준 지원 버전은 Ubuntu 26.04, 24.04, 22.04 LTS입니다.
1.1 이전 패키지 제거
Ubuntu 기본 저장소의 docker.io나 podman-docker가 깔려 있으면 공식 패키지와 충돌하므로 먼저 지웁니다. 설치된 것이 없으면 아무것도 지우지 않고 끝납니다.
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 \
docker-doc docker-buildx podman-docker containerd runc | cut -f1)
1.2 공식 apt 저장소로 설치 (권장)
Docker의 GPG 키와 저장소를 등록한 뒤 패키지를 설치합니다. 이렇게 설치하면 이후에는 apt upgrade로 Docker도 함께 업데이트됩니다.
# GPG 키 등록
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# 저장소 등록
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
# 설치
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
설치되는 패키지는 각각 다음 역할을 합니다.
| 패키지 | 역할 |
| docker-ce | Docker 데몬(dockerd) |
| docker-ce-cli | docker 명령 |
| containerd.io | 실제로 컨테이너를 띄우는 containerd와 runc |
| docker-buildx-plugin | docker build에 쓰이는 BuildKit 빌더 |
| docker-compose-plugin | docker compose 명령 (5편) |
1.3 설치 스크립트로 빠르게 설치 (테스트용)
get.docker.com 스크립트는 OS를 감지해서 위 과정을 한 번에 실행합니다. 편하지만 항상 최신 버전을 설치하고 버전을 고를 수 없어서, 공식 문서도 테스트·개발 환경에서만 쓰라고 안내합니다. curl ... | sh로 바로 실행하기보다 내려받은 뒤 --dry-run으로 무엇을 할지 먼저 보는 편이 안전합니다.
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --dry-run # 실행할 명령만 출력
sudo sh get-docker.sh
1.4 설치 확인
sudo systemctl status docker --no-pager
sudo docker version
sudo docker run --rm hello-world
docker version에 Client와 Server가 모두 나오면 CLI와 데몬이 정상적으로 연결된 것입니다. Server 부분에서 오류가 나면 데몬이 떠 있지 않은 것이니 systemctl status docker로 상태를 확인합니다. hello-world가 "Hello from Docker!"를 출력하면 이미지 받기부터 컨테이너 실행까지 모두 동작하는 것입니다. Ubuntu에서는 설치하면 부팅 시 자동 시작이 기본으로 켜집니다.
1.5 sudo 없이 쓰기
docker 명령은 /var/run/docker.sock 소켓으로 데몬에 요청을 보내는데, 이 소켓은 root와 docker 그룹만 쓸 수 있습니다. 사용자를 docker 그룹에 넣으면 sudo 없이 쓸 수 있습니다.
sudo usermod -aG docker $USER
newgrp docker # 또는 로그아웃 후 다시 로그인
docker run --rm hello-world
docker 그룹은 사실상 root 권한입니다. 컨테이너에 호스트의 /를 마운트하면 호스트 파일을 마음대로 바꿀 수 있기 때문입니다. 여러 사람이 쓰는 서버라면 그룹에 넣을 사용자를 최소로 하고, 격리가 더 필요하면 Rootless 모드를 검토합니다.
2. 명령 구조
docker 명령은 docker [대상] [동작] 형태입니다. 예전부터 쓰던 짧은 명령(docker ps, docker images, docker rmi)도 그대로 동작하고, 대상을 앞에 붙인 긴 명령과 결과가 같습니다. 이 글에서는 손에 익은 짧은 명령을 주로 쓰고, 짧은 형태가 없는 명령만 긴 형태로 적습니다.
| 짧은 명령 | 긴 명령 | 하는 일 |
| docker ps | docker container ls | 실행 중인 컨테이너 목록 |
| docker run | docker container run | 컨테이너 생성 + 실행 |
| docker rm | docker container rm | 컨테이너 삭제 |
| docker images | docker image ls | 이미지 목록 |
| docker rmi | docker image rm | 이미지 삭제 |
옵션은 전부 외울 필요가 없습니다. docker run --help처럼 명령 뒤에 --help를 붙이면 그 명령의 옵션이 모두 나옵니다.
3. 이미지 명령
| 작업 | 명령 |
| 이미지 목록 | docker images |
| 레지스트리에서 받기 | docker pull nginx:alpine (태그를 생략하면 latest) |
| Docker Hub에서 검색 | docker search nginx |
| 태그 붙이기 | docker tag nginx:alpine myrepo/nginx:v1 |
| 레지스트리 로그인 / 올리기 | docker login docker push myrepo/nginx:v1 |
| 상세 정보 | docker image inspect nginx:alpine |
| 레이어별 생성 기록 | docker history nginx:alpine |
| 이미지 삭제 | docker rmi nginx:alpine |
| tar 파일로 저장 / 불러오기 | docker save -o nginx.tar nginx:alpine docker load -i nginx.tar |
docker rmi는 그 이미지로 만든 컨테이너가 남아 있으면 삭제를 거부합니다. 멈춘 컨테이너도 마찬가지입니다.
$ docker rmi nginx:alpine
Error response from daemon: conflict: unable to delete nginx:alpine (must be forced)
- container 68dd8c4f2f47 is using its referenced image 8a6bac31549a
docker rmi -f를 쓰면 삭제된 것처럼 보이지만 실제로는 태그만 떼어 내고, 컨테이너는 그대로 돌아가며 이미지도 이름 없는 상태로 남습니다. 이미지를 지우려면 컨테이너부터 지우는 것이 순서입니다. 한 이미지에 태그가 여러 개면 rmi는 태그를 하나씩 떼고, 마지막 태그를 뗄 때 이미지가 지워집니다.
save와 load는 인터넷이 막힌 서버로 이미지를 옮길 때 씁니다. 레이어와 태그가 tar 파일 하나에 그대로 담깁니다.
4. 컨테이너 명령
컨테이너는 만들어지고(Created), 실행되고(Running), 멈추고(Exited), 삭제되는 상태를 거칩니다. docker run은 create와 start를 한 번에 하는 명령이고, 멈춘 컨테이너는 쓰기 계층을 그대로 가지고 있어서 다시 start하면 전에 바꾼 파일이 남아 있습니다.

docker run은 create와 start를 합친 명령이고, 컨테이너는 rm 전까지 쓰기 계층을 유지합니다
4.1 상태 바꾸기
| 작업 | 명령 |
| 만들고 바로 실행 | docker run -d --name web nginx:alpine |
| 만들기만 | docker create --name web nginx:alpine |
| 시작 / 중지 / 재시작 | docker start web docker stop web docker restart web |
| 강제 종료 | docker kill web |
| 일시 정지 / 재개 | docker pause web docker unpause web |
| 삭제 | docker rm web |
| 실행 중이어도 강제 삭제 | docker rm -f web |
| 이름 바꾸기 | docker rename web web-old |
docker stop은 먼저 SIGTERM을 보내 앱이 스스로 정리하고 끝낼 시간을 주고, 10초 안에 끝나지 않으면 SIGKILL로 강제 종료합니다. docker kill은 기다리지 않고 바로 SIGKILL을 보냅니다. 앱이 요청을 처리하던 중일 수 있으니 평소에는 stop을 쓰고, 기다리는 시간은 docker stop -t 30 web처럼 늘릴 수 있습니다.
4.2 목록과 상태 보기
| 작업 | 명령 |
| 실행 중인 컨테이너 | docker ps |
| 멈춘 컨테이너까지 전부 | docker ps -a |
| ID만 출력 | docker ps -aq |
| 로그 보기 | docker logs web |
| 최근 100줄부터 로그 따라가기 | docker logs -f --tail 100 web |
| CPU, 메모리 사용량 | docker stats (한 번만 보려면 --no-stream) |
| 컨테이너 안 프로세스 | docker top web |
| 포트 매핑 확인 | docker port web |
| 바뀐 파일 목록 | docker diff web |
| 전체 설정(JSON) | docker inspect web |
docker inspect는 IP, 마운트, 재시작 정책처럼 컨테이너의 모든 설정을 JSON으로 보여 줍니다. 결과가 길어서 -f로 필요한 값만 뽑아 쓰는 경우가 많고, docker ps도 --format으로 원하는 칸만 출력할 수 있습니다.
docker inspect -f '{{.State.Status}}' web
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' web
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
4.3 컨테이너 안에서 작업하기
docker exec -it web sh # 실행 중인 컨테이너에서 셸 열기
docker exec web cat /etc/nginx/nginx.conf # 명령 하나만 실행
docker cp web:/etc/nginx/nginx.conf ./nginx.conf # 컨테이너 → 호스트
docker cp ./index.html web:/usr/share/nginx/html/ # 호스트 → 컨테이너
docker exec -it web /bin/bash를 습관처럼 쓰면 alpine이나 distroless처럼 가벼운 이미지에서는 bash가 없어 executable file not found 오류가 납니다. 이때는 sh를 씁니다.
docker attach는 새 프로세스를 만들지 않고 컨테이너의 메인 프로세스(PID 1) 입출력에 바로 연결합니다. 여기서 Ctrl+C를 누르면 메인 프로세스가 끝나 컨테이너가 멈추므로, -it로 띄운 컨테이너에서 빠져나올 때는 Ctrl+P, Ctrl+Q를 차례로 누릅니다. 셸 작업은 대부분 exec가 안전합니다.
5. docker run 자주 쓰는 옵션
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
| 옵션 | 설명 |
| -d, --detach | 백그라운드에서 실행하고 컨테이너 ID 출력 |
| -i, --interactive | 표준 입력(STDIN)을 열어 둠 |
| -t, --tty | 가상 터미널 할당. 셸을 쓸 때 -it로 함께 씀 |
| -a, --attach | STDIN, STDOUT, STDERR 중 연결할 스트림 지정 |
| --name | 컨테이너 이름 지정. 없으면 임의 이름이 붙음 |
| --rm | 컨테이너가 끝나면 자동 삭제 |
| -e, --env --env-file |
환경 변수 설정 / 파일에서 읽기 |
| -p, --publish | 호스트 포트:컨테이너 포트 연결 (4편) |
| -P, --publish-all | EXPOSE된 포트를 모두 호스트의 임의 포트에 연결 |
| -v, --volume --mount |
볼륨이나 호스트 폴더 연결 (4편) |
| --network | 연결할 네트워크 지정 (4편) |
| -w, --workdir | 컨테이너 안 작업 폴더 |
| -u, --user | 실행할 사용자 (예: 1000:1000) |
| --restart | 재시작 정책: no, on-failure, always, unless-stopped |
| --memory, --cpus | 메모리, CPU 사용 상한 |
| --entrypoint | 이미지의 ENTRYPOINT 덮어쓰기 |
| --privileged | 호스트 장치 접근을 포함한 거의 모든 권한 부여. 꼭 필요할 때만 사용 |
옵션을 조합한 예시입니다.
# nginx를 백그라운드로 띄우고 호스트 8080 → 컨테이너 80 연결
docker run -d --name web -p 8080:80 nginx:alpine
# 서버가 재부팅돼도 다시 뜨고, 메모리 256MB · CPU 0.5개로 제한
docker run -d --name web --restart unless-stopped \
--memory 256m --cpus 0.5 -p 8080:80 nginx:alpine
# 잠깐 셸만 써 보고 나오면 삭제
docker run --rm -it ubuntu:24.04 bash
--restart always와 unless-stopped는 둘 다 컨테이너가 죽으면 다시 올리고 데몬이 재시작될 때도 다시 올립니다. 차이는 docker stop으로 직접 멈춘 컨테이너입니다. always는 데몬이 재시작되면 이것도 다시 올리고, unless-stopped는 멈춘 그대로 둡니다.
6. docker commit으로 이미지 만들기
docker commit은 컨테이너의 쓰기 계층을 새 레이어로 굳혀 이미지로 저장합니다(레이어 구조는 2편 참고). ubuntu 컨테이너에 apache2를 설치해 commit으로 이미지를 만들고, 같은 이미지를 Dockerfile로 만드는 방법과 비교해 봅니다.
6.1 컨테이너에서 직접 설치
docker run -it --name base ubuntu:24.04 bash
컨테이너 셸에서 apache2를 설치하고 빠져나옵니다. 설치 중 시간대 같은 질문에 멈추지 않도록 DEBIAN_FRONTEND=noninteractive를 붙입니다. bash가 메인 프로세스라 exit하면 컨테이너는 Exited 상태가 되지만, 설치한 파일은 쓰기 계층에 남아 있습니다.
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y apache2
exit
6.2 commit으로 이미지 저장
docker diff base | head # 바뀐 파일 확인 (A 추가, C 변경, D 삭제)
docker commit -m "install apache2" base my-apache:commit
docker images my-apache
docker run --rm my-apache:commit apache2ctl -v
마지막 명령에서 Apache 버전이 나오면 새 이미지에 apache2가 들어 있는 것입니다. -c 옵션을 쓰면 CMD, ENV 같은 설정도 함께 바꿔서 저장할 수 있습니다.
docker commit -c 'CMD ["apache2ctl", "-D", "FOREGROUND"]' base my-apache:commit
6.3 Dockerfile과 비교

commit은 결과만 남고, Dockerfile은 만드는 과정이 파일로 남습니다
commit으로 만든 이미지는 결과만 있고 과정이 남지 않습니다. docker history my-apache:commit으로 보면 새 레이어가 bash 한 줄로만 기록되어 있어서, 누가 무엇을 설치했는지 이미지만 보고는 알 수 없습니다. 같은 내용을 Dockerfile로 적으면 파일을 Git에 두고 리뷰할 수 있고, 언제든 똑같이 다시 빌드할 수 있습니다.
FROM ubuntu:24.04
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends apache2 \
&& rm -rf /var/lib/apt/lists/*
CMD ["apache2ctl", "-D", "FOREGROUND"]
docker build -t my-apache:v1 .
commit은 장애가 난 컨테이너 상태를 그대로 떠서 분석하거나 잠깐 실험할 때 정도로 쓰고, 운영에 쓰는 이미지는 Dockerfile로 만듭니다.
6.4 실습 정리
docker rm base
docker rmi my-apache:commit my-apache:v1
7. Dockerfile 명령어 한눈에 보기
Dockerfile은 위에서 아래로 한 줄씩 실행되고, 명령어는 대소문자를 구분하지 않지만 관례상 대문자로 씁니다. 빌드 캐시, CMD와 ENTRYPOINT 조합, 멀티 스테이지 빌드는 3편에서 자세히 다루고, 여기서는 명령어만 정리합니다.
| 명령어 | 설명 |
| FROM | 베이스 이미지 지정. 멀티 스테이지에서는 FROM 이미지 AS 이름 |
| RUN | 빌드 중 명령 실행. 결과가 레이어로 남음 |
| COPY | 빌드 컨텍스트의 파일을 이미지로 복사 |
| ADD | COPY 기능에 더해 로컬 tar 자동 압축 해제, URL·Git 저장소 받기 |
| WORKDIR | 이후 명령이 실행될 폴더. 없으면 만듦 |
| ENV | 환경 변수. 빌드 중과 컨테이너 실행 중 모두 적용 |
| ARG | 빌드할 때만 쓰는 변수 (docker build --build-arg로 전달) |
| LABEL | 이미지 메타데이터 (작성자, 버전 등) |
| USER | 이후 명령과 컨테이너를 실행할 사용자 |
| EXPOSE | 앱이 쓰는 포트를 문서로 표시. 실제로 여는 것은 -p |
| VOLUME | 익명 볼륨을 붙일 경로 지정 |
| CMD | 컨테이너 시작 시 기본 명령. docker run 뒤에 명령을 주면 덮어씀 |
| ENTRYPOINT | 컨테이너 시작 시 항상 실행할 명령. CMD는 인자로 전달됨 |
| HEALTHCHECK | 컨테이너가 정상인지 주기적으로 확인할 명령 |
| SHELL | RUN, CMD의 셸 형식에 쓸 셸 변경 |
작성자 정보에 쓰던 MAINTAINER는 더 이상 권장되지 않아(deprecated) LABEL로 대신합니다. ADD는 tar를 자동으로 풀어 버리는 등 동작이 예상과 다를 수 있어서, 로컬 파일을 복사할 때는 COPY를 기본으로 씁니다.
nginx 이미지에 정적 페이지를 넣는 간단한 예시입니다.
FROM nginx:alpine
LABEL org.opencontainers.image.authors="1nfra"
COPY index.html /usr/share/nginx/html/
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget -qO- http://127.0.0.1/ || exit 1
docker build -t my-nginx:v1 .
docker run -d --name my-nginx -p 8080:80 my-nginx:v1
docker ps # 30초쯤 지나면 STATUS에 (healthy) 표시
CMD를 적지 않았는데도 nginx가 뜨는 것은 베이스 이미지인 nginx:alpine에 이미 CMD가 들어 있기 때문입니다. 베이스 이미지의 CMD, ENTRYPOINT, EXPOSE, ENV는 그대로 물려받습니다.
8. 디스크 정리와 일괄 삭제
이미지를 받고 빌드를 반복하다 보면 /var/lib/docker가 금방 커집니다. 지우기 전에 무엇이 공간을 쓰는지 먼저 확인합니다.
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 12 3 4.21GB 3.02GB (71%)
Containers 5 3 12.3MB 1.1MB (8%)
Local Volumes 4 2 820MB 310MB (37%)
Build Cache 58 0 1.9GB 1.9GB
RECLAIMABLE이 지금 쓰이지 않아서 지워도 되는 용량입니다. 빌드를 자주 하는 서버는 이미지보다 Build Cache가 더 큰 경우도 많습니다.
8.1 prune으로 안 쓰는 것만 지우기
| 명령 | 지우는 대상 |
| docker container prune | 멈춘 컨테이너 |
| docker image prune | 태그가 없는(dangling) 이미지 |
| docker image prune -a | 컨테이너가 쓰지 않는 모든 이미지 |
| docker volume prune | 컨테이너에 연결되지 않은 익명 볼륨 |
| docker volume prune -a | 연결되지 않은 모든 볼륨 (이름 있는 볼륨 포함) |
| docker network prune | 쓰지 않는 사용자 정의 네트워크 |
| docker builder prune | 빌드 캐시 |
| docker system prune | 멈춘 컨테이너, 안 쓰는 네트워크, dangling 이미지, 빌드 캐시 |
| docker system prune -a --volumes | 위 항목 + 안 쓰는 모든 이미지 + 익명 볼륨 |
볼륨에는 데이터가 들어 있어서 기본적으로 지우지 않습니다. Docker 23부터 volume prune은 익명 볼륨만 지우고, DB 데이터처럼 이름을 붙인 볼륨까지 지우려면 -a를 붙여야 합니다. system prune --volumes도 익명 볼륨만 지웁니다.
prune은 모두 확인 질문을 먼저 하고, -f를 붙이면 묻지 않고 바로 지웁니다. 기간 조건을 주면 최근 것은 남겨 둘 수 있습니다.
# 만든 지 7일(168시간)이 지난 안 쓰는 이미지만 삭제
docker image prune -a --filter "until=168h"
8.2 모든 컨테이너와 이미지 한 번에 지우기
테스트 서버를 깨끗하게 비울 때는 ID 목록을 뽑아 삭제 명령에 넘깁니다. 호스트의 모든 컨테이너와 이미지가 지워지므로 운영 서버에서는 실행하지 않습니다.
# 모든 컨테이너 삭제 (실행 중인 것도 강제로)
docker rm -f $(docker ps -aq)
# 모든 이미지 삭제
docker rmi -f $(docker images -q)
docker ps -aq는 모든 컨테이너의 ID만, docker images -q는 모든 이미지의 ID만 출력합니다. 지울 대상이 없으면 "requires at least 1 argument" 오류가 나는데 무시해도 됩니다. 볼륨과 빌드 캐시까지 전부 비우려면 컨테이너를 지운 뒤 docker system prune -af --volumes와 docker volume prune -af를 이어서 실행합니다.
9. 전체 명령 요약
docker --help에 나오는 명령을 용도별로 묶었습니다.
| 분류 | 명령 | 설명 |
| 컨테이너 실행 | run | 새 컨테이너를 만들어 실행 |
| create | 새 컨테이너 생성(실행하지 않음) | |
| start / stop | 멈춘 컨테이너 시작 / 실행 중인 컨테이너 중지 | |
| restart | 컨테이너 재시작 | |
| kill | 실행 중인 컨테이너 강제 종료 | |
| pause / unpause | 컨테이너 프로세스 일시 중지 / 재개 | |
| wait | 컨테이너가 멈출 때까지 기다린 뒤 종료 코드 출력 | |
| rm / rename | 컨테이너 삭제 / 이름 변경 | |
| update | 실행 중인 컨테이너의 자원 제한, 재시작 정책 변경 | |
| 컨테이너 조회 | ps | 컨테이너 목록 |
| logs | 컨테이너 로그 | |
| inspect | Docker 객체의 상세 정보(JSON) | |
| top | 컨테이너 안에서 실행 중인 프로세스 | |
| stats | 컨테이너 리소스 사용량 실시간 보기 | |
| port | 컨테이너 포트 매핑 | |
| diff | 컨테이너 파일시스템의 변경 사항 | |
| events | 데몬의 실시간 이벤트 | |
| 컨테이너 작업 | exec | 실행 중인 컨테이너에서 명령 실행 |
| attach | 메인 프로세스의 표준 입출력에 연결 | |
| cp | 컨테이너와 호스트 사이에 파일·폴더 복사 | |
| commit | 컨테이너의 변경 사항으로 새 이미지 생성 | |
| export | 컨테이너 파일시스템을 tar로 내보내기 | |
| 이미지 | images | 이미지 목록 |
| pull / push | 레지스트리에서 이미지 받기 / 올리기 | |
| build | Dockerfile로 이미지 빌드 | |
| tag | 이미지에 새 태그 붙이기 | |
| rmi | 이미지 삭제 | |
| history | 이미지의 레이어별 생성 기록 | |
| save / load | 이미지를 tar로 저장 / tar에서 불러오기 | |
| import | tar 파일(export 결과)로 이미지 생성 | |
| search | Docker Hub에서 이미지 검색 | |
| 레지스트리·시스템 | login / logout | 레지스트리 로그인 / 로그아웃 |
| info | 데몬과 시스템 전체 정보 | |
| version | Client, Server 버전 정보 | |
| system df / prune | 디스크 사용량 확인 / 안 쓰는 객체 정리 |
export/import와 save/load는 비슷해 보이지만 다릅니다. export는 컨테이너의 파일시스템을 레이어 없이 한 덩어리로 내보내서 CMD 같은 설정과 레이어 기록이 사라지고, save는 이미지를 레이어와 설정 그대로 저장합니다. 이미지를 옮길 때는 save/load를 씁니다.
10. 정리
- 운영 서버는 공식 apt 저장소로 설치하고, get.docker.com 스크립트는 테스트 환경에서만 씁니다.
- docker 그룹은 root 권한과 같으므로 꼭 필요한 사용자만 넣습니다.
- 컨테이너는 rm 전까지 쓰기 계층을 유지하고, 이미지는 그 이미지를 쓰는 컨테이너부터 지워야 삭제됩니다.
- stop은 SIGTERM을 보내고 기다렸다가 종료하고, kill은 바로 SIGKILL로 종료합니다.
- commit은 실험이나 장애 상태 보존용으로만 쓰고, 이미지는 Dockerfile로 만듭니다.
- 공간 정리는 docker system df로 확인한 뒤 prune을 쓰고, 이름 있는 볼륨은 -a를 붙여야 지워집니다.
참고
'DevOps > Docker' 카테고리의 다른 글
| [Docker] 컨테이너부터 Kubernetes까지 학습 순서 정리 (0) | 2026.09.28 |
|---|---|
| [Docker] Docker Compose로 여러 컨테이너 실행 정리 (0) | 2026.09.28 |
| [Docker] 컨테이너 네트워크와 볼륨 정리 (0) | 2026.09.28 |
| [Docker] Dockerfile 작성과 멀티 스테이지 빌드 정리 (0) | 2026.09.28 |
| [Docker] 이미지와 레이어 정리 (0) | 2026.09.28 |