2023-04-02 16:02:14
OS에 이런저런 서비스를 올려서 사용하거나 지금의 저 처럼 홈 서버에 이런저런 시도를 많이 하는 경우 환경이 난잡해지고 이를 다른 기기에 그대로 옮길 생각을 하면 그 동안 어질러놓은 업보가 돌아올 것 같아 두렵기까지 합니다.
그래서 이를 점차 정리해나가기 위해서 결국 Docker로 전환하게 되었고 이에 대해서 시도하는 과정을 남기고자 합니다.
OS : Linux
배포판 : Ubuntu 18.04.5 LTS
커널 : GNU/Linux 4.15.0-192-generic x86_64
Nginx : nginx/1.19.0 (컴파일 설치)
해당 시스템에는 과거에 설치한 도커가 있는 상태이며 겸사겸사 구 버전의 도커를 삭제하고 신 버전의 도커를 설치한다.
이러한 과정은 공식 페이지에서 자세하게 소개하고 있으므로 링크의 글을 통하여 진행하면 편하다.
https://docs.docker.com/engine/install/ubuntu/
컴파일 방식이 아닌 기존의 도커 이미지를 사용하도록 변경하기로 하였습니다.
공식 이미지 : https://hub.docker.com/_/nginx
위 링크에서 공식 이미지를 확인할 수 있습니다.
어짜피 개인서버이므로 현 시점 최신인 nginx:1.23.3
을 이용하도록 하겠습니다.
조금이라도 가벼운 이미지를 원하면 alpine
이 달린 경량 이미지를 사용하면 됩니다.
도커 사용 전 같은 기기 내에서 Nginx와 각종 서버들이 켜질때는 각 서버들마다 포트를 다르게 해서 켠 다음 역방향 프록시를 해주어야 했습니다.
하지만 컨테이너로 분리된 환경에서 켤 경우 약간의 IO 손해만 감수하면 컨테이너 마다 아무 포트로 켜고 이를 컨테이너 명으로 접근할 수 있습니다.
포트 관리의 필요성이 사라지게 되고 각 서비스간에 네트워크까지 독립적인 환경을 제공할 수 있습니다.
sudo docker network create 네트워크_명
위 명령어로 네트워크를 생성합니다.
여기서는 관리의 용이함을 위해 docker-compose
를 사용하여 컨테이너를 올릴 것 입니다.
이 글에서 작업 공간은 /srv/nginx
에서 이루어집니다.
sudo mkdir -p /srv/nginx
cd /srv/nginx
docker-compose
파일을 생성 후 작성합니다.
sudo vim compose.yaml
(구 버전의 docker의 경우 docker-compose.yaml
파일로 생성해주세요.)
services:
nginx:
container_name: nginx
networks:
- 네트워크_명
image: nginx:1.23.3
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./conf:/etc/nginx
- /etc/letsencrypt:/etc/letsencrypt
extra_hosts:
- host.docker.internal:host-gateway
networks:
네트워크_명:
external: true
설정을 간단하게 설명하자면
services
container_name
: 컨테이너의 명을 지정합니다. 후에 접근 할 때. 설정한 이름으로 접근할 때 용이합니다.networks
: 이 컨테이너가 사용할 네트워크 지정image
: 이 컨테이너의 이미지restart
: 재 시작 정책. nginx는 항시 켜져야하므로 always
ports
: 컨테이너 외부 호스트와 연결할 포트, HTTPS, HTTP에 해당하는 포트를 바인딩 해주었음.volumes
: 호스트 경로와 바인딩할 경로, 유지되어야할 설정파일과 인증서 파일을 연결해주었음.extra_hosts
: 아직 다른 서버들이 완전히 도커 컨테이너로 만든 것이 아니므로 호스트로 연결해야할 일이 있을 수 있음. 이 경우 해당 옵션을 추가하고 host.docker.internal로 접근하면 됨.networks
: 외부 네트워크를 정의하였음.이후 기존 nginx의 설정들을 복사해옵니다.
저는 기존 설정이 /opt/nginx/conf에 위치해있습니다.
sudo mkdir /srv/nginx/conf
sudo cp -r /opt/nginx/conf/* ./conf
이후 내부 설정에 각종 경로들을 변경된 경로로 맞춰줘야합니다.
sudo vim /srv/nginx/conf/nginx.conf
설정파일에 대한 참조 경로나 각종 도메인들을 수정하여야 합니다.
기존 같은 호스트에 켰던 서버들은 localhost
를 host.docker.internal
로 변경하는 등의 작업이 필요하며 만약 서버들을 도커 컨테이너로 전환하였다면 해당 컨테이너의 바인딩된 포트를 host.docker.internal
로 접근할 수도 있지만, 같은 도커 네트워크상에 둔 다음 컨테이너 명을 URL로 연결하면 포트자원에 대한 관리가 수월합니다.
그 다음 컨테이너를 올립니다.
sudo docker compose up -d
이렇게 구동 부분은 끝났습니다.