▌ TRANSMISSION · [CONCEPT]

What is Docker?


Docker 입문 가이드

1. Docker란?

Docker는 애플리케이션과 실행에 필요한 라이브러리, 설정, 런타임을 하나의 컨테이너 이미지로 패키징하고, 이를 어디서든 일관된 환경으로 실행할 수 있도록 해주는 플랫폼이다.

개발자의 컴퓨터에서는 정상적으로 실행되지만 서버에서는 실행되지 않는 문제 -> “내 컴퓨터에서는 되는데요?”라는 환경 차이를 줄이는 것이 Docker의 대표적인 목적이다. Docker는 애플리케이션의 개발, 테스트, 배포 과정을 동일한 방식으로 관리할 수 있게 해준다.

Docker를 사용하는 이유

Docker를 사용하면 다음과 같은 장점이 있다.

  • 개발자마다 동일한 실행 환경을 구성할 수 있다.
  • 애플리케이션 설치와 삭제가 간단하다.
  • 여러 버전의 프로그램을 서로 충돌하지 않게 실행할 수 있다.
  • 테스트 환경을 빠르게 만들고 제거할 수 있다.
  • 서버 배포 과정을 자동화하기 쉽다.
  • 데이터베이스, 웹 서버, 캐시 서버 등을 간단하게 실행할 수 있다.
  • CTF 및 보안 실습 환경을 독립적으로 구성할 수 있다.

2. 컨테이너와 가상 머신의 차이

Docker 컨테이너는 가상 머신과 비슷하게 격리된 실행 환경을 제공하지만, 운영체제 전체를 가상화하지 않는다는 차이가 있다.

구분가상 머신Docker 컨테이너
가상화 대상하드웨어프로세스와 운영 환경
운영체제VM마다 별도 게스트 OS호스트의 커널 공유
시작 속도상대적으로 느림빠름
용량보통 수 GB 이상보통 수십~수백 MB
격리 수준강함프로세스 수준 격리
대표 용도서로 다른 OS 실행애플리케이션 배포 및 테스트

컨테이너는 독립적인 파일 시스템, 네트워크, 프로세스 트리를 가지지만 호스트 운영체제의 커널을 공유한다. Docker는 Linux namespace와 control group 등을 사용해 컨테이너 간 프로세스와 자원을 격리한다.

컨테이너는 가상 머신보다 가볍지만, 완전한 보안 경계로 간주해서는 안 된다. 신뢰할 수 없는 프로그램을 실행할 때는 권한과 마운트 설정을 특히 주의해야 한다.


3. Docker 핵심 용어

3.1 이미지 Image

이미지는 컨테이너를 실행하기 위한 읽기 전용 템플릿이다.

이미지에는 다음과 같은 항목이 포함될 수 있다.

  • 애플리케이션 실행 파일
  • 운영체제의 기본 파일
  • 라이브러리
  • 패키지
  • 환경 설정
  • 기본 실행 명령

예를 들어 nginx:alpine 이미지는 Alpine Linux 기반의 Nginx 실행 환경을 담고 있다.

3.2 컨테이너 Container

컨테이너는 이미지를 기반으로 실제 실행된 프로세스다.

하나의 이미지로 여러 개의 컨테이너를 만들 수 있다.

nginx 이미지
 ├─ nginx-container-1
 ├─ nginx-container-2
 └─ nginx-container-3

이미지가 프로그램 설치 파일 또는 클래스라면, 컨테이너는 실제로 실행된 프로그램 또는 인스턴스에 가깝다.

3.3 Dockerfile

Dockerfile은 이미지를 만드는 방법을 기록한 설정 파일이다.

FROM nginx:alpine
COPY ./html /usr/share/nginx/html

이 Dockerfile은 다음 작업을 의미한다.

  1. nginx:alpine 이미지를 기반으로 사용한다.
  2. 현재 프로젝트의 html 디렉터리를 Nginx 웹 루트에 복사한다.

3.4 Registry

Registry는 Docker 이미지를 저장하고 배포하는 저장소다.

대표적으로 다음과 같은 서비스가 있다.

  • Docker Hub
  • GitHub Container Registry
  • GitLab Container Registry
  • 사설 Registry

Git에서 소스 코드를 push하고 pull하듯이 Docker에서는 이미지를 push하고 pull한다.

3.5 Volume

Volume은 컨테이너가 삭제되어도 데이터를 유지하기 위한 저장 공간이다.

데이터베이스 파일이나 업로드 파일처럼 지속적으로 보관해야 하는 데이터에 사용한다.

