Linux์—์„œ docker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ letsencrypt ์ธ์ฆ์„œ ์ž๋™ ์ˆ˜์‹  ์„ค์ •

์ตœ๊ทผ์— ๊ฐ€์ƒ ์„œ๋ฒ„๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ๊ตฌ์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” https๋ฅผ ํ†ตํ•ด ์‚ฌ์ดํŠธ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ณ  ์•”ํ˜ธํ™”๋œ ์ธ์ฆ์„œ๋ฅผ ์ž๋™์œผ๋กœ ์–ป๊ณ  ๊ฐฑ์‹ ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‘ ๊ฐœ์˜ ๋„์ปค ์ด๋ฏธ์ง€ nginx-proxy ๋ฐ nginx-proxy-companion์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SSL ์ธ์ฆ์„œ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์‹ ํ•˜๋Š” ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Docker์—์„œ ์›น์‚ฌ์ดํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค. CentOS 7 ๊ฐ€์ƒ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„๊ฐ€ ์ด๋ฏธ ๊ตฌ๋งค, ๊ตฌ์„ฑ, ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ, Fail2ban ์„ค์น˜ ๋“ฑ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ๋„์ปค๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋จผ์ € ์ข…์†์„ฑ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    $ sudo yum install -y yum-utils  device-mapper-persistent-data lvm2
  2. ์ €์žฅ์†Œ ์—ฐ๊ฒฐ
    $ sudo yum-config-manager  --add-repo  https://download.docker.com/linux/centos/docker-ce.repo
  3. ๊ทธ๋Ÿฐ ๋‹ค์Œ Docker Community Edition์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.
    $ sudo yum install docker-ce docker-ce-cli containerd.io
  4. ์‹œ์ž‘์— ๋„์ปค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹คํ–‰ํ•˜์„ธ์š”.
    $ sudo systemctl enable docker
    $ sudo systemctl start docker
  5. sudo ์—†์ด docker๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก docker ๊ทธ๋ฃน์— ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    $ usermod -aG docker user

๋‹ค์Œ ๋‹จ๊ณ„๋Š” docker-compose๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถˆํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋กœ ์‹œ์Šคํ…œ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก pip ๊ด€๋ฆฌ์ž์™€ virtualenv๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

  1. ํ• ์„ค์น˜
    $ sudo yum install python-pip
  2. virtualenv ์„ค์น˜
    $ pip install virtualenv
  3. ๋‹ค์Œ์œผ๋กœ ํ”„๋กœ์ ํŠธ๊ฐ€ ํฌํ•จ๋œ ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์ด ํฌํ•จ๋œ ํด๋”๋Š” ve์ž…๋‹ˆ๋‹ค.
    $ mkdir docker
    $ cd docker
    $ virtualenv ve
  4. ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ ํด๋”์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    $ source ve/bin/activate
  5. docker-compose๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    pip install docker-compose

    ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„œ๋กœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ฆฌ์ง€ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    $ docker network create network

    ๋‹ค์Œ์œผ๋กœ docker-compose๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก์‹œ๋Š” ํ”„๋ก์‹œ ํด๋”์— ์žˆ๊ณ  ํ…Œ์ŠคํŠธ ์‚ฌ์ดํŠธ๋Š” test ํด๋”์— ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ €๋Š” example.com์ด๋ผ๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    $ mkdir proxy
    $ mkdir test
    $ touch proxy/docker-compose.yml
    $ touch test/docker-compose.yml

    ํ•จ์œ ๋Ÿ‰ ํ”„๋ก์‹œ/docker-compose.yml

    version: '3'
    
    networks:
      default:
        external:
          name: network
    
    services:
      nginx-proxy:
        container_name: nginx-proxy
        image: jwilder/nginx-proxy
        ports:
          - 80:80
          - 443:443
        volumes:
          - certs:/etc/nginx/certs
          - vhost.d:/etc/nginx/vhost.d
          - html:/usr/share/nginx/html
          - /var/run/docker.sock:/tmp/docker.sock:ro
    
      nginx-proxy-letsencrypt:
        container_name: nginx-proxy-letsencrypt
        image: jrcs/letsencrypt-nginx-proxy-companion
        volumes: 
          - certs:/etc/nginx/certs
          - vhost.d:/etc/nginx/vhost.d
          - html:/usr/share/nginx/html
          - /var/run/docker.sock:/var/run/docker.sock:ro
        environment:
          - NGINX_PROXY_CONTAINER=nginx-proxy
    
    volumes:
      certs:
      vhost.d:
      html:

    ํ™˜๊ฒฝ ๋ณ€์ˆ˜ NGINX_PROXY_CONTAINER letsencrypt ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ”„๋ก์‹œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. /etc/nginx/certs /etc/nginx/vhost.d ๋ฐ /usr/share/nginx/html ํด๋”๋Š” ๋‘ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ณต์œ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. letsencrypt ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋ ค๋ฉด ํฌํŠธ 80๊ณผ 443 ๋ชจ๋‘์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ํ•จ์œ ๋Ÿ‰ ํ…Œ์ŠคํŠธ/docker-compose.yml

    version: '3'
    
    networks:
      default:
        external:
          name: network
    
    services:
    
      nginx:
        container_name: nginx
        image: nginx:latest
        environment:
          - VIRTUAL_HOST=example.com
          - LETSENCRYPT_HOST=example.com
          - [email protected]

    ์—ฌ๊ธฐ์„œ๋Š” ํ”„๋ก์‹œ๊ฐ€ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๋„๋ฉ”์ธ ์ด๋ฆ„์— ๋Œ€ํ•œ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    ๋‚จ์€ ๊ฒƒ์€ docker-compose๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

    $ cd proxy
    $ docker-compose up -d
    $ cd ../test
    $ docker-compose up -d

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€