홈서버 (재)구축하기 - 4. Docker 설치 및 사용
컨테이너로 격리된 이미지를 통해 서비스를 손쉽게 운영하기
Docker란?
도커(Docker)는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다.
가상화 기술을 통해 구현한 가상 OS, 가상 HW을 에뮬레이팅하는 가상 머신(Virtual Machine)과는 다르게, Linux 커널과 리소스 격리 기술을 이용하여 프로세스를 하나의 컨테이너로 격리한다. 컨테이너는 우리가 아는 그 컨테이너에서 따온 단어로, 현실의 컨테이너 가건물처럼 컨테이너 속에는 필요한 모든 의존성이 이미지의 형태로 존재하고, 프로그램은 그 안에서 실행된다.
에뮬레이팅에 상당한 자원을 소비하는 가상 머신과 달리, 컨테이너 가상화 기술은 성능의 오버헤드가 적은 편이다. 이 특징 덕분에 다양한 서비스가 Docker를 통해 배포되고 있으며, 환경 및 의존성에 크게 신경 쓸 필요없이 서비스를 이용할 수 있다.
과거 홈서버를 운영할 때 대부분의 서비스를 Docker를 통해 운영했다. 앞으로 설명할 글에서 Docker이 자주 나오게 될 것이다… 직접 설치보다는 훨씬 간단하니까…
Docker는 Linux 커널을 사용하므로 Docker의 모든 명령어는 sudo 권한을 필요로 한다.
설치
아래에 서술된 방법은 현재 홈서버 환경인 우분투 기준이며, Docker 공식 홈페이지의 설치 방법에 나와있는 내용 중 일부이다.
- 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
- 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
- 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 ps
1 - 컨테이너 종료:
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