3.6 Network

Docker Network는 컨테이너끼리 통신할 수 있도록 구성하는 가상 네트워크다.

같은 Docker 네트워크에 연결된 컨테이너는 컨테이너 이름 또는 Compose 서비스 이름으로 서로 접근할 수 있다.

3.7 Docker Compose

Docker Compose는 여러 컨테이너로 이루어진 애플리케이션을 하나의 YAML 파일로 정의하고 관리하는 도구다.

예를 들어 다음과 같은 구성을 하나의 파일로 관리할 수 있다.

웹 애플리케이션
 ├─ Web 서버
 ├─ PostgreSQL
 └─ Redis

4. Docker의 기본 구조

Docker는 크게 다음 구성요소로 동작한다.

사용자

  │ docker 명령어

Docker CLI

  │ Docker API

Docker daemon
  ├─ 이미지 관리
  ├─ 컨테이너 관리
  ├─ 네트워크 관리
  └─ 볼륨 관리

사용자가 다음 명령을 실행한다고 가정하자.

docker run nginx

Docker는 내부적으로 다음 작업을 수행한다.

  1. 로컬에 nginx 이미지가 있는지 확인한다.
  2. 이미지가 없다면 Registry에서 다운로드한다.
  3. 이미지로부터 새로운 컨테이너를 생성한다.
  4. 컨테이너의 기본 명령을 실행한다.
  5. 컨테이너의 표준 출력과 입력을 연결한다.

5. Docker 설치

5.1 Windows와 macOS

Windows와 macOS에서는 일반적으로 Docker Desktop을 설치한다.

Docker Desktop에는 다음 구성요소가 포함된다.

  • Docker Engine
  • Docker CLI
  • Docker Compose
  • Buildx
  • GUI 관리 화면

Windows에서는 보통 WSL 2 기반 Linux 가상 환경에서 컨테이너가 실행된다.

5.2 Ubuntu 26.04에 Docker Engine 설치

기존 충돌 패키지 제거

sudo apt remove \
    docker.io \
    docker-compose \
    docker-compose-v2 \
    docker-doc \
    podman-docker \
    containerd \
    runc

설치되지 않은 패키지가 표시되어도 문제는 없다.

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

Docker 공식 저장소 등록

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

Docker 설치

sudo apt update

sudo apt install -y \
    docker-ce \
    docker-ce-cli \
    containerd.io \
    docker-buildx-plugin \
    docker-compose-plugin

설치 확인

sudo systemctl status docker
sudo docker run hello-world

버전도 확인할 수 있다.

docker version
docker compose version

5.3 sudo 없이 Docker 사용하기

현재 사용자를 docker 그룹에 추가한다.

sudo usermod -aG docker "$USER"

그룹 정보를 현재 셸에 적용한다.

newgrp docker

테스트한다.

docker run hello-world

docker 그룹의 사용자는 사실상 호스트의 root 권한에 준하는 권한을 가진다. 다중 사용자 서버에서는 무조건 사용자를 docker 그룹에 추가하지 말고 Rootless Docker도 고려해야 한다.


6. 첫 번째 컨테이너 실행

6.1 Hello World

docker run hello-world

이 명령은 다음 작업을 수행한다.

  • hello-world 이미지 확인
  • 이미지가 없다면 Docker Hub에서 다운로드
  • 컨테이너 생성
  • 컨테이너 실행
  • 메시지 출력 후 종료

6.2 Nginx 웹 서버 실행

docker run -d \
    --name my-nginx \
    -p 8080:80 \
    nginx:alpine

옵션의 의미는 다음과 같다.

  • docker run: 새로운 컨테이너 생성 및 실행
  • -d: 백그라운드 실행
  • --name my-nginx: 컨테이너 이름 지정
  • -p 8080:80: 호스트 8080 포트를 컨테이너 80 포트에 연결
  • nginx:alpine: 사용할 이미지와 태그

웹 브라우저에서 다음 주소로 접속한다.

http://localhost:8080

6.3 포트 매핑 이해하기

-p 호스트_포트:컨테이너_포트

예:

docker run -d -p 3000:80 nginx:alpine

외부 네트워크에 노출하지 않고 로컬에서만 사용하려면 다음처럼 바인딩한다.

docker run -d \
    -p 127.0.0.1:8080:80 \
    nginx:alpine

7. 컨테이너 관리 명령어

7.1 실행 중인 컨테이너 확인

docker ps

종료된 컨테이너까지 모두 확인한다.

