Docker Basics

Docker 설치, 기본 명령어, 이미지/컨테이너 개념


📚 시리즈 네비게이션

이전현재다음
-Docker BasicsDockerfile & Image

시리즈 목차


🎯 Docker란?

컨테이너 기반 애플리케이션 패키징/배포 플랫폼.

flowchart TB
    subgraph Host["Docker Host"]
        subgraph Containers["Containers"]
            C1["Container A<br/>(nginx)"]
            C2["Container B<br/>(mysql)"]
            C3["Container C<br/>(app)"]
        end
        Engine["Docker Engine"]
        Kernel["Linux Kernel<br/>(namespaces, cgroups)"]
        
        Containers --> Engine --> Kernel
    end

컨테이너 개념은 Container Virtualization 참고.


🏗️ Docker 아키텍처

구성 요소

flowchart LR
    CLI["Docker CLI"]
    
    subgraph Daemon["Docker Daemon (dockerd)"]
        Containers["Containers"]
        Images["Images"]
    end
    
    Registry["Docker Registry<br/>(Docker Hub 등)"]
    
    CLI <-->|"REST API"| Daemon
    Daemon <--> Registry
구성 요소설명
Docker CLI사용자 명령어 인터페이스
Docker Daemon컨테이너/이미지 관리 (백그라운드)
Docker Registry이미지 저장소 (Docker Hub, ECR 등)

Image vs Container

항목ImageContainer
비유클래스인스턴스
상태불변 (Read-only)실행 중 (Read-Write)
용도템플릿실제 실행
flowchart LR
    Image["Image<br/>(nginx:latest)"]
    C1["Container A<br/>(실행 중)"]
    C2["Container B<br/>(실행 중)"]
    C3["Container C<br/>(중지됨)"]
    
    Image --> C1
    Image --> C2
    Image --> C3

📦 설치

Ubuntu/Debian

# 이전 버전 제거
sudo apt remove docker docker-engine docker.io containerd runc
 
# 필수 패키지
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release
 
# Docker GPG 키 추가
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
 
# 저장소 추가
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 
# 설치
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
 
# 확인
docker --version

CentOS/RHEL

# 이전 버전 제거
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
 
# 저장소 설정
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
 
# 설치
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
 
# 시작
sudo systemctl start docker
sudo systemctl enable docker
 
# 확인
docker --version

일반 사용자 권한 설정

# docker 그룹에 사용자 추가
sudo usermod -aG docker $USER
 
# 로그아웃 후 다시 로그인
# 또는
newgrp docker
 
# 확인
docker run hello-world

🖼️ 이미지 명령어

이미지 검색/다운로드

# Docker Hub 검색
docker search nginx
 
# 이미지 다운로드 (pull)
docker pull nginx
docker pull nginx:1.24          # 특정 버전
docker pull nginx:latest        # 최신 버전 (기본)
 
# 이미지 목록
docker images
docker image ls
 
# 이미지 상세 정보
docker image inspect nginx
 
# 이미지 삭제
docker rmi nginx
docker image rm nginx
 
# 사용하지 않는 이미지 정리
docker image prune
docker image prune -a           # 모든 미사용 이미지

이미지 태그

이미지 이름 구조:
[registry/]repository[:tag]

예시:
nginx                          # library/nginx:latest
nginx:1.24                     # library/nginx:1.24
myregistry.com/myapp:v1.0      # 사설 레지스트리

📦 컨테이너 명령어

컨테이너 실행

# 기본 실행
docker run nginx
 
# 백그라운드 실행 (-d)
docker run -d nginx
 
# 이름 지정 (--name)
docker run -d --name my-nginx nginx
 
# 포트 매핑 (-p)
docker run -d -p 8080:80 nginx
# 호스트:컨테이너
 
# 환경 변수 (-e)
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql
 
# 볼륨 마운트 (-v)
docker run -d -v /host/path:/container/path nginx
 
# 조합
docker run -d \
    --name my-nginx \
    -p 8080:80 \
    -v /var/www:/usr/share/nginx/html \
    nginx:1.24

컨테이너 관리

# 실행 중인 컨테이너 목록
docker ps
 
# 모든 컨테이너 (중지 포함)
docker ps -a
 
# 컨테이너 중지
docker stop my-nginx
 
# 컨테이너 시작
docker start my-nginx
 
# 컨테이너 재시작
docker restart my-nginx
 
