Menu

메모용 개발 블로그

전체보기 > Nginx >

Nginx 도커로 전환기

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/

Nginx Docker로 구동

이미지 선택

컴파일 방식이 아닌 기존의 도커 이미지를 사용하도록 변경하기로 하였습니다.

공식 이미지 : 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

설정파일에 대한 참조 경로나 각종 도메인들을 수정하여야 합니다.

기존 같은 호스트에 켰던 서버들은 localhosthost.docker.internal로 변경하는 등의 작업이 필요하며 만약 서버들을 도커 컨테이너로 전환하였다면 해당 컨테이너의 바인딩된 포트를 host.docker.internal로 접근할 수도 있지만, 같은 도커 네트워크상에 둔 다음 컨테이너 명을 URL로 연결하면 포트자원에 대한 관리가 수월합니다.

그 다음 컨테이너를 올립니다.

sudo docker compose up -d

이렇게 구동 부분은 끝났습니다.