Docker로 컨테이너를 실행하는 간단한 방법은 터미널에서 docker run 명령어를 사용하는 것입니다. 설정이 복잡하지 않을 때는 docker run 명령어로 실행하는 것이 그다지 문제가 되지 않지만, 설정이 복잡해질 경우에는 명령어가 굉장히 복잡해지기 때문에 현실적으로 사용하기가 어렵습니다. 이 포스트에서는 조금 더 편리한 사용을 위해 YAML 방식의 설정 파일을 이용하는 docker-compose를 사용하여 컨테이너를 실행할 예정입니다.
1. 환경설정
홈디렉토리에 Docker 및 Plex Media Server의 설정을 저장할 디렉토리를 아래와 같이 생성합니다.
docker-compose.yml 파일을 다음과 같이 생성합니다. 자신의 환경에 맞게 수정하세요.
[계정@localhost ~]$>cd~/docker
[계정@localhost ~/docker]$>vim docker-compose.yml
version:'2'
services:plex:
container_name:plex
image:plexinc/pms-docker
restart:unless-stopped
networks:
-UDN_Service
ports:
-32400:32400/tcp
-3005:3005/tcp
-8324:8324/tcp
-32469:32469/tcp
-1900:1900/udp
-32410:32410/udp
-32412:32412/udp
-32413:32413/udp
-32414:32414/udp
volumes:
-/storage/public:/data
-/home/계정/docker/plex/config:/config
environment:
-PLEX_UID=1000
-PLEX_GID=100
-TZ=Asia/Seoul
-VERSION=latest
-PLEX_CLAIM=claim-TB4R~~~~~와 같은 claim token
-ADVERTISE_IP=http://외부에 공개할 IP 주소 또는 URL:32400/
hostname:사용할 Plex Media Server 이름
networks:
UDN_Database:
external:
name:UDN_Database
UDN_Service:
external:
name:UDN_Service
* networks: docker-compose가 생성하는 기본 네트워크가 아닌 별도의 네트워크를 사용하겠다는 의미입니다. 이 항목을 설정하지 않으면 docker-compose가 생성하는 기본 네트워크를 사용하게 되는데, docker-compose.yml 파일이 있는디렉토리명_default와 같은 이름으로 생성됩니다. docker-compose.yml에 지정된 모든 Docker 컨테이너는 별도 설정이 없을 경우 기본적으로 docker-compose가 생성한 기본 네트워크에 연결됩니다.
[계정@localhost ~/docker]$>docker networkls
NETWORK ID NAME DRIVER SCOPE
3640e59420fe UDN_Database bridgelocal
e38fb7c9fe3c UDN_Service bridgelocal
4398feaef58e bridge bridgelocal
f780747b759b docker_default bridgelocal
4756bb8ee162 host hostlocal
0bedac919e79 none nulllocal
networks:에서 지정한 네트워크는 docker-compose.yml 파일에 설정되어 있어야 합니다. Database용 네트워크(UDN_Database)와 서비스용 네트워크(UDN_Service)로 각각 설정하였고, Plex Media Server 컨테이너는 UDN_Service 네트워크를 사용하도록 지정하였습니다.
* volumes: Docker 컨테이너(Plex Media Server)와 Host PC의 디렉토리 연결을 위한 항목입니다.
/storage/public:/data는 컨텐츠가 저장되어 있는 Host PC의/storage/public디렉토리를 Docker 컨테이너(Plex Media Server)의/data디렉토리에 연결한다는 의미입니다. 이 설정을 사용해 Host PC의 컨텐츠를 Docker 컨테이너(Plex Media Servder)를 통해 서비스 할 수 있습니다.
/storage/public을 자신의 환경에 맞게 변경하세요.
/home/계정/docker/plex/config:/config는 Host PC의/home/계정/docker/plex/config디렉토리를 Docker 컨테이너(Plex Media Server)의/config디렉토리에 연결한다는 의미입니다.
Docker 컨테이너(Plex Media Server)의/config디렉토리는 Plex Media Server의 설정이 저장되는 디렉토리입니다. 이 설정을 사용해 Docker 컨테이너(Plex Media Server)의 설정을 Host PC에 영구적으로 저장할 수 있습니다. 설정하지 않아도 무방하나 이런 경우 컨테이너를 삭제하면 설정이 초기화됩니다. Plex Media Server의 설정을 계속 유지하기 위해 컨테이너 내부가 아닌 Host PC에 설정을 저장하는 것이 좋습니다. /home/계정/docker/plex/config를 자신의 환경에 맞게 변경하세요.
* environment: Docker 컨테이너(Plex Media Server)의 환경변수를 설정하기 위한 항목입니다.
environment에서 중요한 항목은PLEX_CLAIM과ADVERTISE_IP입니다. PLEX_CLAIM코드는https://plex.tv/claim에 접속하여 받을 수 있습니다.
시간제한이 있으므로 유의하세요
ADVERTISE_IP는 외부에서 Plex Media Server에 접속할 수 있도록 IP 또는 URL을 설정하는 항목입니다. ADVERTISE_IP를 설정하지 않으면 Plex Media Server가 실행되는 동일 네트워크에서만 접속할 수 있습니다.
2. 실행
docker-compose.yml 파일을 생성한 후 다음과 같은 명령어로 컨테이너를 실행합니다.
[계정@localhost ~]$>cd~/docker
[계정@localhost ~/docker]$>docker-compose up-dplex
docker-compose.yml에서 plex라는 이름을 가진 컨테이너를 백그라운드(-d)로 실행(up)하라는 의미입니다. -d옵션을 주지 않으면 터미널 창을 닫을 때 Docker 컨테이너(Plex Media Server)가 같이 종료됩니다.
Docker는 기본적으로 Linux에서 동작합니다. Windows 또는 Mac에서는 Docker for Windows 또는 Docker for Mac을 설치하세요. 필자는 Arch Linux에서 Docker를 설치하였지만, Docker의 특성상 다른 배포판에서도 간단히 설치할 수 있습니다.
docker rmi ubuntu 같이 이름만 지정하면 ubuntu 이름을 가진 모든 이미지가 삭제됨
이미지에서 (종료상태를 포함한) 파생된 컨테이너가 하나라도 있다면 이미지는 삭제할 수 없음
ㅇ 이미지 검색하기
docker search ubuntu
: ubuntu 관련 이미지들이 검색됨
ㅇ 컨테이너 로그 보기 (logs)
docker logs [OPTIONS] CONTAINER
ex) --tail옵션으로WORDPRESS 로그마지막 10줄만 출력
docker ps
docker logs --tail10 ${WORDPRESS_CONTAINER_ID}
ex) 실시간 로그 확인 ( 중지는 ctrl-c )
docker logs-f${WORDPRESS_CONTAINER_ID}
ㅇ 컨테이너에 접속하기
docker attach CONTAINER
bash shell 이 실행된 컨테이너라면 입력 가능, 그외에는 출력만 볼 수 있음
exit 또는 ctrl-D 를 입력하면 컨테어나가 정지되므로 Ctrl-P , Ctrl-Q 로 컨테이너를 정지시키지 않고 빠져나온다.
ㅇ 컨테이너 명령어 실행하기 (exec)
: 실행중인 컨테이너에 들어가보거나 컨테이너의 파일을 실행하고 싶을 때 exec
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
ex) 실행중인 mysql 에 접속
dockerexec-itmysql /bin/bash
# MySQL test
$mysql-uroot
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wp |
+--------------------+
5 rowsinset(0.00 sec)
mysql> quit
exit
ex)쉘로 완전한 권한을 얻는 방법말고 바로mysql명령어를 실행
dockerexec-itmysql mysql-uroot
# MySQL test
$mysql-uroot
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wp |
+--------------------+
5 rowsinset(0.00 sec)
mysql> quit
ㅇ 컨테이너 업데이트
도커에서 컨테이너를 업데이트 하려면 새 버전의 이미지를 다운(pull)받고 기존 컨테이너를 삭제(stop,rm) 한 후 새 이미지를 기반으로 새 컨테이너를 실행(run)하면 됩니다.
ㅇ 컨테이너 데이타 백업
컨테이너 삭제시 유지해야하는 데이터는 반드시 컨테이너 내부가 아닌 외부 스토리지에 저장해야 합니다.
데이터 볼륨Data volumes을 컨테이너에 추가해서 사용해하면 해당 디렉토리는 컨테이너와 별도로 저장되고 컨테이너를 삭제해도 데이터가 지워지지 않습니다.
ex)MySQL이라면/var/lib/mysql디렉토리에 모든 데이터베이스 정보가 담기므로 호스트의 특정 디렉토리를 연결해주면 됩니다.
# before
docker run-d-p3306:3306\
-eMYSQL_ALLOW_EMPTY_PASSWORD=true\
--namemysql\
mysql:5.7
# after
docker run-d-p3306:3306\
-eMYSQL_ALLOW_EMPTY_PASSWORD=true\
--namemysql\
-v/my/own/datadir:/var/lib/mysql\# <- volume mount
mysql:5.7
위 샘플은 호스트의/my/own/datadir디렉토리를 컨테이너의/var/lib/mysql디렉토리로 마운트 하였습니다. 이제 데이터베이스 파일은 호스트의/my/own/datadir디렉토리에 저장되고 컨테이너를 삭제해도 데이터는 사라지지 않습니다. 최신버전의 MySQL 이미지를 다운받고 다시 컨테이너를 실행할 때 동일한 디렉토리를 마운트 한다면 그대로 데이터를 사용할 수 있습니다.
[ Docker Compose ]
지금까지 도커를 커맨드라인에서 명령어로 작업했습니다. 지금은 간단한 작업만 했기 때문에 명령이 길지 않지만 컨테이너 조합이 많아지고 여러가지 설정이 추가되면 명령어가 금방 복잡해집니다.