建立Nginx服務與掛載conf檔
在建立網站時,除了使用Docker部屬前端的服務以及後端的服務,還得必須新增一個nginx的服務,這個nginx的服務會使用一個自定義的nginx.conf掛載到這個容器裡面。
docker run -d -p 80:80 -p 443:443 \
-v /path/to/nginx.conf:/etc/nginx/nginx.conf \
-v /etc/letsencrypt:/etc/letsencrypt \
nginx
或是可以這樣寫
docker run -d -p 80:80 -p 443:443 \
-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf \
-v /etc/letsencrypt:/etc/letsencrypt \
nginx
建立https憑證
設置https憑證有多種方式,以下使用最簡單的Let’s Encrypt取得免費證書。
- 安裝與運行Cerbot取得證書
sudo apt-get install certbot
sudo certbot certonly --standalone -d yourdomain.com - 將生成的證書掛載到Nginx容器中,讓Nginx來處理http以及https請求,將流量轉發到你的前端應用
docker run -d -p 80:80 -p 443:443 \
-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf \
-v /etc/letsencrypt:/etc/letsencrypt \
nginx
$(pwd)/nginx.conf -> shell command,取得當前目錄絕對路徑。
-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf -> 將當前目錄掛載至容器中的/etc/nginx/nginx.conf
-v /etc/letsencrypt:/etc/letsencrypt -> 將/etc/letsencrypt目錄掛載至容器中的相同路徑
- 建立Docker Network,串起你的應用
docker network create my_network
docker network connect my_network your-frontend-container-name
docker network connect my_networkyour-backend-container-name
docker network connect my_network your-nginx-container-id
Nginx配置文件範例如下:
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name yourdomain.com;
# Redirect HTTP to HTTPS
location / {
return 301 https://$host$request_uri;
}
}
}
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location / {
proxy_pass http://your-frontend-container-name:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /api {
proxy_pass http://your-backend-container-name:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
在建立應用時,可能會遇到的問題
502 Bad Gateway 錯誤:
- 可能是Nginx配置出錯,proxy_pass沒設定好,使用了localhost導致Docker環境沒有正確解析。
在建立應用時,還有可能會用到的Docker指令
docker ps #列出運行中的容器
docker build -t your-app . //build image
docker run -d -p 8080:8080 your-app //run image 帶port以及背景執行
docker exec -it cat /var/log/nginx/error.log //檢查nginx log
docker exec -it cat /var/log/nginx/access.log
docker logs container_id //檢查容器log
docker logs -f container_id //即時查看容器log
docker exec -it nginx-cotainer-id curl http://your-frontend-container-name-:80 //在nginx容器內測試服務是否能正常跑起來
docker exec -it nginx-cotainer-id curl http://your-backend-container-name:8080
docker inspect container_id //檢查容器詳情
docker stop container_id 停止容器
docker rm container_id //刪除容器
docker rmi image_id //刪除image
docker container prune //刪除所有停止容器
docker volume create my_volume //使用卷來持久化數據,以防止數據在容器重啟或重新創建後丟失。
docker run -d -v my_volume:/data my_image