์๋ SSL ๋ฐ Let's Encrypt & Nginx
11524 ๋จ์ด securityarchitecturetutorialdocker
์ฃผ: 2020๋ 12์์
letsencrypt-nginx-proxy-companion
ํ๋ก์ ํธ์ v2๊ฐ ๋ฐํ๋์์ต๋๋ค.์ด ์ ์ ๋ฐ์ํ๊ธฐ ์ํด ์ด ๊ธ์ ์
๋ฐ์ดํธํ์ง๋ง, ํ์ด์ง ๋ฐ์ ์ค๋๋ v1 ์ฝ๋๋ฅผ ๋ณด์กดํ ๊ฒ์
๋๋ค.๊ธฐ์กด ์์คํ
์ ํ์ฌ ์์น์์ ์
๊ทธ๋ ์ด๋ํด์ผ ํ๋ ๊ฒฝ์ฐ nginx-proxy/docker-letsencrypt-nginx-proxy-companion ์ ์ฅ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.2016๋ ์ดํ ์ธ์ฆ์ ๋ฐ๊ธ๊ธฐ๊ด์ธ ๋ 's Encrypt๋ ์ํธํ ํต์ ์ด ๋คํธ์ํฌ์ ์๋ ๊ณณ์ด ์๋๋ก ๋ฌด๋ฃ SSL/TLS ์ธ์ฆ์๋ฅผ ์ ๊ณตํ๋ค.๋ง์ฝ ๋น์ ์ด ์ฆ์๋ฅผ ๊ตฌ๋งคํ ์ ์ด ์๋ค๋ฉด, ์ฆ์๋ ๋ณดํต ๋งค์ฐ ๋น์ธ๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ด๋ค. ์ฆ์๋ฅผ ๊ฒ์ฆํ๋ ๊ณผ์ ์ ์๋ฉ์ด ๊ทผ์ก์ ๊ณ ํต์ด๊ณ , ๊ทธ ์ฆ์๋ ํด๊ฐ๋ฅผ ๋ณด๋ผ ๋ ๊ธฐํ์ด ์ง๋ ์ ์ง๋๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ด๋ค.
Let's Encrypt๊ฐ ์์ผ๋ฉด ๋ชจ๋ ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ง๋๋ค. ์ด๊ฒ์ ์๋ํ ์ธ์ฆ์ ๊ด๋ฆฌ ํ๊ฒฝ(ACME) ํ๋กํ ์ฝ ๋๋ถ์ ๋๋ค. ์ด ํ๋กํ ์ฝ์ ์ธ์ฆ์์ ๊ฒ์ฆ๊ณผ ๋ฐฐ์น๋ฅผ ์๋ํํ์ฌ ์๊ธ๊ณผ ์๊ฐ์ ์ ์ฝํ ์ ์์ต๋๋ค.ACME ์์ฒด๊ฐ ํฅ๋ฏธ๋ก์ด ํ์ ์ ๋๋ค. ๋ค์ํ ๊ฒ์ฆ ๋ฐฉ๋ฒ (๋์ ์ด๋ผ๊ณ ํจ) here์ ๋ํ ์ ๋ณด๋ฅผ ๋ ๋ง์ด ์ฝ์ ์ ์์ง๋ง, ์ค๋์ ์๋ ์ธ์ฆ์ ์์ฑ, ๊ฒ์ฆ, ๋ฐฐ์น๋ฅผ ํตํด ์ญ๋ฐฉํฅ ์์ด์ ํธ๋ฅผ ์ฝ๊ฒ ์ค์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ฒซ ๋ฒ์งธ ์ผ์ user defined bridge network์ด๋ผ๋
service-network
์ ๋ง๋๋ ๊ฒ์ด๋ค.๋๋ ์ฌ๋ฌผ์ ์ด๋ฆ์ ๋ถ์ด๋ ๊ฒ์ ์ํ์ง ๋ชปํ์ง๋ง, ์ด๊ฒ์ ์ ์ฉ๋๋ ๊ฒ ๊ฐ๋ค.docker network create --subnet 10.10.0.0/24 service-network

