今天我們來(lái)講一講怎么用docker部署nginx,并通過(guò)nginx部署ssl證書(shū)
第一步、安裝nginx
docker pull nginx:latest
老樣子通過(guò) docker images去查看是否安裝成功

第二步、接下來(lái)啟動(dòng)nginx?
啟動(dòng)之前我們現(xiàn)在根目錄的/opt/docker_v/nginx下新建四個(gè)文件夾,分別為conf,conf.d, html , logs ,用來(lái)映射配置文件
docker run --name nginx -d -p 80:80 -p 443:443 -p 3900:3900 -p 3700:3700 -v /opt/docker_v/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /opt/docker_v/nginx/html:/usr/share/nginx/html -v /opt/docker_v/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/docker_v/nginx/logs:/var/log/nginx nginx
此時(shí)運(yùn)行會(huì)報(bào)錯(cuò)

看字面意思是說(shuō)nginx.conf不是一個(gè)文件夾,是否確定將一個(gè)文件夾映射到一個(gè)文件中,這個(gè)問(wèn)題困擾了我好久,查了很多資料,終于找到了解決辦法,如下:
1、首先運(yùn)行 :docker run --name nginx -p 8086:80 -d nginx
注意:這個(gè)命令不會(huì)將配置文件映射出來(lái)
2、通過(guò)docker cp命令將剛剛運(yùn)行的nginx容器中的相關(guān)配置文件拷貝到我們后需要映射的目錄下
docker cp 07e55c69a133:/etc/nginx/conf.d/default.conf /opt/docker_v/nginx/conf.d/default.conf
docker cp 07e55c69a133:/usr/share/nginx/html /opt/docker_v/nginx/html
docker cp 07e55c69a133:/etc/nginx/nginx.conf /opt/docker_v/nginx/conf/nginx.conf
docker cp 07e55c69a133:/var/log/nginx /opt/docker_v/nginx/logs
3、docker rm -f 剛剛運(yùn)行的nginx容器,他的使命已經(jīng)結(jié)束了
4、再次運(yùn)行我們之前的命令
docker run --name nginx -d -p 80:80 -p 443:443 -p 3900:3900 -p 3700:3700 -v /opt/docker_v/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /opt/docker_v/nginx/html:/usr/share/nginx/html -v /opt/docker_v/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/docker_v/nginx/logs:/var/log/nginx nginx
這個(gè)時(shí)候就不會(huì)報(bào)錯(cuò)了,通過(guò)瀏覽器打開(kāi)我們的域名地址

第三步、通過(guò)nginx反向代理轉(zhuǎn)發(fā)
假如我們有一個(gè)項(xiàng)目,端口號(hào)為8086,此時(shí)如果通過(guò)域名去訪問(wèn),必須加上端口號(hào)才能訪問(wèn),如:http://api.mofang.cn:8086 ,因?yàn)榉?wù)器默認(rèn)的端口號(hào)為80,只有端口號(hào)為80的項(xiàng)目才可以不需要額外加上端口號(hào)
此時(shí)我們就可以用nginx做一個(gè)代理轉(zhuǎn)發(fā),具體步驟如下
1、進(jìn)入到我們之前映射的配置目錄,找到nginx.conf文件
添加一下代碼
server {
? ? ? ? listen 80;#端口號(hào)
? ? ? ? server_name? api.mofang.top;//配置好的二級(jí)域名
? ? ? ? location / {
? ? ? ? ? ? ? ?proxy_pass http://公網(wǎng)IP:8086;
? ? ? ? ? ? ? ?root? /usr/share/nginx/html;
? ? ? ? ? ? ? ?index? index.html index.htm;
? ? ? }
}

配置好以后 重啟nginx??
docker restart nginx
這個(gè)時(shí)候,我們的項(xiàng)目就通過(guò)nginx代理到了我們的8086端口上,通過(guò)剛剛的二級(jí)域名就能直接訪問(wèn)了,不需要加端口了
第四步、前兩天我在阿里云上申請(qǐng)了一個(gè)免費(fèi)的ssl證書(shū),今天一起搞了
如何申請(qǐng)請(qǐng)看這 https://yq.aliyun.com/articles/637307
證書(shū)部署步驟如下
1、首先將下載下來(lái)的證書(shū)添加的服務(wù)器的/opt/docker_v/nginx/conf/ca目錄下
2、通過(guò)docker cp拷貝到nginx容器內(nèi)部的/etc/nginx/ca目錄下
注意:容器內(nèi)部ca文件夾需要自己去mkdir
docker cp /opt/docker_v/nginx/conf/ca/4468778_api.mofang.top.pem e0b892b8ac43:/etc/nginx/ca/4468778_api.mofang.top.pem?
docker cp /opt/docker_v/nginx/conf/ca/4468778_api.mofang.top.key e0b892b8ac43:/etc/nginx/ca/4468778_api.mofang.top.key
3、配置nginx.conf文件,在文件下方加上以下代碼
server {
#SSL 訪問(wèn)端口號(hào)為 443 docker映射端口3700
listen 443 ssl;
#填寫(xiě)綁定證書(shū)的域名
server_name api.mofang.top;
#證書(shū)文件名稱
ssl_certificate ca/4468778_api.mofang.top.pem;
#私鑰文件名稱
ssl_certificate_key ca/4468778_api.mofang.top.key;
ssl_session_timeout 5m;
#請(qǐng)按照以下協(xié)議配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#請(qǐng)按照以下套件配置,配置加密套件,寫(xiě)法遵循 openssl 標(biāo)準(zhǔn)。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://公網(wǎng)IP:8086;
}
}

接下來(lái)重啟nginx,就OK了
最后提一句:nginx配置過(guò)程中不是一帆風(fēng)順,大家一定要用好映射出來(lái)的logs文件,里面有錯(cuò)誤日志,錯(cuò)誤一目了然,可以給大家減少許多時(shí)間。