Linux

도커(Docker): 사용법

dewstream 2024. 12. 16. 18:30

※ Docker Usage Guide
 
안녕하세요. 듀스트림입니다.
 
지난 포스팅에서는 VM에 Linux 설치 방법을 알려드렸습니다.
오늘은 지난 포스팅에서 설치한 Linux에서 Docker 사용법에 대해 알려드리겠습니다.
 
리눅스 설치는 지난 포스팅을 참고 부탁드립니다.

 

Oracle VirtualBox를 사용하여 VM에 Linux 설치

※ Install Linux on a VM using Oracle VirtualBox.※ Version: Oracle VirtualBox 7.1.4, Linux 8.10 (Rocky).※ 내용은 Windows 기준입니다. 안녕하세요. 듀스트림입니다. 누가 그러더라고요. "PostgreSQL을 Linux에 설치하

dewstream.tistory.com

 
그럼 Docker가 무엇이고 왜 쓰는지에 대해 먼저 알아보겠습니다.


Docker?

Docker는 컨테이너(Container) 기술을 활용하여 애플리케이션과 그 환경을 패키지화하는 오픈소스 플랫폼입니다.
애플리케이션, 라이브러리, 의존성 파일을 독립적인 단위로 묶어, 어디서든 일관되게 실행할 수 있도록 해줍니다.
 
• 컨테이너: 가상머신(VM)과 유사하지만, OS 커널을 공유하여 더 가볍고 빠르게 실행할 수 있는 격리된 실행 환경
• 이미지(Image): 컨테이너를 실행하는데 필요한 모든 것을 포함한 파일(애플리케이션 코드, 라이브러리, 종속성 등)
• 컨테이너와 이미지의 차이: 이미지는 정적인 파일, 컨테이너는 이미지를 실행한 프로세스라고 이해할 수 있습니다.
 

Docker를 사용하는 이유

Docker를 사용하는 이유는 개발, 테스트, 배포 환경의 일관성 유지와 효율적인 자원 활용에 있습니다.
 
• 환경 일관성 보장:
→ 개발자, 테스트팀, 운영팀이 같은 환경을 유지할 수 있습니다.
→ "로컬에서는 잘 돌아가는데 서버에서는 안 돼" 같은 문제를 줄여줍니다.
 
• 개발 생산성 향상:
→ 개발자는 새로운 개발 환경을 빠르게 구성할 수 있습니다.
→ 코드를 작성하고 컨테이너만 실행하면 바로 테스트 가능합니다.
 
• 경량화된 실행 환경:
→ Docker 컨테이너는 OS 커널을 공유하므로, VM보다 가볍고 더 빠르게 시작할 수 있습니다.
 
• DevOps와 CI/CD 자동화 지원:
→ CI/CD 파이프라인에서 테스트 환경을 자동으로 생성 및 제거할 수 있습니다.
→ 애플리케이션 배포 자동화를 지원합니다.
 
• 다양한 OS와 클라우드 플랫폼 지원:
→ Windows, Linux, MacOS 환경에서 동일한 컨테이너 이미지를 실행할 수 있습니다.
→ AWS, GCP, Azure 등 클라우드 플랫폼에서도 동일한 Docker 이미지를 배포할 수 있습니다.
 

하지만, 큰 문제점이 하나 있습니다.

Docker는 공유 커널 구조로 호스트 OS의 커널을 공유하기 때문에, 호스트 OS에 문제(커널 패닉, 메모리 부족(OOM), 디스크 장애 등)가 발생하면 컨테이너도 함께 중단됩니다.
 
물론 해결 방법은 있습니다.
컨테이너 오케스트레이션 도구(Kubernetes, Docker Swarm, Nomad 등)를 사용하면 됩니다.
오케스트레이션 도구는 컨테이너를 여러 노드(서버)에 분산시켜, 한 서버가 죽어도 컨테이너가 다른 서버에서 동작하도록 보장합니다.
 
이제 Linux에서 Docker를 설치하고 사용하는 방법에 대해 간단한 실습을 통해 알아보도록 하겠습니다.


1. Docker 설치

▸ repo 설정

dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

 
▸ Docker Install

dnf install -y docker-ce docker-ce-cli containerd.io

 
▸ Docker 서비스 시작 및 자동 시작 설정