๋ค์์ ์ฐ๋ฆฌ๋ ์ญ๋ฐฉํฅ ์์ด์ ํธ๋ฅผ ์ค์ ํ ๊ฒ์ด๋ค.์ญ๋ฐฉํฅ ์์ด์ ํธ๋ ์์ฒญ๋ง ๋ฐ์๋ค์ด๊ณ ๋ฃจํธ ๊ท์น (์๋ฅผ ๋ค์ด ์ด๋ค ํธ์คํธ ์ด๋ฆ์ด ์ด๋ค ์๋น์ค ์ฉ๊ธฐ๋ก ์ฎ๊ฒจ์ผ ํ๋์ง) ์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋น์ค๋ก ์์ด์ ํธํฉ๋๋ค.๋๋ ๊ทธ๊ฒ์ด ์ฝ๊ฐ ์ด๋ ๊ฒ ๋ณด์ธ๋ค๊ณ ์๊ฐํ๋ค.

Jason Wilder ์ด๋ฏธ์ง jwilder/nginx-proxy์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.์ด๊ฒ์ ์ ์ง ๋ณด์๊ฐ ์ข์ ํ๋ก์ ํธ๋ก ๋ง์ ๋ฌธ์๊ฐ ์๋ค.ํฌํธ 80๊ณผ 443์ ์ปจํ ์ด๋์ ๋งคํํ์ฌ HTTP ๋ฐ HTTPS ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํฉ๋๋ค.์ฐ๋ฆฌ๋ ๋ง์ ๋ณผ๋ฅจ์ด ์๋๋ฐ, ์ธ ๊ฐ๋ ํ์ค docker ๋ณผ๋ฅจ์ด๊ณ , ํ๋๋ docker daemon UNIX socket์ด๋ค.
์คํฌ๋ฆฝํธ์์ ๊ธด ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์์ฃผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.๋น๋ก ์ฐ๋ฆฌ๋ ์ฝ๊ฒ ๊ณต๊ฐ์ ์ ์ฝํ๊ณ ๊ทธ๊ฒ์ ํ ์ค์ ๋์ ์ ์์ง๋ง, ์ด๊ฒ์ ์ฅ๋์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์งํด์ผ ํ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๋์์ด ๋์ง ์์ ๊ฒ์ด๋ค.
docker run \
--detach \
--restart always \
--publish 80:80 \
--publish 443:443 \
--name nginx-proxy \
--network service-network \
--volume /var/run/docker.sock:/tmp/docker.sock:ro \
--volume nginx-certs:/etc/nginx/certs \
--volume nginx-vhost:/etc/nginx/vhost.d \
--volume nginx-html:/usr/share/nginx/html \
jwilder/nginx-proxy

์ด์ ๋ฆฌ๋ฒ์ค ์์ด์ ํธ๊ฐ ์๊ฒผ์ต๋๋ค. ๋ค์์ Let's Encrypt companion์ ์ค์ ํด์ผ ํฉ๋๋ค. Yves Blusseau์ ์ด๋ฏธ์ง jrcs/letsencrypt-nginx-proxy-companion์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.๋๋ ๊ทธ๊ฒ์ ๊ฑฐ์ 1๋ ๋์ ์๋ฒฝํ๊ฒ ์ฌ์ฉํ๋ค.
์ฐ๋ฆฌ๋ ๊ฐ์ ๋ณผ๋ฅจ์ ์ด ์ฉ๊ธฐ์ ๋น์ถ์ง๋ง, ์ด๋ค ํฌํธ๋ ๋ฐํํ์ง ์์๋ค.์ฐ๋ฆฌ๋
NGINX_PROXY_CONTAINER
ํ๊ฒฝ ๋ณ์๋ฅผ ํ๋ก์ ์ฉ๊ธฐ์ ์ด๋ฆ๊ณผ ์ผ์นํ๋๋ก ์ค์ ํฉ๋๋ค. ๋จ์ง ์ด๊ฒ๋ฟ์
๋๋ค.์ ์๋น์ค ์ฉ๊ธฐ๊ฐ ๊ฒ์ถ๋ ๋๋ง๋ค ์ด ์ฉ๊ธฐ๋ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ณ ์ธ์ฆ์๋ฅผ ์์ฑํ๋ฉฐ ์ต์ ์ผ๋ก ์ ์งํฉ๋๋ค.docker run \
--detach \
--restart always \
--name nginx-proxy-letsencrypt \
--network service-network \
--volumes-from nginx-proxy \
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
--volume /etc/acme.sh \
--env "DEFAULT_EMAIL=mail@yourdomain.tld" \
jrcs/letsencrypt-nginx-proxy-companion

