포스트

홈서버 (재)구축하기 - 4. Docker 설치 및 사용

컨테이너로 격리된 이미지를 통해 서비스를 손쉽게 운영하기

홈서버 (재)구축하기 - 4. Docker 설치 및 사용

Docker란?

도커(Docker)는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다.

위키백과 - 도커 (소프트웨어)

가상화 기술을 통해 구현한 가상 OS, 가상 HW을 에뮬레이팅하는 가상 머신(Virtual Machine)과는 다르게, Linux 커널과 리소스 격리 기술을 이용하여 프로세스를 하나의 컨테이너로 격리한다. 컨테이너는 우리가 아는 그 컨테이너에서 따온 단어로, 현실의 컨테이너 가건물처럼 컨테이너 속에는 필요한 모든 의존성이 이미지의 형태로 존재하고, 프로그램은 그 안에서 실행된다.

에뮬레이팅에 상당한 자원을 소비하는 가상 머신과 달리, 컨테이너 가상화 기술은 성능의 오버헤드가 적은 편이다. 이 특징 덕분에 다양한 서비스가 Docker를 통해 배포되고 있으며, 환경 및 의존성에 크게 신경 쓸 필요없이 서비스를 이용할 수 있다.

과거 홈서버를 운영할 때 대부분의 서비스를 Docker를 통해 운영했다. 앞으로 설명할 글에서 Docker이 자주 나오게 될 것이다… 직접 설치보다는 훨씬 간단하니까…

Docker는 Linux 커널을 사용하므로 Docker의 모든 명령어는 sudo 권한을 필요로 한다.

설치

아래에 서술된 방법은 현재 홈서버 환경인 우분투 기준이며, Docker 공식 홈페이지의 설치 방법에 나와있는 내용 중 일부이다.

  1. Docker의 GPG 키 추가
    1
    2
    3
    4
    
     $ sudo apt update
     $ sudo install -m 0755 -d /etc/apt/keyrings
     $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
     $ sudo chmod a+r /etc/apt/keyrings/docker.gpg
    
  2. Docker의 apt 저장소 설정
    1
    2
    3
    4
    5
    
     $ echo \
     "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
     "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
     sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
     $ sudo apt update
    
  3. Docker 설치
    1
    
     $ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    

    의존성과 플러그인까지 동시에 설치한다. 기존에 설치한 패키지가 있다면 제거 후 설치하는 것을 권장한다.

사용하기

Docker에 대한 세부적인 내용은 추후에 포스팅해보겠다.

예시: Minecraft Java Edition 서버

테스트 겸 예시로 추억의 마인크래프트 서버를 올려보자. 이미지는 itzg/docker-minecraft-server를 사용했으며, 이미지에 대한 자세한 내용은 공식 문서를 참고하자.

Manually

1
$ sudo docker run -v ~/minecraft-server:/data -e TYPE=SPIGOT -e EULA=TRUE -e MEMORY=8G -d -p 25565:25565 --name mc-server itzg/minecraft-server
  • -v ~/minecraft-server:/data: 컨테이너의 /data 디렉토리를 홈 디렉토리의 /minecraft-server 디랙토리에 마운트 한다.
  • -e TYPE=FORGE: 서버 구현물(Implementaion)로 Forge을 사용한다.
  • -e EULA=TRUE: Minecraft의 EULA(End User License Agreement)에 동의한다. 이 옵션을 사용하지 않을 경우 컨테이너가 실행되지 않는다.
  • -e MEMORY=2G: Implementation이 최대로 사용할 메모리 용량을 정한다.
  • -d: 컨테이너를 백그라운드로 실행한다. 이 옵션을 사용하지 않으면 ^C를 누르거나 로그아웃 시 컨테이너가 종료된다.
  • -p: 컨테이너 내에서 사용하는 포트를 호스트로 포워딩 시키기 위해 사용한다. 왼쪽이 호스트, 오른쪽이 컨테이너의 포트다. 25565가 마인크래프트의 기본 포트이므로 이를 사용한다.
  • --name mc-server: 컨테이너의 이름을 지정한다. 이름을 지정하지 않으면 무작위로 생성된 이름을 사용하나, 컨테이너 관리시 조금 번거로워지므로 이름은 지정하는 것을 권장한다.
  • itzg/minecraft-server: 사용할 이미지의 이름이다. 이 Parameter는 항상 맨 마지막에 위치한다.

Docker Compose 이용

위의 방법을 쓸 경우 입력해야할 명령어가 길어지거나, 옵션을 수정해야 한다면 상당히 귀찮아진다. 옵션을 바꾸고 싶다면 컨테이너를 멈춘 뒤 지우고 다시 명령어를 입력해 새로 만들어야하는 등, 명령어를 이용해 Docker를 이용하고자 할 경우 여러 가지 번거로움이 발생한다.

이런 작업을 보다 간편하게 해주는 것이 Docker Compose라는 플러그인이다. 원하는 디렉토리에 docker-compose.yml라는 이름으로 파일을 만든 후에 아래와 같이 내용을 작성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
  mc-server:                        # 서비스 이름
    container_name: mc-server       # 지정하지 않을 경우 서비스 이름을 사용
    image: itzg/minecraft-server
    ports:
      - "127.0.0.1:25565:25565"
    environment:                    # 컨테이너 내부에서 사용할 환경변수
      EULA: "TRUE"
      TYPE: FORGE
      MEMORY: 2G
    volumes:
      - ./data:/data
    restart: unless-stopped         # 직접 중단하기 전까지 계속 실행

명령어로 직접 실행했을 때의 옵션이 이 yml 파일의 내용에 대응된다는 것을 직관적으로 알 수 있다.


1
$ sudo docker compose up -d

이제 yml 파일을 저장한 경로에서 위의 명령어로 컨테이너를 실행해볼 수 있다.

자주 사용하는 Docker 명령어

컨테이너

  • 실행 중인 컨테이너 목록 확인: sudo docker ps1
  • 컨테이너 종료: sudo docker stop <컨테이너 이름>
  • 컨테이너 시작: sudo docker start <컨테이너 이름>
  • 컨테이너 재시작: sudo docker restart <컨테이너 이름>
  • 컨테이너 삭제: sudo docker rm <컨테이너 이름>
  • 컨테이너 내부에서 명령 실행: sudo docker exec -i <컨테이너 이름> <명령어>

이미지

  • pull 된 이미지 확인: sudo docker images
  • 이미지 삭제: sudo docker rmi <이미지 이름>

Compose

  • 컨테이너 백그라운드로 실행: sudo docker compose up -d
  • 컨테이너 중단 및 삭제2: sudo docker compose down

각주

  1. -a 옵션으로 실행 상태가 아닌 전체 컨테이너 목록을 볼 수도 있다. ↩︎

  2. volumes를 통해 마운트한 상태라면, 컨테이너의 데이터는 마운트한 디렉토리에 보존된다. ↩︎

이 글은 저작권자의 CC BY 4.0 라이센스를 따릅니다.