docker ps -a

7.2 컨테이너 로그 확인

docker logs my-nginx

로그를 실시간으로 확인한다.

docker logs -f my-nginx

최근 100줄부터 확인한다.

docker logs --tail 100 -f my-nginx

7.3 컨테이너 내부 명령 실행

docker exec my-nginx ls -al /

컨테이너 내부 셸에 접속한다.

docker exec -it my-nginx sh

Bash가 설치된 이미지라면 다음과 같이 실행한다.

docker exec -it my-container bash
  • -i: 표준 입력 유지
  • -t: 가상 터미널 할당

7.4 컨테이너 중지 및 시작

docker stop my-nginx
docker start my-nginx
docker restart my-nginx

7.5 컨테이너 삭제

docker rm my-nginx

실행 중인 컨테이너를 강제로 삭제한다.

docker rm -f my-nginx

7.6 컨테이너 상세 정보 확인

docker inspect my-nginx

특정 정보만 출력할 수도 있다.

docker inspect \
    --format '{{.State.Status}}' \
    my-nginx

7.7 자원 사용량 확인

docker stats

특정 컨테이너만 확인한다.

docker stats my-nginx

8. 이미지 관리

8.1 이미지 다운로드

docker pull ubuntu:24.04
docker pull nginx:alpine

태그를 생략하면 기본적으로 latest 태그가 사용되지만, 실제 운영에서는 버전을 명시하는 것이 좋다.

docker pull nginx:1.28-alpine

8.2 이미지 목록 확인

docker images

또는 다음 명령을 사용할 수 있다.

docker image ls

8.3 이미지 삭제

docker rmi nginx:alpine

사용되지 않는 이미지 정리:

docker image prune

사용되지 않는 모든 이미지 정리:

docker image prune -a

8.4 이미지 태그 지정

docker tag my-app:latest monkeygod/my-app:1.0

태그는 일반적으로 다음 구조를 사용한다.

저장소/이미지이름:버전

예:

monkeygod/ctf-web:1.0
registry.example.com/security/web-challenge:2026.07

9. 컨테이너의 데이터 관리

컨테이너 내부에서 생성한 데이터는 컨테이너의 writable layer에 저장된다. 컨테이너를 삭제하면 해당 데이터도 함께 사라질 수 있다.

중요한 데이터는 다음 방법으로 분리해야 한다.

  1. Docker Volume
  2. Bind Mount

9.1 Docker Volume

Docker가 직접 관리하는 저장 공간이다.

볼륨 생성

docker volume create nginx-data

볼륨 목록 확인

docker volume ls

컨테이너에 연결

docker run -d \
    --name volume-nginx \
    -p 8080:80 \
    -v nginx-data:/usr/share/nginx/html \
    nginx:alpine

볼륨 삭제

docker volume rm nginx-data

9.2 Bind Mount

호스트의 특정 파일이나 디렉터리를 컨테이너 내부에 연결하는 방식이다.

mkdir -p "$PWD/html"

echo '<h1>Hello Docker</h1>' > "$PWD/html/index.html"

docker run -d \
    --name bind-nginx \
    -p 8080:80 \
    -v "$PWD/html:/usr/share/nginx/html:ro" \
    nginx:alpine

구조:

호스트 경로:컨테이너 경로:옵션

ro는 컨테이너가 해당 경로를 읽기 전용으로 사용하게 한다.

보다 명시적인 --mount 문법도 사용할 수 있다.

docker run -d \
    --name bind-nginx \
    -p 8080:80 \
    --mount type=bind,src="$PWD/html",dst=/usr/share/nginx/html,ro \
    nginx:alpine

9.3 Volume과 Bind Mount 비교

구분VolumeBind Mount
관리 주체Docker사용자
호스트 경로Docker가 결정사용자가 지정
이동성상대적으로 높음호스트 경로에 의존
주요 용도DB 데이터, 영구 데이터소스 코드, 설정 파일
백업볼륨 백업 필요일반 파일처럼 백업 가능

10. Docker 네트워크

10.1 기본 네트워크 확인

docker network ls

기본적으로 다음 네트워크를 볼 수 있다.

  • bridge
  • host
  • none

10.2 사용자 정의 네트워크 생성

docker network create app-network

10.3 컨테이너 연결

첫 번째 컨테이너:

docker run -d \
    --name web \
    --network app-network \
    nginx:alpine

두 번째 컨테이너:

docker run --rm -it \
    --network app-network \
    alpine sh