๋ง์ง๋ง์ผ๋ก ์๋น์ค ์ฉ๊ธฐ๋ฅผ ์ถ๊ฐํ ๋๊ฐ ๋์๋ค.์ฐ๋ฆฌ๋
tutum/hello-world
์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ ํํ๋ ํ
์คํธ ์ด๋ฏธ์ง์ด๋ค.์ด๋ฅผ ์ํด์๋ DNS์ ํธ์คํธ ์ด๋ฆ์ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.์ฐ๋ฆฌ๋ hello-world.example.com
์ ์ฌ์ฉํ๋ ์ฒํ๊ณ ์ด ์๋ฒ์ IP ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ A
๊ธฐ๋ก์ ์ค์ ํ ์ฒํ ๊ฒ์
๋๋ค.docker run \
--detach \
--restart always \
--name hello-world \
--network service-network \
--env VIRTUAL_HOST=hello-world.example.com \
--env LETSENCRYPT_HOST=hello-world.example.com \
--env LETSENCRYPT_EMAIL="youremail@example.com" \
tutum/hello-world

์ฌ๊ธฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง ๋ด ์๋ค.์ฐ๋ฆฌ๋ ๊ฐ์ฒญ ํฌํธ 80๊ณผ 443์ ์ํ ์์ด์ ํธ ์ฉ๊ธฐ๋ฅผ ์ค์นํ๋ค.๊ทธ๋ฐ ๋ค์ ์ธ์ฆ์๋ฅผ ๊ด๋ฆฌํ๋ ACME ์ธ์ฆ์ ์ปจํ ์ด๋๋ฅผ ์ค์ ํฉ๋๋ค.๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ Hello World ์ฉ๊ธฐ๋ฅผ ๋ง๋ค์๋ค.ํ๊ฒฝ ๋ณ์
VIRTUAL_HOST
์ ํธ์คํธ ์ด๋ฆ์ผ๋ก ์ค์ ํฉ๋๋ค. ์ด ์ฉ๊ธฐ์ ์์ฒญํ ๋ฃจํธ๋ฅผ ์์ฒญํ ์ ์๋๋ก ์์ด์ ํธ๊ฐ ๊ฐ์ ธ์ต๋๋ค.์ฌ์ฉ์ ์ ์ ๋ธ๋ฆฌ์ง service-network
์ ํตํด ๋ผ์ฐํ
์ ์์ฒญํฉ๋๋ค.๋ํ ํ๊ฒฝ ๋ณ์ LETSENCRYPT_HOST
๊ณผ LETSENCRYPT_EMAIL
์ ์ค์ ํ์ต๋๋ค. ์ด ๋ณ์๋ ACME ์ฉ๊ธฐ์์ ๊ฐ์ ธ์ค๊ณ ์ธ์ฆ์๋ฅผ ๋ฐ์ ๋ ์ฌ์ฉ๋ฉ๋๋ค.์ฐธ๊ณ ๋ก ๋ ํธ์คํธ ์ด๋ฆ์ ํญ์ ์ผ์นํด์ผ ํฉ๋๋ค(VIRTUAL_HOST
๋ฐ LETSENCRYPT_HOST
).์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ์ด ์ธ ๋ณ์๋ฅผ ํ๋์ ์ฉ๊ธฐ์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค. ์์ด์ ํธ์ ACME ์ฉ๊ธฐ๋ ๊ทธ๊ฒ์ ๊ฒ์ถํ๊ณ , ๊ณง ์๋ํ ๊ฒ์ด๋ค.
์ง๊ธ ๋ช ๊ฐ์ง ์ฃผ์ํด์ผ ํ ์ผ์ด ์๋ค.ํฌํธ ๊ฒ์ - ์์ด์ ํธ๋ ์ด๋ค ํฌํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋์ง ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น?์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ Helloworld ์ด๋ฏธ์ง๋ Dockerfile์ ํฌํธ๊ฐ
EXPOSE 80
์ด๋ผ๋ ๊ฒ์ ๋ณด์ฌ ์ค๋๋ค.์ด๊ฒ์ ํญ์ ์ฐ์ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ์ง์ ๋
ธ์ถ๋ ํฌํธ๊ฐ ์์ผ๋ฉด ๊ทธ๊ฒ์ ์ฌ์ฉํฉ๋๋ค.๋จ, Dockerfile์ ๊ณต๊ฐ๋ ํฌํธ๊ฐ ์ ์๋์ด ์์ง ์๊ฑฐ๋, ์คํํ ๋ ํ๊ฒฝ ๋ณ์ (์: HTTP_PORT=8000
) ๋ฅผ ์ฌ์ฉํ์ฌ ํฌํธ๋ฅผ ์ค์ ํ ์ ์๋ค๋ฉด, --expose
์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ด์ ํธ์๊ฒ ์ด๋ค ํฌํธ๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง ์ ์ ์์ต๋๋ค.์ฌ์ฉ ๊ฐ๋ฅํ ํฌํธ๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ํ๊ฒฝ ๋ณ์ VIRTUAL_PORT
๊ณผ ํจ๊ป ์ฌ์ฉํ ํฌํธ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.๋ค์ ํ ๋ฒ ๋ง์๋๋ฆฌ์ง๋ง, Dockerfile
EXPOSE
์ --expose
๋งค๊ฐ ๋ณ์๋ณด๋ค ์ฐ์ ํฉ๋๋ค.ํ์ฌ,
https://hello-world.example.com
์ ๋๋ ์ ๋, DNS ์๋ฒ๋ ๊ณต๊ณต IP๊ฐ ์๋ A ๊ธฐ๋ก์ ๋๋๋ ค์ฃผ๊ณ , ๋ธ๋ผ์ฐ์ ๋ ํฌํธ 443์ IP ์ฃผ์์ ์ฐ๊ฒฐํ ๋ค์, ํธ์คํธ๋ ์ด ์ฐ๊ฒฐ์ nginx-proxy
์ฉ๊ธฐ์ ์ฐ๊ฒฐํฉ๋๋ค.SSL์ ์ข
๋ฃํ๊ณ ์์ฒญ์ ์ผ๋ฐ HTTP ์์ฒญ ์์ด์ ํธ๋ก hello-world
์ปจํ
์ด๋์ ํ๋ก์ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ฐ๋ฆฌ๋ ๋ ๋ค๋ฅธ ์ผ์ ํ ์ ์๋ค.HTTP์์ HTTPS๋ก์ ์ ๊ทธ๋ ์ด๋๋ฅผ ํ๋ก์๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ด๊ฒ์ ์ข์ง๋ง, ๋๋๋ก www/apex ์์ญ์ ๋ค์ ์ง์ ํด์ผ ํฉ๋๋ค.์ผ๋ถ ๋๋ฉ์ธ ๋ฑ๋ก๊ธฐ ์ ์ดํ์์ ๊ตฌ์ฑํ ์ ์์ง๋ง ํธ์คํธ ์ด๋ฆ์ ๋ค๋ฅธ IP ์ฃผ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ด๋ฏธ์ง๋ ์ฌ์ค์ ๋์ ๊ฒ์ด๋ค. adamkdean/redirect.
๊ทธ๊ฒ์ ์์ ๋ฐฉ์์ ๋งค์ฐ ๊ฐ๋จํ๋ค.
VIRTUAL_HOST
์ ๋ฐ๊ฟ ์์ญ์ผ๋ก ์ค์ ํ๊ณ ๋ค๋ฅธ ์ฉ๊ธฐ์ ๋ชฉํ๋ฅผ ์ค์ ํ์ญ์์ค.์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ๋ example.com
์ด ์๋๋ฐ, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ํญ์ www.example.com
์ผ๋ก ๋ฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ www๋ฅผ ์ข์ํ๊ธฐ ๋๋ฌธ์ด๋ค.์ฐ๋ฆฌ์ ์ฃผ์ ์ด๋ฏธ์ง๋
www.example.com
์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค.docker run \
--detach \
--restart always \
--name example-website \
--network service-network \
--env VIRTUAL_HOST=www.example.com \
example/website
๊ทธ ๋ค์์ ์ฐ๋ฆฌ๋ ์ปจํ
์ด๋๋ฅผ ๋ค์ ๋ง๋ค์ด example.com
์ ๊ท์์ํค๊ณ ํ๊ฒฝ ๋ณ์ REDIRECT_LOCATION
์ ์ฐ๋ฆฌ์ ์ฒซ ๋ฒ์งธ ๋ชฉํ๋ก ์ค์ ํ๋ฉฐ REDIRECT_STATUS_CODE
์ ์ ์ฉ๋๋ ๋ชฉํ๋ก ์ค์ ํฉ๋๋ค.docker run \
--detach \
--restart always \
--name example-redirect \
--network service-network \
--env VIRTUAL_HOST=example.com \
--env REDIRECT_LOCATION="http://www.example.com" \
--env REDIRECT_STATUS_CODE=301 \
adamkdean/redirect
ํ์ฌ ๋ฐ์ํ ๊ฒ์ example.com
์ ๋ํ ์์ฒญ์ด ์ด ๋ฆฌ์
์ฉ๊ธฐ์ ๋ง์๊ณ REDIRECT_STATUS_CODE
๊ณผ REDIRECT_LOCATION
์ผ๋ก ์๋ตํ๋ค.์ฐ๋ฆฌ๋ ๋น์ฐํ Let's Encrypt with the this๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
docker run \
--detach \
--restart always \
--name example-website \
--network service-network \
--env VIRTUAL_HOST=www.example.com \
--env LETSENCRYPT_HOST=www.example.com \
--env LETSENCRYPT_EMAIL="youremail@example.com" \
example/website
docker run \
--detach \
--restart always \
--name example-redirect \
--network service-network \
--env VIRTUAL_HOST=example.com \
--env LETSENCRYPT_HOST=example.com \
--env LETSENCRYPT_EMAIL="youremail@example.com" \
--env REDIRECT_LOCATION="https://www.example.com" \
--env REDIRECT_STATUS_CODE=301 \
adamkdean/redirect
์ด ๊ฒฝ์ฐ example.com
์ ์ด๊ธฐ ์์ฒญ ๋ช
์ค ์์ด์ ํธ์ ๋ํด ์์ด์ ํธ๋ SSL์ ์ค์งํ๊ณ example-redirect
์ฉ๊ธฐ์ ์์ด์ ํธ๋ฅผ ์ฃผ๊ณ ์ด ์ฉ๊ธฐ๋ 301์์ www.example.com
์ผ๋ก ์๋ตํ๋ค.ํ์ฌ www.example.com
์ ๋ค์ ์์ฒญ์ ๋ํด ์์ด์ ํธ๋ฅผ ํด๋ฆญํ๊ณ example-website
์ฉ๊ธฐ๋ฅผ ํตํด ์์ด์ ํธ๋ฅผ ์งํํ๋ค. ์๋์ ๊ฐ๋ค.
๋๋ ์ด๊ฒ์ด ๋์๊ฒ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋ค.์ด ์ค์ ์ ํ ์ฌ์ดํธ ๋๋ ์ฌ๋ฌ ์ฌ์ดํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.๋ํ ์ฉ๊ธฐ ํ๋ซํผ์ ์ค์นํ๋ ๊ฒ์ด ์ข ์ง๋์น ์ํฉ์์ ๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ด๋ค. (๋ธ๋ก๊ทธ์kubernetes๋ ๋งค์ฐ ์ข๋ค. ๊ทธ๋ ์ง?)
๊ทธ๊ฒ์ ๋งค์ฐ ์ฝ๊ฒ ๊ฐฑ์ ๋๊ณ ๋ฐฐ์น๋๋ฉฐ, ์ด๋ฏธ ์ฌ์ฉ๋ ์ง 1๋ ์ด ๋์๊ณ , ๋งค์ฐ ์ ์ผํ๋ค.์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ ๋ฐ์ดํธ(2020๋ 2์ 21์ผ): ์๊ตฌ์ ๋ฐ๋ผ
docker-compose.yml
๋ฒ์ ์ด ์์ต๋๋ค.version: "3"
services:
web:
image: example/website
expose:
- 8000
environment:
HTTP_PORT: 8000
VIRTUAL_HOST: www.example.com
LETSENCRYPT_HOST: www.example.com
LETSENCRYPT_EMAIL: "example@example.com"
networks:
service_network:
web-redirect:
image: adamkdean/redirect
environment:
VIRTUAL_HOST: example.com
LETSENCRYPT_HOST: example.com
LETSENCRYPT_EMAIL: "example@example.com"
REDIRECT_LOCATION: "https://www.example.com"
networks:
service_network:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- 80:80
- 443:443
container_name: nginx-proxy
networks:
service_network:
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- nginx-certs:/etc/nginx/certs
- nginx-vhost:/etc/nginx/vhost.d
- nginx-html:/usr/share/nginx/html
nginx-proxy-letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
environment:
NGINX_PROXY_CONTAINER: "nginx-proxy"
networks:
service_network:
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- nginx-certs:/etc/nginx/certs
- nginx-vhost:/etc/nginx/vhost.d
- nginx-html:/usr/share/nginx/html
networks:
service_network:
volumes:
nginx-certs:
nginx-vhost:
nginx-html:
์
๋ฐ์ดํธ(2020๋
2์ 28์ผ):๋๋ ๋ด๊ฐ
VIRTUAL_PORT
์ ๋ํด ์ด์ผ๊ธฐํ ๋ ์๋ชป์ ์ ์ง๋ ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.๋ฌธ์๋ฅผ ์
๋ฐ์ดํธํ์ง๋ง, ์์ด์ ํธ๊ฐ Docker ํ์ผ์ EXPOSE
๋ช
๋ น๊ณผ Docker ๋ช
๋ น์ค ์ธํฐํ์ด์ค์ --expose
๋งค๊ฐ ๋ณ์์์ ์ด๋ค ํฌํธ๋ฅผ ์ฌ์ฉํ๋์ง ์๋ ค์ฃผ๊ณ ์ถ์ ๋ฟ์
๋๋ค.๋
ธ์ถ๋ ํฌํธ๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ VIRTUAL_PORT
ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋
ธ์ถ๋ ํฌํธ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.ํท๊ฐ๋ ค์ ๋ฏธ์ํด!
์ ๋ฐ์ดํธ(2020๋ 4์ 22์ผ):
๋ณด์ ๋ฆฌ๋๋ ์ ์ธ์ ์ ๋ถ์กฑํ ๋ฐ์ฌ๋ด์ด ์ถ๊ฐ๋์์ต๋๋ค.์์ด๊ตฌ!
์ ๋ฐ์ดํธ(2020๋ 12์ 11์ผ):
letsencrypt nginx proxy companion์ v1 ์ฝ๋์ ๋๋ค.
docker run \
--detach \
--restart always \
--name nginx-proxy-letsencrypt \
--network service-network \
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
--volume nginx-certs:/etc/nginx/certs \
--volume nginx-vhost:/etc/nginx/vhost.d \
--volume nginx-html:/usr/share/nginx/html \
--env NGINX_PROXY_CONTAINER="nginx-proxy" \
jrcs/letsencrypt-nginx-proxy-companion:v1.13.1
๋ง์ฝ ๋ค๊ฐ ์ด ๊ธ์ ์ข์ํ๋ค๋ฉด, ๋๋ ๋์ ๋ค์ ๊ธ์ ์ข์ํ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊น์ด ์๊ฒ ์ฐ๊ตฌํ ๊ฒ์ด๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฉ๊ธฐ๋ผ๊ณ ๋ถ๋ฅด๋ ๋ธ๋๋ฐ์ค ์์์ ๋๋์ฒด ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง ์ดํดํ ์ ์๋ค.docker์ ๋ํ ์ค๋ช ์ ๋๋ค.sock: docker ์ํธ ํ๋ก์ธ์ค UNIX ํ๋ฌ๊ทธ์ธ (/var/run/docker.sock) ์ docker์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํฉ๋๋ค. ๋ค์ ๋งํ๋ฉด ๋ฃจํธ ์ ๊ทผ์ ๋๋ค.์ 3์ ๊ทธ๋ฆผ์ ์คํํ ๋, ์์ ์ด ๋ฌด์์ ํ๊ณ ์๋์ง ํ์คํ ์์์ผ ํ๋ค.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(์๋ SSL ๋ฐ Let's Encrypt & Nginx), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/adamkdean/automatic-ssl-with-let-s-encrypt-nginx-4nfkํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ
์ธ ๋ฐ๊ฒฌ์ ์ ๋
(Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค