Docker Basics
Docker 설치, 기본 명령어, 이미지/컨테이너 개념
📚 시리즈 네비게이션
| 이전 | 현재 | 다음 |
|---|---|---|
| - | Docker Basics | Dockerfile & 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
| 항목 | Image | Container |
|---|---|---|
| 비유 | 클래스 | 인스턴스 |
| 상태 | 불변 (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 --versionCentOS/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 run | create + 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:80802. 커스텀 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:80813. 컨테이너 내부 확인
# 접속
docker exec -it web-custom sh
# 내부에서 확인
ls /usr/share/nginx/html
cat /etc/nginx/nginx.conf
exit
# 로그 확인
docker logs web-custom4. 정리
# 중지 및 삭제
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 # 전체 정리 (이미지 포함)🔗 시리즈 네비게이션
🔗 관련 문서
- Container Virtualization - 컨테이너 개념
- Linux Kernel Overview - 네임스페이스, cgroups