Skip to main content

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 # 전체 정리 (이미지 포함)

🔗 시리즈 네비게이션

이전다음
-Dockerfile & Image Build

시리즈 목차로 돌아가기


🔗 관련 문서


🔗 참고 자료