Alpine 컨테이너 내부에서 다음과 같이 접근할 수 있다.

wget -qO- http://web

web이라는 컨테이너 이름이 내부 DNS 이름처럼 사용된다.

10.4 컨테이너에서 localhost의 의미

컨테이너 내부의 localhost호스트 컴퓨터가 아니라 현재 컨테이너 자신을 의미한다.

잘못된 예:

DB_HOST=localhost

올바른 예:

DB_HOST=db

11. Dockerfile로 이미지 만들기

간단한 Python 웹 애플리케이션을 이미지로 만들어 본다.

11.1 프로젝트 구조

docker-python-app/
├─ app.py
├─ requirements.txt
├─ Dockerfile
└─ .dockerignore

11.2 app.py

from flask import Flask

app = Flask(__name__)


@app.get("/")
def index():
    return {
        "message": "Hello Docker",
        "status": "running",
    }


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

11.3 requirements.txt

Flask~=3.1

11.4 Dockerfile

# syntax=docker/dockerfile:1

FROM python:3.13-slim

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

RUN useradd --create-home appuser

USER appuser

EXPOSE 5000

CMD ["python", "app.py"]

11.5 .dockerignore

.git
.gitignore
__pycache__
*.pyc
.env
venv
.venv
README.md

11.6 이미지 빌드

docker build -t docker-python-app:1.0 .

11.7 컨테이너 실행

docker run -d \
    --name python-web \
    -p 127.0.0.1:5000:5000 \
    docker-python-app:1.0

접속:

curl http://127.0.0.1:5000

로그 확인:

docker logs -f python-web

12. 이미지 레이어와 빌드 캐시

Docker 이미지는 여러 개의 읽기 전용 레이어로 구성된다.

COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

소스 코드만 변경되면 패키지 설치 레이어는 캐시를 재사용할 수 있다.

캐시 없이 다시 빌드하려면 다음과 같이 실행한다.

docker build --no-cache -t docker-python-app:1.0 .

기반 이미지도 새로 내려받아 빌드하려면 다음과 같이 실행한다.

docker build \
    --pull \
    --no-cache \
    -t docker-python-app:1.0 \
    .

13. Docker Compose 사용법

Docker Compose를 사용하면 서비스, 네트워크, 볼륨, 환경 변수를 compose.yaml 파일로 관리할 수 있다.

13.1 PostgreSQL과 Adminer 구성

프로젝트 구조:

docker-db/
├─ compose.yaml
└─ .env

13.2 .env

DB_PASSWORD=change-this-password

.env 파일은 Git 저장소에 커밋하지 않는다.

.env

13.3 compose.yaml

services:
  db:
    image: postgres:17-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: app
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app -d app"]
      interval: 5s
      timeout: 3s
      retries: 10

  adminer:
    image: adminer:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:8080"
    depends_on:
      db:
        condition: service_healthy

volumes:
  db-data:

13.4 서비스 시작

docker compose up -d

13.5 상태 확인

docker compose ps

13.6 로그 확인

docker compose logs
docker compose logs -f
docker compose logs -f db

13.7 서비스 내부 명령 실행

docker compose exec db \
    psql -U app -d app

13.8 서비스 종료

docker compose down

볼륨까지 제거:

docker compose down -v

docker compose down -v를 실행하면 PostgreSQL 데이터가 저장된 볼륨도 삭제된다.

13.9 설정 변경 후 재구성

docker compose up -d
docker compose up -d --build

완전히 새로 빌드:

docker compose build --no-cache
docker compose up -d

14. 환경 변수 전달

14.1 docker run에서 전달

docker run --rm \
    -e APP_ENV=development \
    -e DEBUG=true \
    my-app:1.0

파일에서 읽기:

docker run --rm \
    --env-file .env \
    my-app:1.0

14.2 Compose에서 전달

services:
  web:
    image: my-app:1.0
    environment:
      APP_ENV: development
      DB_HOST: db

또는:

services:
  web:
    image: my-app:1.0
    env_file:
      - .env

비밀번호, API 키, 인증서 등을 Dockerfile의 ENVCOPY로 이미지에 넣으면 이미지 레이어에 흔적이 남을 수 있다.


15. Docker 활용 사례

15.1 일회성 Linux 환경

docker run --rm -it ubuntu:24.04 bash

15.2 특정 Python 버전으로 스크립트 실행

docker run --rm \
    -v "$PWD:/work" \
    -w /work \
    python:3.13 \
    python script.py

15.3 임시 웹 서버

