안녕하세요.
쉬운 IT의 시작, 아이티이지(ITEASY) 입니다.

오늘은 도커(Docker) 매뉴얼에 대해 소개하고자 합니다.
도커는 애플리케이션을 컨테이너화하여 개발, 테스트, 운영 환경에서 일관성을 유지하는데 유용한 도구로 도커의 주요 특징과 활용 방법에 대해서 알려드릴게요!

➡ 해당 매뉴얼은 도커(Docker)를 처음 사용하는 사용자를 위해 작성되었으며, 컨테이너의 기본 개념부터 설치, 운영, 고급 기능까지 상세히 설명합니다.

🔎 핵심 요약본

✅ 컨테이너란?
컨테이너는 애플리케이션과 그 종속성을 하나의 패키지로 묶은 경량화된 가상화 기술입니다.
호스트 OS 커널을 공유하여 자원 효율성이 높습니다.

✅ 도커의 역할
도커는 컨테이너를 생성, 관리, 배포하는 플랫폼으로,
이미지와 컨테이너를 통해 애플리케이션을 쉽게 실행할 수 있습니다.

✅ 가상 머신과의 차이
컨테이너는 VM보다 자원 소모가 적고, 시작 시간이 빠르며, 이식성이 뛰어납니다.

✅ 설치 방법
– Ubuntu 설치 : 공식 저장소를 통해 설치하며, 예를 들어 sudo apt-get install -y docker-ce 명령어를 사용합니다. 자세한 단계는 공식 문서를 참고하세요.
– Windows/macOS 설치 : Docker Desktop을 다운로드하여 설치하면 GUI로 관리 가능합니다. 다운로드 링크는 Docker Desktop에서 확인하세요.

✅ 기본 운영 명령어
– 이미지 관리 : docker pull <이미지명>으로 Docker Hub에서 이미지를 다운로드, docker images로 목록 확인
– 컨테이너 관리 : docker run -d -p 8080:80 –name my_web_server ubuntu로 컨테이너 실행, docker ps로 실행 중인 컨테이너 확인, docker stop으로 중지
– 로그 확인 : docker logs <컨테이너ID>로 컨테이너 로그 확인 가능

➡ 도커 매뉴얼은 실무에서 바로 적용할 수 있는 예제와 함께 제공되며, 초보자도 쉽게 따라 할 수 있습니다.

🔎 도커 매뉴얼 상세 내용

컨테이너와 도커의 기본 개념부터 설치, 운영, 고급 기능까지 포괄적으로 다루며, 초보자도 이해할 수 있도록 단계별 지침과 예제를 포함했습니다. 2025년 3월 3일 기준으로 최신 정보를 반영하였으며, 실무에서 바로 활용 가능한 정보를 제공합니다.

1️⃣ 도커와 컨테이너의 소개

1-1. 컨테이너란 무엇인가?
컨테이너는 애플리케이션과 그 실행에 필요한 모든 종속성(라이브러리, 설정 파일 등)을 하나의 패키지로 묶은 경량화된 가상화 기술입니다. 호스트 운영체제(OS)의 커널을 공유하며, 프로세스, 파일 시스템, 네트워크 등을 독립적으로 관리합니다. 이는 가상 머신(VM)과 달리 전체 OS를 에뮬레이션하지 않아 자원 효율성이 높고, 시작 시간이 빠릅니다.

컨테이너를 배송 컨테이너에 비유할 수 있습니다. 배송 컨테이너는 내용물을 바꾸지 않고 어디서나 동일하게 운송되듯, 컨테이너는 애플리케이션을 환경에 상관없이 일관되게 실행할 수 있습니다.

