背景
有一台腾讯的Linux云主机,在服务器上部署了一个docker(称为ServiceDocker,名称为sign,下同),ServiceDocker内部使用了80、443、3306端口,分别映射到宿主机(云主机)的相同端口(即80、443、3306)。
ServiceDocker中安装了XAMPP,在此基础上部署了扫码签到小程序的服务器。ServiceDocker的80和443端口分别提供http和https服务,3306为MySQL数据库的端口。
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内部使用端口80、443,分别映射到主机的80和443端口。
NginxDocker用来做反向代理。当有访问请求时,读取Nginx配置后,不同的URL定向到各自对应的Docker。例如:访问http://sign.famend.cn:80,则自动映射到http://sign.famend.cn:89。
实现步骤
1. 修改ServiceDocker的端口映射,释放80和443端口。
Docker没有提供命令修改端口,从网上我找到了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 命令。
④执行 cd /var/lib/docker/containers 命令令进入找到与 Id 相同的目录。
在执行cd 命令时如果提示permission denied,可以先执行 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内部的80端口映射为主机的80端口;修改之后,ServiceDocker内部的80端口映射为主机的89端口。
新闻热点
疑难解答