docker run --rm \
    -p 127.0.0.1:8080:80 \
    -v "$PWD:/usr/share/nginx/html:ro" \
    nginx:alpine

15.4 개발용 데이터베이스

docker run -d \
    --name dev-postgres \
    -e POSTGRES_PASSWORD=dev-password \
    -p 127.0.0.1:5432:5432 \
    -v postgres-data:/var/lib/postgresql/data \
    postgres:17-alpine

15.5 CTF 문제 배포

CTF 플랫폼
 ├─ Web Challenge 1 컨테이너
 ├─ Web Challenge 2 컨테이너
 ├─ Pwnable Challenge 컨테이너
 └─ Database 컨테이너

장점:

  • 참가자별 환경을 동일하게 제공할 수 있다.
  • 문제 파일과 의존성을 이미지에 포함할 수 있다.
  • 문제가 충돌하지 않도록 네트워크를 분리할 수 있다.
  • 대회 종료 후 컨테이너를 일괄 삭제할 수 있다.
  • 문제 버전을 이미지 태그로 관리할 수 있다.

주의할 점:

  • 불필요한 Linux capability 제거
  • --privileged 사용 금지
  • Docker socket 마운트 금지
  • 호스트 디렉터리 마운트 최소화
  • CPU와 메모리 제한
  • PID 제한
  • 읽기 전용 파일 시스템
  • 참가자별 네트워크 및 컨테이너 격리

15.6 CI/CD 빌드 환경

소스 코드 Push

Docker 이미지 Build

자동 테스트

Registry Push

서버에서 새 이미지 Pull

컨테이너 교체

16. 자원 제한

16.1 메모리 제한

docker run -d \
    --name limited-nginx \
    --memory 256m \
    nginx:alpine

16.2 CPU 제한

docker run -d \
    --name limited-nginx \
    --cpus 0.5 \
    nginx:alpine

16.3 PID 제한

docker run -d \
    --name limited-nginx \
    --pids-limit 100 \
    nginx:alpine

16.4 여러 제한 동시 적용

docker run -d \
    --name limited-app \
    --memory 512m \
    --cpus 1.0 \
    --pids-limit 200 \
    my-app:1.0

17. Docker 보안 기본 수칙

17.1 신뢰할 수 있는 이미지를 사용한다

가능하면 다음 이미지를 우선적으로 검토한다.

  • Docker Official Image
  • Verified Publisher Image
  • 프로젝트 공식 이미지

17.2 작은 기반 이미지를 사용한다

FROM python:3.13-slim

Alpine은 작지만 일부 패키지와 호환성 문제가 생길 수 있다.

17.3 컨테이너를 root로 실행하지 않는다

RUN useradd --create-home appuser
USER appuser

또는:

docker run --user 1000:1000 my-app:1.0

17.4 privileged 모드를 피한다

docker run --privileged ...

필요한 capability만 추가하는 것이 좋다.

docker run \
    --cap-drop ALL \
    --cap-add NET_BIND_SERVICE \
    my-app:1.0

17.5 Docker socket을 마운트하지 않는다

-v /var/run/docker.sock:/var/run/docker.sock

Docker socket을 제어할 수 있으면 사실상 호스트 장악으로 이어질 수 있다.

17.6 파일 시스템을 읽기 전용으로 실행한다

docker run --read-only my-app:1.0

임시 쓰기 공간:

docker run \
    --read-only \
    --tmpfs /tmp \
    my-app:1.0

17.7 포트를 필요한 범위에만 공개한다

-p 127.0.0.1:8080:80

17.8 Rootless Docker를 검토한다

Rootless 모드는 Docker daemon과 컨테이너를 일반 사용자 권한으로 실행하는 방식이다.


18. Multi-stage Build

# syntax=docker/dockerfile:1

FROM golang:1.24 AS builder

WORKDIR /src

COPY . .

RUN CGO_ENABLED=0 go build -o /out/app ./cmd/app

FROM alpine:3.22

RUN adduser -D appuser

COPY --from=builder /out/app /usr/local/bin/app

USER appuser

ENTRYPOINT ["/usr/local/bin/app"]

장점:

  • 최종 이미지 크기 감소
  • 소스 코드와 빌드 도구 제외
  • 공격 표면 감소
  • 빌드 환경과 실행 환경 분리

19. 정리 및 디스크 관리

19.1 Docker 디스크 사용량 확인

docker system df
docker system df -v

19.2 종료된 컨테이너 정리

docker container prune

19.3 사용하지 않는 이미지 정리