1-2. 도커의 정의와 주요 특징
도커는 컨테이너를 생성, 관리, 배포하는 오픈소스 플랫폼으로, 2013년 도입된 이후 널리 사용되고 있습니다. 주요 특징은 다음과 같습니다.

  • 이미지와 컨테이너 : 이미지는 읽기 전용 템플릿으로, 컨테이너는 이미지의 실행 인스턴스입니다.
  • 크로스 플랫폼 : Linux, Windows, macOS에서 사용 가능하며, Docker Hub를 통해 이미지 공유 가능
  • 생태계 : 공식 이미지(예: Ubuntu, Node.js)와 커뮤니티 이미지가 풍부하게 제공됩니다.

도커는 개발, 테스트, 운영 환경에서 일관성을 유지하며, 마이크로서비스 아키텍처나 CI/CD 파이프라인에서 특히 유용합니다.

1-3. 컨테이너와 가상 머신의 차이점

  • 가상 머신(VM) : 하드웨어를 가상화하여 완전한 OS를 실행, 자원 소모가 크고, 시작 시간이 느림
  • 컨테이너 : OS 커널을 공유하며, 애플리케이션과 필요한 라이브러리만 포함, VM보다 가볍고 빠르며, 자원 효율성이 높음
  • 주요 차이 :
    1. 격리 수준 : VM은 하드웨어 수준, 컨테이너는 OS 수준에서 격리
    2. 성능 : 컨테이너는 빠른 시작과 낮은 자원 소모 제공
    3. 이식성 : 컨테이너는 환경에 상관없이 동일하게 실행 가능

도커는 컨테이너화의 대표적인 도구로, Podman과 같은 대안도 있지만, 현재 가장 널리 사용됩니다. 특히, 생산 환경에서는 보안 요구 사항에 따라 다른 도구를 고려할 수 있지만, 개발 및 테스트에서는 도커가 선호됩니다.

2️⃣ 도커 설치

2-1. Ubuntu에 설치
Ubuntu 20.04 이상에서 도커를 설치하는 공식 방법은 다음과 같습니다.
1. 기존 도커 버전 제거

sudo apt-get remove docker docker-engine docker.io containerd runc

2. 필수 패키지 설치

sudo apt-get install -y ca certificates curl gnupg lsb-release

3. Docker GPG 키 추가

curl -fsSL https://download.docker.com/linux/Ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4. 안정 저장소 추가

echo "deb [arch=$(dpkg --print architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/Ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev null

5. 패키지 인덱스 업데이트 및 도커 설치

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

6. 도커 서비스 시작 및 부팅 시 자동 시작 설정

sudo systemctl start docker
sudo systemctl enable docker

7. 설치 확인

docker --version

➡ 이 과정은 공식 문서(Docker Engine Install Ubuntu)를 기반으로 하며, 최신 버전을 보장합니다.

2-2. Windows에 설치
Windows에서는 Docker Desktop을 사용합니다.
1. 공식 웹사이트(Docker Desktop)에서 설치 프로그램 다운로드
2. 설치 프로그램 실행하고, 안내에 따라 설치 완료
3. Docker Desktop 실행 후 Docker Hub 계정으로 로그인하거나 새 계정 생성
4. 명령 프롬프트에서 설치 확인

docker --version

➡ Windows와 macOS에서는 Docker Desktop이 Linux VM 위에서 동작하므로, 성능 고려가 필요할 수 있습니다.

2-3. macOS에 설치
macOS 설치도 Docker Desktop을 사용하며, 과정은 Windows와 유사합니다.
1. 공식 웹사이트(Docker Desktop)에서 설치 프로그램 다운로드
2. 설치 프로그램 실행하고, 안내에 따라 설치 완료
3. Docker Desktop 실행 후 로그인
4. 터미널에서 설치 확인

docker --version

3️⃣ 기본 도커 명령어

3-1. 이미지 관리

  • 이미지 다운로드: Docker Hub에서 이미지를 가져옵니다. (예시)
docker pull Ubuntu
  • 이미지 목록 확인
docker images
  • 이미지 제거
docker rmi <이미지ID>

➡ 이미지 ID는 docker images 명령어로 확인 가능하며, 추가로 사용하지 않는 이미지를 정리하려면 다음 명령어를 사용할 수 있습니다.