# 컨테이너 삭제 (중지 상태에서)
docker rm my-nginx
 
# 강제 삭제 (실행 중이어도)
docker rm -f my-nginx
 
# 모든 중지된 컨테이너 삭제
docker container prune

컨테이너 접속/로그

# 컨테이너 내부 접속
docker exec -it my-nginx /bin/bash
docker exec -it my-nginx sh          # bash 없는 경우
 
# 명령어 실행
docker exec my-nginx cat /etc/nginx/nginx.conf
 
# 로그 확인
docker logs my-nginx
docker logs -f my-nginx              # 실시간 (follow)
docker logs --tail 100 my-nginx      # 마지막 100줄
 
# 컨테이너 상세 정보
docker inspect my-nginx
 
# 리소스 사용량
docker stats
docker stats my-nginx

🔄 컨테이너 라이프사이클

flowchart TD
    Created["Created"]
    Running["Running"]
    Stopped["Stopped"]
    Deleted["Deleted"]
    
    Created -->|"docker start"| Running
    Running -->|"docker stop"| Stopped
    Running -->|"docker restart"| Running
    Stopped -->|"docker start"| Running
    Stopped -->|"docker rm"| Deleted
    
    subgraph Note["docker run = create + start"]
    end
명령어설명
docker create컨테이너 생성 (실행 안 함)
docker start중지된 컨테이너 시작
docker runcreate + start (생성 + 실행)
docker stop컨테이너 중지 (SIGTERM)
docker kill컨테이너 강제 종료 (SIGKILL)
docker rm컨테이너 삭제

🎯 실습: Nginx 웹서버

1. 기본 실행

# nginx 실행
docker run -d --name web -p 8080:80 nginx
 
# 확인
docker ps
curl http://localhost:8080

2. 커스텀 HTML

# 로컬에 HTML 파일 생성
mkdir -p ~/docker-test
echo "<h1>Hello Docker!</h1>" > ~/docker-test/index.html
 
# 볼륨 마운트로 실행
docker run -d \
    --name web-custom \
    -p 8081:80 \
    -v ~/docker-test:/usr/share/nginx/html:ro \
    nginx
 
# 확인
curl http://localhost:8081

3. 컨테이너 내부 확인

# 접속
docker exec -it web-custom sh
 
# 내부에서 확인
ls /usr/share/nginx/html
cat /etc/nginx/nginx.conf
exit
 
# 로그 확인
docker logs web-custom

4. 정리

# 중지 및 삭제
docker stop web web-custom
docker rm web web-custom
 
# 또는 한 번에
docker rm -f web web-custom

🎯 실습: MySQL

# MySQL 실행
docker run -d \
    --name my-mysql \
    -e MYSQL_ROOT_PASSWORD=rootpass \
    -e MYSQL_DATABASE=testdb \
    -e MYSQL_USER=testuser \
    -e MYSQL_PASSWORD=testpass \
    -p 3306:3306 \
    mysql:8.0
 
# 로그 확인 (시작 완료까지 대기)
docker logs -f my-mysql
 
# MySQL 접속
docker exec -it my-mysql mysql -u root -p
# 비밀번호: rootpass
 
# SQL 실행
SHOW DATABASES;
USE testdb;
CREATE TABLE test (id INT, name VARCHAR(50));
INSERT INTO test VALUES (1, 'hello');
SELECT * FROM test;
exit
 
# 정리
docker rm -f my-mysql

📋 주요 명령어 요약

이미지

docker pull <image>           # 다운로드
docker images                 # 목록
docker rmi <image>            # 삭제
docker image prune            # 미사용 정리

컨테이너

docker run -d --name <n> -p <host>:<container> <image>
docker ps                     # 실행 중 목록
docker ps -a                  # 모든 목록
docker stop <n>               # 중지
docker start <n>              # 시작
docker rm <n>                 # 삭제
docker rm -f <n>              # 강제 삭제

디버깅

docker logs <n>               # 로그
docker logs -f <n>            # 실시간 로그
docker exec -it <n> sh        # 접속
docker inspect <n>            # 상세 정보
docker stats                  # 리소스 사용량

정리

docker container prune        # 중지된 컨테이너 삭제
docker image prune -a         # 미사용 이미지 삭제
docker system prune           # 전체 정리
docker system prune -a        # 전체 정리 (이미지 포함)

🔗 시리즈 네비게이션

시리즈 목차로 돌아가기


🔗 관련 문서


🔗 참고 자료