Docker์ Nginx๋ฅผ ์ฌ์ฉํด ์ปจํ ์ด๋๋ฅผ ๋น๋ํ ๋๋ง๋ค ์๋์ผ๋ก ๋ฐฐํฌ๋๋ ์๋น์ค๋ฅผ ๊ตฌ์ถํด ๋ณด๊ฒ ์ต๋๋ค. ์ ๊ฐ ์ผ์ ์ ๊ธฐ์ ๋ธ๋ก๊ทธ์ ์ฌ๋ ธ๋ GoCD์ ๊ฐ์ด ์ฐ์๋ฉด ๋ฐฐํฌ ์์ฐ์ฑ์ด ๋์์ง๋๋ค. ์ด๋ฐ ๊ณผ์ ์ CD(์ง์์ ์ธ ๋ฐฐํฌ)๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ ์ ์ด๋ ์ํํธ์จ์ด๋ฅผ ๋ค๋ฃจ๊ณ ์๋ค๋ฉด ๊ด๋ จ ๊ณต๋ถ๋ ํ์์ ์ ๋๋ค. ๋๋ถ๋ถ DevOps ๊ณผ์ ์ผ๋ก ํธ์ ๋๋ ์ธํ๋ผ๋ ํด๋ผ์ฐ๋ ๊ด๋ จ ์ทจ์ ์ด ๋ชฉ์ ์ด๋ผ๋ฉด ๊ผญ ์์๋์ ์ผ ํ ๊ธฐ์ด ๊ฐ๋ ์ ๋๋ค. ์ด ํฌ์คํธ์์๋ Docker๋ก ์๋๋ฐฐํฌ + SSL ์ ์ฉ๊น์ง ํ ๋ฒ์ ํด๊ฒฐ๋๋ ๋ฐฐํฌ ์์คํ ์ ๊ตฌ์ถํด ๋ด ๋๋ค.
1. ์๋ ๋ฐฐํฌ
https://hub.docker.com/r/nginxproxy/nginx-proxy
์คํฌ๋ฆฝํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์๋๋ Mac/Linux ๋ฒ์ ์ด๊ณ , ์๋์ ๊ฒฝ์ฐ ์ ๋๊ฒฝ๋ก๋ฅผ ๋ค๋ฅด๊ฒ ์ค์ ํ์๋ฉด ๋ฉ๋๋ค. ๊ณต๊ฐ๋ ํฌํธ๋ 80, 443 ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํด ์ฃผ์๊ณ ํฌํธํฌ์๋ฉ์ด๋ ๋ฐฉํ๋ฒฝ ์ค์ ์ ํตํด ์ธ๋ถ๋ก expose ๋๋๋ก ํด์ค๋๋ค. ์ดํ ํด๋ผ์ฐ๋ํ๋ ์ด์ ๊ฐ์ DNS์๋น์ค์์ A ๋ ์ฝ๋๋ฅผ ์ค์ ํด ์ฃผ๋ฉด ์ ์์ ์ผ๋ก ๋ฐฐํฌ๋ฉ๋๋ค.
docker run --detach \
--name deploy-nginx-proxy \
--publish 80:80 \
--publish 443:443 \
-e HTTP_PORT=80 \
-e HTTPS_PORT=443 \
--volume certs:/etc/nginx/certs \
--volume vhost:/etc/nginx/vhost.d \
--volume html:/usr/share/nginx/html \
--volume /var/run/docker.sock:/tmp/docker.sock:ro \
nginxproxy/nginx-proxy:alpine
2. HTTPS ์๋ ์ ์ฉ
https://hub.docker.com/r/nginxproxy/acme-companion
๋ง์ฝ ์ ์คํฌ๋ฆฝํธ๋ง ๋์ํ๋ค๋ฉด HTTPํต์ ๋ง์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ํ์ฌ ๋๋ถ๋ถ์ ์น์ HTTPS๋ฅผ ์ฐ์ ํ๊ณ ์๊ณ ๋ณด์์ ํ์์ด๊ธฐ ๋๋ฌธ์ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ์์ฃผ์ด์ผ ํฉ๋๋ค. ์ด๋ letsencrypt๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์์ ์ผ๋ก ํด๊ฒฐ๋ฉ๋๋ค. ๋ฌด๋ฃ๋ก TLS์ธ์ฆ์๋ฅผ ๋ฐ๊ธํด ์ฃผ๋ ์๋น์ค์ธ๋ฐ ์ฌ๊ธฐ์ ๊ตฌ์ฒด์ ์ธ ์ค๋ช ์ ์๋ตํ๊ฒ ์ต๋๋ค.
docker run --detach \
--name deploy-nginx-proxy-letsencrypt \
--volumes-from deploy-nginx-proxy \
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
--volume acme:/etc/acme.sh \
--env "DEFAULT_EMAIL=hhj@devent.kr" \
nginxproxy/acme-companion
DEFAULT_EMAIL์๋ ์์ ์ ์ด๋ฉ์ผ์ ๊ธฐ์ ํ์๋ฉด ๋ฉ๋๋ค. ์์ Nginx Reverse Proxy ์คํฌ๋ฆฝํธ์์ ์๋ก์ด ์ปจํ ์ด๋๊ฐ ๋ฑ๋ก๋๋ฉด ๋๋ฉ์ธ์ ์ ํจ์ฑ์ ์ธ์ฆํ ๋ค์ letsencrypt๋ฅผ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๊ณ ์๋์ผ๋ก HTTPS ํต์ ์ด ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋ณ๋์ ๋ถํธํ ์ค์ ์์ด ๋ฐ๋ก ์ธํ ์ด ๊ฐ๋ฅํ๊ณ ํนํ ๋งค๋ฒ ๊ฐฑ์ ํด์ค์ผ ํ๋ ๋จ์ ์ ์ ์ปจํ ์ด๋๋ฅผ ํตํด ์์์ ๊ฐฑ์ ํด ์ฃผ์ด ๊ด๋ฆฌ์ ๋ถํธํจ์ด ์ฌ๋ผ์ง๋๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ฐ ์ด์ ์ค์ธ ํ์๋ฒ๋ฅผ ๋ณ๋ค๋ฅธ ๊ด๋ฆฌ ์์ด ์ ์ด์ํ ์ ์์๊ณ ์ง๊ธ ๋ฒ์จ 2๋ ์ด ๋ค๋์ด ๊ฐ๋๋ก ์๋ฌด๋ฐ ๋ฌธ์ ์์ด ๊ฐ๋ํ๊ณ ์์ต๋๋ค.
์๋ ๊ทธ๋ฆผ์ฒ๋ผ Reverse Proxy ์ปจํ ์ด๋๋ก ์์ฒญ์ด ๋ค์ด์ค๊ณ ์ ๋์ปค ์ปจํ ์ด๋๊ฐ ์คํ๋ ๋๋ง๋ค acme-companion ์ปจํ ์ด๋๋ฅผ ์คํํ๋ฉด์ Letsencrypt ์ธ์ฆ์๋ฅผ ๋ฐ์์ค๋ ๊ตฌ์กฐ์ ๋๋ค. ๊ทธ ์ธ์ฆ์ ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก nginx์์ ๋ณด์ ํต์ ์ ํ๊ฒ ๋๋ ๊ตฌ์กฐ์ธ ๊ฒ์ด์ฃ .
3. ๋ฐฐํฌ ์คํฌ๋ฆฝํธ
๋ฐฐํฌ๋ ํ๊ฒฝ์
์ด 3๊ฐ์ง๋ง ์์ฑํด ์ฃผ๋ฉด ๋ฉ๋๋ค. ๋๋ถ์ด ๋คํธ์ํฌ ๋ชจ๋(network_mode)๋ ๋ธ๋ฆฟ์ง๋ก ์ค์ ํด์ผ ์ ์์ ์ผ๋ก ์ธ๋ถ ๋คํธ์ํฌ์ ํต์ ํ ์ ์์ต๋๋ค.
version: '3.1'
networks:
app: {}
services:
main:
container_name: test
env_file:
- .env.production
build:
context: .
dockerfile: ./Dockerfile
ports:
- 9300:9300
environment:
NODE_ENV: production
VIRTUAL_HOST: domain.app
LETSENCRYPT_HOST: domain.app
LETSENCRYPT_EMAIL: hhj@devent.kr
network_mode: "bridge"
์ฌ๊ธฐ์ GoCD, Github Action๊ณผ ๊ฐ์ CI/CD๋๊ตฌ๋ฅผ ์น์ผ๋ฉด ์ต๊ณ ์ ๋ฐฐํฌ ๋๊ตฌ๊ฐ ๋ฉ๋๋ค. ์ ์ด๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์๋ผ๋ฉด ์์ ์ด ๊ฐ๋ฐํ ์ํํธ์จ์ด๋ฅผ ํ๋ก๋์ ์ผ๋ก ๋ฐฐํฌํ๊ณ ์ด์ํ๋ ๊ณผ์ ์ ํ์๋ผ๊ณ ๋ด ๋๋ค. AI์๋์ธ ๋งํผ ๊ธฐ์ ์ ๋ํ ๋์ด๋๋ ๋ฎ์์ง๊ณ ์ธํ๋ผ ๊ตฌ์ถ๋ ๋ฐ์ด๋ ์คํ์์ค ๋์ ์ฌ์์ง๊ณ ์์ต๋๋ค. ํนํ ์ต๊ทผ ๋ค์ด ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ ํ์๋ฒ ๊ตฌ์ถ์ด ํ๋์ ์ทจ๋ฏธ๋ก ์๋ฆฌ ์ก๋ ๋งํผ ํ ๋ฒ์ฏค ๋์ ํด ๋ณด์ จ์ผ๋ฉด ํฉ๋๋ค.
'๐ป๊ธฐ์ > Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ Docker ] ๋์ปค API์ ์์ผ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ (0) | 2021.01.04 |
---|---|
[ Docker ] Docker ๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋์์ด ๋ง์ด ๋์๋ ์ฌ์ดํธ (0) | 2020.05.29 |