docker image prune

3-2. 컨테이너 관리

  • 컨테이너 실행
docker run [옵션] <이미지명>
  • 일반적인 옵션 :
  1. -d : 백그라운드(분리 모드)로 실행
  2. -p <호스트포트> : <컨테이너포트>: 포트 매핑
  3. –name <컨테이너명> : 컨테이너에 이름 지정 (예시)
docker run -d -p 8080:80 --name my_web_server Ubuntu
  • 실행 중인 컨테이너 목록
docker ps
  • 모든 컨테이너(중지된 포함) 확인
docker ps -a
  • 컨테이너 중지
docker stop <컨테이너ID 또는 이름
  • 컨테이너 제거
docker rm <컨테이너ID 또는 이름>
  • 실행 중인 컨테이너 제거 시
docker rm -f <컨테이너ID 또는 이름>
  • 로그 확인
docker logs <컨테이너ID 또는 이름>

➡ 위의 명령어들은 도커의 기본적인 사용을 위한 필수 도구입니다.

4️⃣ Dockerfile을 사용한 커스텀 이미지 빌드

Dockerfile은 이미지를 빌드하기 위한 지침을 포함한 텍스트 파일입니다.
아래는 Apache2 웹 서버를 위한 간단한 예제입니다.

4-1. 예제 : 간단한 웹 서버 빌드
1. 프로젝트 디렉토리 생성

mkdir my_web_server
cd my_web_server

2. Dockerfile 생성, 내용은 다음과 같음

FROM Ubuntu

# 패키지 인덱스 업데이트 및 Apache2 설치
RUN apt-get update && apt-get install -y Apache2

# 포트 80 노출
EXPOSE 80

# 컨테이너 시작 시 실행 명령어
CMD ["apache2ctl", "-D", "FOREGROUND"]

➡ 참고 : Ubuntu 이미지는 크기가 클 수 있으므로, 필요 시 더 작은 베이스 이미지(예: Alpine)를 고려할 수 있습니다.

3. 이미지 빌드

docker build -t my_apache_image .

➡ -t 옵션으로 이미지에 my_apache_image라는 태그를 지정

4. 컨테이너 실행

docker run -d -p 8080:80 my_apache_image

➡ 이는 컨테이너 내부의 포트 80을 호스트의 8080번 포트에 매핑하며, http://localhost:8080 에서 웹 서버에 접근 가능합니다. 이 과정은 커스텀 이미지를 생성하고 실행하는 기본적인 방법을 보여줍니다.

5️⃣ 볼륨을 사용한 데이터 관리

볼륨은 컨테이너 재시작 시 데이터 유지 및 컨테이너 간 데이터 공유를 가능하게 합니다.
5-1. 볼륨 이해

  • 볼륨 : 호스트 머신의 디렉토리를 컨테이너 내부에 마운트
  • 사용 사례 : 데이터 지속성 필요 시(예: 데이터베이스), 호스트와 데이터 공유 시 유용
  • 볼륨 유형
    – 명명된 볼륨 : 별도로 생성 및 관리 가능
    – 익명 볼륨 : 컨테이너 생성 시 자동 생성, 컨테이너 제거 시 삭제
  • 명명된 볼륨 생성 (예시)
docker volume create my_volume
  • 사용 (예시)
docker run -d -v my_volume:/container/path my_image

5-2. 컨테이너에 볼륨 마운트
호스트 디렉토리를 컨테이너에 마운트

docker run -d -v /home/user/data:/var/data my_apache_image

➡ 이는 호스트의 /home/user/data를 컨테이너의 /var/data에 매핑, 변경 사항이 양방향으로 반영됩니다.

5-3. 지속적인 데이터 저장
볼륨 사용 시 컨테이너 제거 후에도 데이터 유지, 특히 데이터베이스와 같은 상태 저장 애플리케이션에 필수적입니다.