docker image prune

19.4 사용하지 않는 네트워크 정리

docker network prune

19.5 사용하지 않는 볼륨 정리

docker volume prune

19.6 전체 정리

docker system prune
docker system prune -a
docker system prune -a --volumes

--volumes를 사용하면 데이터베이스 데이터 등 복구하기 어려운 데이터가 삭제될 수 있다.


20. 자주 발생하는 문제

20.1 Docker daemon에 연결할 수 없음

Cannot connect to the Docker daemon
sudo systemctl status docker
sudo systemctl start docker
sudo systemctl enable docker

20.2 Permission denied

permission denied while trying to connect to the Docker daemon socket
id
sudo usermod -aG docker "$USER"
newgrp docker

20.3 포트가 이미 사용 중임

port is already allocated
sudo ss -lntp | grep ':8080'
docker ps --format 'table {{.Names}}\t{{.Ports}}'

다른 포트 사용:

docker run -p 8081:80 nginx:alpine

20.4 컨테이너가 바로 종료됨

docker ps -a
docker logs container-name

컨테이너는 기본 프로세스가 종료되면 함께 종료된다.

20.5 컨테이너 이름 충돌

docker ps -a --filter name=my-container
docker rm -f my-container

20.6 저장 공간 부족

docker system df
docker ps -a
docker images
docker volume ls

21. 자주 사용하는 명령어 요약

컨테이너

docker run IMAGE
docker ps
docker ps -a
docker start CONTAINER
docker stop CONTAINER
docker restart CONTAINER
docker rm CONTAINER
docker rm -f CONTAINER
docker logs -f CONTAINER
docker exec -it CONTAINER sh
docker inspect CONTAINER
docker stats

이미지

docker pull IMAGE
docker images
docker build -t NAME:TAG .
docker tag SOURCE TARGET
docker rmi IMAGE
docker image prune

볼륨

docker volume create NAME
docker volume ls
docker volume inspect NAME
docker volume rm NAME
docker volume prune

네트워크

docker network create NAME
docker network ls
docker network inspect NAME
docker network connect NETWORK CONTAINER
docker network disconnect NETWORK CONTAINER
docker network rm NAME

Compose

docker compose up
docker compose up -d
docker compose up -d --build
docker compose ps
docker compose logs -f
docker compose exec SERVICE sh
docker compose restart SERVICE
docker compose down
docker compose down -v
docker compose config

시스템 관리

docker system df
docker system prune
docker system prune -a

22. Docker를 이해하는 핵심 흐름

Dockerfile 작성

docker build

Docker 이미지 생성

docker run

Docker 컨테이너 실행

Volume에 데이터 저장

Network로 다른 컨테이너와 통신

Compose로 여러 컨테이너 통합 관리

가장 중요한 개념은 다음과 같다.

  1. 이미지는 실행 환경을 담은 템플릿이다.
  2. 컨테이너는 이미지를 실행한 프로세스다.
  3. 컨테이너를 삭제하면 내부 데이터가 사라질 수 있다.
  4. 중요한 데이터는 Volume으로 분리한다.
  5. 컨테이너끼리는 Docker Network를 통해 통신한다.
  6. 여러 컨테이너는 Docker Compose로 관리한다.
  7. Dockerfile을 사용하면 실행 환경을 코드로 관리할 수 있다.
  8. 컨테이너를 실행했다고 해서 자동으로 안전해지는 것은 아니다.

23. 입문 실습 과제

1단계: 컨테이너 실행

docker run --rm hello-world

2단계: Nginx 실행

docker run -d \
    --name web \
    -p 127.0.0.1:8080:80 \
    nginx:alpine

3단계: 로그와 내부 확인

docker logs web
docker exec -it web sh

4단계: Bind Mount 적용

mkdir html
echo '<h1>My Docker Web</h1>' > html/index.html

docker rm -f web

docker run -d \
    --name web \
    -p 127.0.0.1:8080:80 \
    -v "$PWD/html:/usr/share/nginx/html:ro" \
    nginx:alpine

5단계: Dockerfile 작성

FROM nginx:alpine
COPY ./html /usr/share/nginx/html

빌드 및 실행:

docker build -t my-web:1.0 .

docker run -d \
    --name my-web \
    -p 127.0.0.1:8081:80 \
    my-web:1.0

6단계: Compose로 변경

services:
  web:
    build: .
    ports:
      - "127.0.0.1:8081:80"

실행:

docker compose up -d --build

종료:

docker compose down

← ALL POSTS