背景
有一臺騰訊的Linux云主機,在服務器上部署了一個docker(稱為ServiceDocker,名稱為sign,下同),ServiceDocker內(nèi)部使用了80、443、3306端口,分別映射到宿主機(云主機)的相同端口(即80、443、3306)。
ServiceDocker中安裝了XAMPP,在此基礎上部署了掃碼簽到小程序的服務器。ServiceDocker的80和443端口分別提供http和https服務,3306為MySQL數(shù)據(jù)庫的端口。
ServiceDocker綁定了域名sign.famend.cn。
目標
云主機中的一個ServiceDocker占用了80、443端口,如果想在主機中再部署一臺服務器對外服務,就不能使用80和443端口了。
我們的目標是在主機中可以部署多個ServiceDocker,每個ServiceDocker綁定各自的域名,對外提供服務,保證80和443端口可用。
思路
修改ServiceDocker的端口映射,把ServiceDocker端口80、443分別映射到主機的89、449端口,這樣主機的80、443端口釋放出來了。
釋放出來的80和443端口供Nginx使用。安裝帶Nginx的docker(稱為NginxDocker,名稱為mynginx,下同)。NginxDocker內(nèi)部使用端口80、443,分別映射到主機的80和443端口。
NginxDocker用來做反向代理。當有訪問請求時,讀取Nginx配置后,不同的URL定向到各自對應的Docker。例如:訪問http://sign.famend.cn:80,則自動映射到http://sign.famend.cn:89。
實現(xiàn)步驟
1. 修改ServiceDocker的端口映射,釋放80和443端口。
Docker沒有提供命令修改端口,從網(wǎng)上我找到了2種方法。
方法1:先停止容器,再將容器打包成鏡像,接著運行新的鏡像。在運行新的鏡像時指定新的端口。使用的命令如下:
#先停止容器
docker stop containerA
#將容器commit成為一個鏡像
docker commit containerA newImageB
#運行容器
docker run -p 8080:8080 -p 8081:8081 -v /home/data/:/home/data/ -dt newImageB
方法2:先停止容器,接著停止容器服務,然后修改容器配置文件,最后啟動容器服務、啟動容器。步驟如下:
①停止ServiceDocker(ServiceDocker的名稱為sign),停止docker服務。
sudo docker stop sign
sudo service docker stop
②使用 docker ps -a 命令找到要修改容器的 CONTAINER ID。
③運行 docker inspect 【CONTAINER ID】 | grep Id 命令。
④執(zhí)行 cd /var/lib/docker/containers 命令令進入找到與 Id 相同的目錄。
在執(zhí)行cd 命令時如果提示permission denied,可以先執(zhí)行 sudo -s。
進入id對應的目錄后,打開文件hostconfig.json。
找到80端口的映射,如下:
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "80"
}]
把 "HostPort": "80" 修改成 "HostPort": "89" , 如下
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "89"
}]
修改之前,ServiceDocker內(nèi)部的80端口映射為主機的80端口;修改之后,ServiceDocker內(nèi)部的80端口映射為主機的89端口。
稍加說明,有文章(參考資料中的2、3)提到還需要修改config.v2.json,親測不需要。這個文件在啟動ServiceDocker時會自動修改。
⑤啟動docker服務,然后啟動ServiceDocker(名稱為sign)。
sudo service docker start
sudo docker start sign
方法(1)和方法(2)都可以,我選用了方法(2)。
在執(zhí)行完方法(2)之后,打開瀏覽器驗證,提示“網(wǎng)站無法訪問”。
初步估計docker中的服務器沒有啟動,運行命令:
sudo /opt/lampp/lampp stop
sudo /opt/lampp/lampp start
運行stop的時候,發(fā)現(xiàn)apache 沒有啟動,可能是修改了80端口的緣故。
在執(zhí)行start之后,打開瀏覽器驗證http://sign.famend.cn:89和https://sign.famend.cn:449,成功訪問。
修改Docker端口的方法并不復雜,如果docker以后的版本能夠提供相應命令,相信會方便很多。
順便,運行 crontab -l 查看ServiceDocker中的定時任務是否啟動,如果沒啟動,運行 service cron start 啟動定時任務。
下一步,配置NginxDocker反向代理,讓http://sign.famend.cn:80和https://sign.famend.cn:443也能成功訪問。
2. 配置NginxDocker反向代理。
①下載nginx,并運行它。
docker container run \
-d \
-p 80:80 \
-p 443:443 \
--rm \
--name mynginx \
nginx
②配置nginx的配置文件。
mkdir nginx-files
docker container cp mynginx:/etc/nginx .
mv nginx conf
vi conf/nginx.conf
在nginx.conf中,添加如下反向代理信息。
server{
listen 443 ssl;
server_name sign.famend.cn;
ssl_certificate /etc/nginx/ssl/sign.famend.cn/1_sign.famend.cn_bundle.crt;
ssl_certificate_key /etc/nginx/ssl/sign.famend.cn/2_sign.famend.cn.key;
location / {
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;
proxy_pass http://sign.famend.cn:89/;
}
}
server{
listen 80;
server_name famend.cn sign.famend.cn;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr:89;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://sign.famend.cn:89/;
}
}
對于443端口,需要使用ssl_certificate和ssl_certificate_key。在ServiceDocker中證書使用的LetsEncrypt的SSL證書,每90天更新一次。
SSL證書的來源:一種方法,可以讓它們共享LetsEncrypt的SSL證書。除此之外,在騰訊注冊的域名,騰訊免費提供SSL證書,有效期為1年。
為了簡便,我直接使用了騰訊的SSL證書,當然,一年之內(nèi),必須在過期之前更新證書。
③停止mynginx,然后重啟它。
docker container run \
--name mynginx \
--volume "$PWD/conf":/etc/nginx \
-p 80:80 \
-p 443:443 \
-d \
nginx
這次,去掉 --rm 參數(shù),以便停止運行的時候保留容器。
至此,配置完成。
驗證
瀏覽器中分別打開
sign.famend.cn:80
sign.famend.cn:89
sign.famend.cn:449
sign.famend.cn:443
都能正常訪問。當然,打開449和443時候,可以發(fā)現(xiàn)兩個URL使用的證書不一樣。449是LetsEncrypt提供的,有效期90天;443來自騰訊(頒發(fā)機構(gòu)TrustAsia),有效期1年。
當然,ServiceDocker中的另外一個網(wǎng)站famend.cn,也可以訪問:
famend.cn:80
famend.cn:89
總結(jié)
以上所述是小編給大家介紹的使用Nginx實現(xiàn)服務器中多容器共存的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!