6️⃣ 네트워크 관리

도커는 컨테이너 간 통신과 호스트와의 연결을 위한 네트워킹 기능을 제공합니다.
6-1. 기본 네트워크
기본적으로 bridge 네트워크가 생성되며, 컨테이너 간 통신과 호스트와의 연결 가능

6-2. 커스텀 네트워크 생성

  • 커스텀 네트워크 생성
docker network create my_network
  • 컨테이너 연결
docker run -d --network my_network my_image

6-3. 컨테이너 간 통신
동일 네트워크에 연결된 컨테이너는 컨테이너 이름으로 통신 가능
(예시) web 컨테이너가 db 컨테이너와 통신 시 db를 호스트명으로 사용

6-4. 호스트에서 컨테이너 접근

  • 포트 매핑으로 호스트에서 컨테이너 접근
docker run -d -p 8080:80 my_apache_image

➡ http://localhost:8080 에서 웹 서버 접근 가능

7️⃣ 보안 고려사항

도커 사용 시 보안은 매우 중요합니다. 다음은 몇 가지 모범 사례입니다.
7-1. 비루트 사용자 실행
기본적으로 컨테이너는 루트로 실행되며, 이는 보안 위험을 초래할 수 있습니다.
Dockerfile에서 비루트 사용자 생성

FROM Ubuntu
RUN useradd -m myuser
USER myuser

7-2. 비밀 관리
비밀번호, API 키 등 민감 정보는 환경 변수나 Docker Secrets를 사용해 관리 (예시)

docker run -e MYSQL_ROOT_PASSWORD=password my_image

7-3. 컨테이너 간 안전 통신
컨테이너 간 통신은 암호화된 채널(예: HTTPS)로 보호, 특히 민감 데이터 처리 시 필수

8️⃣ 일반적인 문제 해결

도커 사용 중 발생할 수 있는 문제와 해결 방법
8-1. 컨테이너 시작 실패

  • 로그 확인
docker logs <컨테이너ID>

➡ 오류 메시지로 원인 파악

  • 이미지 확인 : 이미지 빌드 오류 없도록 확인

8-2. 권한 문제

  • 도커 그룹에 사용자 추가
sudo usermod -aG docker $USER

➡ 이후 로그아웃 후 재로그인

  • 루트로 실행 : sudo 사용

8-3. 일반적인 오류 메시지

  • “permission denied”: 권한 확인
  • “no such device”: 사용하려는 디렉토리/볼륨 존재 확인
  • “docker: command not found”: PATH에 도커 실행 파일 없음, 설치 확인
  • “conflict, the name is already in use”: 동일 이름 컨테이너 제거
docker rm <컨테이너명>

9️⃣ 고급 주제

9-1. docker compose로 멀티 컨테이너 애플리케이션 관리
docker compose는 여러 컨테이너를 정의하고 실행하는 도구입니다. (예시)
1. docker-compose.yml 생성

version: '3'
services:
  web:
    image: my_apache_image
    ports:
      - "8080:80"
  db:
    image: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
    volumes:
      - db_data:/var/lib/mysql
volumes:
  db_data:

2. 서비스 시작

docker compose up -d

➡ 최근 버전(20.10 이상)에서는 docker compose 명령어 사용

9-2. docker swarm으로 클러스터링
docker swarm은 여러 도커 호스트를 클러스터로 관리

  • 스웜 초기화
docker swarm init
  • 노드 추가 : 초기화 후 제공되는 명령어로 노드 조인
  • 서비스 배포
docker service create --name my_service my_image

➡ 스웜은 확장성과 부하 분산에 유용하지만, 설정이 복잡할 수 있습니다.


오늘 공유해드린 ‘도커(Docker) 매뉴얼’ 기술 컨텐츠가
도움이 되셨길 바라면서 마무리하겠습니다!

다음에도 유익한 정보로 찾아오도록 하겠습니다.
감사합니다.

IT it easy, ITEASY

답글 남기기