One way to obtain Docker Nginx Certbot SSL certificates
```
도커 엔진스 서트봇 에스에스엘 인증서 발급받는 방법
```
이번 글을 통해 배워갈 내용
1. 도커, 도커 컴포즈 설치
2. 도커 샘플 헬로 월드 이미지 실행
3. 헬로 월드 이미지에 대해서 인증서 발급
도커 설치
시스템 업데이트
apt-get update
apt-get upgrade
도커 설치
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
(도커설치 관련글)
https://codemasterkimc.tistory.com/674
도커 컴포즈 설치
설치
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
권한 부여
sudo chmod +x /usr/local/bin/docker-compose
설치 확인
docker-compose --version
샘플 이미지 실행(선택)
원하는 위치에 compose.yaml 파일 생성
nano compose.yaml
샘플이미지 세팅( compose.yaml 내부)
services:
helloworld:
container_name: helloworld
image: crccheck/hello-world
ports:
- 80:8000
샘플 이미지 실행
docker compose up -d helloworld
테스트
curl localhost
curl -I localhost
샘플 이미지 설명
https://github.com/crccheck/docker-hello-world
nginx.conf 세팅
원하는 위치에 nginx.conf 파일 생성
mkdir -p ./nginx
nano ./nginx/nginx.conf
nginx.conf 파일 세팅
events {
worker_connections 1024;
}
http {
server_tokens off;
charset utf-8;
server {
listen 80 default_server;
server_name _;
location / {
proxy_pass http://helloworld:8000/;
}
}
}
nginx 세팅 및 실행
compose.yaml에 nginx 추가
nano compose.yaml
services:
helloworld:
container_name: helloworld
image: crccheck/hello-world
expose:
- 8000
nginx:
container_name: nginx
restart: unless-stopped
image: nginx
ports:
- 80:80
- 443:443
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
nxginx 실행
docker compose up -d nginx
Certbot 설정
nano ./nginx/nginx.conf
아래 내용 추가
location ~ /.well-known/acme-challenge/ {
root /var/www/certbot;
}
따라서 아래와 같이 설정
events {
worker_connections 1024;
}
http {
server_tokens off;
charset utf-8;
server {
listen 80 default_server;
server_name _;
location / {
proxy_pass http://helloworld:8000/;
}
location ~ /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
}
경로 생성
mkdir -p ./certbot/conf
mkdir -p ./certbot/www
compose.yaml 설정
nano compose.yaml
helloworld:
container_name: helloworld
image: crccheck/hello-world
expose:
- 8000
nginx:
container_name: nginx
restart: unless-stopped
image: nginx
ports:
- 80:80
- 443:443
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
certbot:
image: certbot/certbot
container_name: certbot
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
command: certonly --webroot -w /var/www/certbot --force-renewal --email {email} -d {domain} --agree-tos
nginx 재시작 후
certbot 인증 시작
docker compose restart nginx
docker compose up -d certbot
인증이 잘되었는지 확인
docker logs certbot
변경된 인증서 설정 적용
nginx.conf 수정
nano ./nginx/nginx.conf
{domain}을 지우고 해당 위치들에 서버 주소 입력
예시) www.nxver.com
필요시 CORS 세팅 처리
events {
worker_connections 1024;
}
http {
server_tokens off;
charset utf-8;
# always redirect to https
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
# use the certificates
ssl_certificate /etc/letsencrypt/live/{domain}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;
server_name {domain};
root /var/www/html;
index index.php index.html index.htm;
location / {
proxy_pass http://helloworld:8000/;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' '*';
add_header 'Access-Control-Expose-Headers' 'Content-Length, Content-Range';
add_header 'Access-Control-Allow-Credentials' 'true';
}
location ~ /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
}
docker nginx 재시작
docker compose restart nginx
필요시 아래와 같이 세팅하고 nginx 재시작해도 무방함
events {
worker_connections 1024;
}
http {
server_tokens off;
charset utf-8;
# always redirect to https
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
# use the certificates
ssl_certificate /etc/letsencrypt/live/{domain}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;
server_name {domain};
root /var/www/html;
index index.php index.html index.htm;
location / {
proxy_redirect off;
proxy_pass http://{container name}:5000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
location ~ /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
}
기타
ufw 방화벽 처리
sudo ufw allow 80/tcp comment 'Nginx HTTP'
sudo ufw allow 443/tcp comment 'Nginx HTTPS'
sudo ufw status
sudo ufw enable
인증서 자동갱신
shell script 생성
mkdir /scripts
nano /scripts/renew_and_restart.sh
script 내용
docker-compose 파일이 /hello 경로에 있다고 가
#!/bin/bash
# Navigate to the directory
cd /hello
# Bring up certbot and wait for it to complete
docker compose up -d certbot
# Assuming certbot runs in detached mode, wait a bit to ensure completion. Adjust sleep as necessary.
sleep 60
# Restart nginx to apply the new certificates
docker compose restart nginx
권한 부여
chmod +x /scripts/renew_and_restart.sh
크론부여
매월 1일 오전 3시에 실행
crontab -e
0 3 1 * * /scripts/renew_and_restart.sh
crontab -l
참조 및 인용
https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal
https://eff-certbot.readthedocs.io/en/stable/install.html#running-with-docker
https://www.programonaut.com/setup-ssl-with-docker-nginx-and-lets-encrypt/
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'DevOps > Docker' 카테고리의 다른 글
도커 컨테이너 통신의 3가지 사례 설명 (0) | 2023.12.10 |
---|---|
우분투에 도커 컴포스 설치 하는 한가지 방법 (0) | 2023.11.22 |
그랄VM(Graalvm) Spring Boot Mssql 세팅하는 방법 (윈도우OS) (0) | 2023.11.10 |
스프링부트를 도커 컨테이너로 실행해보기 (0) | 2023.10.18 |
우분투에 도커 설치제거하는 한가지 방법 (0) | 2023.10.16 |