systemctl start docker
systemctl enable docker

 
▸ Docker 권한 설정(필요시)
→ Docker 소켓(/var/run/docker.sock)에 접근 권한 부여

usermod -aG docker <사용자명>

 
▸ Docker 동작 확인

docker version
docker run hello-world

[그림 1] Hello from Docker!

 

2. Docker-Compose 설치

Docker-Compose는 여러 개의 Docker 컨테이너를 하나의 YAML 파일(docker-compose.yml)로 정의하고 동시에 관리할 수 있는 도구입니다.
 
▸ Docker-Compose 다운로드

curl -L "https://github.com/docker/compose/releases/download/v2.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

 
▸ 실행 권한 추가

chmod +x /usr/local/bin/docker-compose

 
▸ 버전 확인

docker-compose version

 

3. Rocky Linux 컨테이너 실행

▸ Rocky8 Linux 이미지 다운로드

docker pull rockylinux:8

 
▸ 컨테이너 실행

# docker run -it --name 컨테이너명 rockylinux:8 /bin/bash
docker run -it --name rocky8-test-container rockylinux:8 /bin/bash

 
▸ 컨테이너 OS 버전 확인

cat /etc/os-release

 
 
여기까지 하셨다면 Rocky8 Linux가 설치된 컨테이너 하나가 정상적으로 생성되셨을 겁니다.
이제 생성한 컨테이너를 이미지로 변환 후 다른 환경의 PC에서 사용하는 방법을 알아보겠습니다.
 

4. 컨테이너를 이미지로 저장

▸ 실행 중인 도커 컨테이너 확인
→ 도커 컨테이너 내부에 있다면 exit 명령으로 나와서 수행

docker ps -a

 
▸ 컨테이너를 Docker 이미지로 저장
 

# docker commit 컨테이너명 이미지명:태그
docker commit rocky8-test-container my-rocky8-image:latest

 
▸ 저장된 이미지 확인

docker images

 

5. 저장된 이미지 파일 내보내기

▸ Docker 이미지 저장

# docker save -o 파일명.확장자 이미지명:태그
docker save -o rocky8-test-image.tar my-rocky8-image:latest

 
▸ 저장한 이미지 파일 확인

ls -lh rocky8-test-image.tar

 

6. 이미지 파일 로드

▸ Docker 이미지 로드

# docker load -i /이미지파일경로/파일명.확장자
docker load -i /이미지파일경로/rocky8-test-image.tar

 
▸ 로드된 이미지 확인

docker images

 
▸ 이미지로 컨테이너 실행

# docker run -it --name 컨테이너명 파일명:확장자 /bin/bash
docker run -it --name rocky8-test-container rocky8-test-image:latest /bin/bash

 

+ 추가로 파일 시스템만 옮기고 싶은 분들도 계실 수 있으니까 그 내용도 다루도록 하겠습니다.

▸ Docker 컨테이너 내보내기

# docker export -o 파일명.확장자 컨테이너명
docker export -o rocky8-test-container.tar rocky8-test-container

 
▸ Docker 컨테이너 가져오기

# docker import /이미지파일경로/파일명.확장자 이미지명:태그
docker import /이미지파일경로/rocky8-test-container.tar rocky8-test-container:latest

 
▸ 가져온 이미지 확인

docker images

 
▸ 이미지로 컨테이너 실행

# docker run -it --name 컨테이너명 파일명:확장자 /bin/bash
docker run -it --name rocky8-test-container rocky8-test-image:latest /bin/bash

 

+ 두 방법의 차이를 표로 간략히 정리했습니다.

방법 save, commit export
단위 Docker 이미지 전체 파일 시스템
메타데이터 포함 (환경 변수, 포트 등 포함)
파일 크기 상대적으로 큼 상대적으로 작음
복원 방식 load import
권장 용도 컨테이너 전체 백업/이전 단순 파일 시스템 복원

 

정리하자면,

이미지를 그대로 옮기고 싶다면 docker commit, docker save → docker load로 하시고,
단순히 파일 시스템만 옮기고 싶다면 docker export → docker import를 사용하시면 될 거 같습니다.


오늘 포스팅에서는 Docker 사용법에 대해 알아봤습니다.
 
Docker-Compose는 왜 설치했냐는 질문을 하실 수도 있는데, 추후 다룰 PostgreSQL의 HA 도구인 Patroni 내용에서 사용 예정입니다.
 
다음 포스팅도 기대해주세요!