docker run可以指定端口映射
1 | docker run -d -p 80:80 --name name |
但是容器一旦生成,就没有一个命令可以直接修改。通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射。
1 2 3 4 | $ docker stop A $ docker commit A imageA #将容器commit提交成为一个镜像 $ docker rm A #删除原镜像 $ docker run -d -p 80:80 --name A imageA #启动新镜像 |
但这样太麻烦了。现在有新方案来解决掉:
## 查看id 就是 容器的 hash_of_the_container 数值
docker inspect 容器名字 第一个ID就是完整的容器id
修改容器的配置, 需要重启 DOCKER 服务, 否则会失败
停止容器, 停止服务 (systemctl stop docker 或 service docker stop)
## 修改hostconfig.json
vim /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
在 hostconfig.json 里有 "PortBindings":{} 这个配置项,可以改成 "PortBindings":{"80/tcp":[{"HostIp":"0.0.0.0","HostPort":"8080"}]}
例 hostconfig.json 已删除不相关配置, 只保留格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | { "PortBindings": { "5700/tcp": [{ "HostIp": "", "HostPort": "10086" }], "6700/tcp": [{ "HostIp": "", "HostPort": "6700" }], "9000/tcp": [{ "HostIp": "", "HostPort": "8080" }] } } |
## 修改config.v2.json
vim /var/lib/docker/containers/[hash_of_the_container]/config.v2.json
如果没有ExposedPorts 在 config.v2.json 里面添加一个配置项 "ExposedPorts":{"80/tcp":{}} , 将这个配置项添加到 "Tty": true, 前面,如果有就修改这两项的值: config->ExposedPorts 和 networsettings->Ports
例 config.v2.json 已删除不相关配置, 只保留格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | { "Config": { "ExposedPorts": { "5700/tcp": {}, "6700/tcp": {}, "9000/tcp": {} } }, "NetworkSettings": { "Ports": { "5700/tcp": [{ "HostIp": "0.0.0.0", "HostPort": "10086" }], "6700/tcp": [{ "HostIp": "0.0.0.0", "HostPort": "6700" }], "9000/tcp": [{ "HostIp": "0.0.0.0", "HostPort": "8080" }] } } } |
## 最后重启服务, 启动容器 (systemctl start docker/service docker start)
## 查看配置项已经修改成功
docker inspect 容器名
如果安装了防火墙 Iptables 还需要在容器运行时添加映射
1 | iptables -t nat -A DOCKER -p tcp --dport 宿主机端口 -j DNAT --to-destination 容器ip:容器端口 |
查看所有容器内ip
1 | docker inspect --format='{{.NetworkSettings.IPAddress}}' $(docker ps -a -q) |
有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动,可docker命令修改
1 | docker container update --restart=always 容器名字 |
停止所有容器命令:
1 | sudo docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2) |
启动所有容器命令:
1 | sudo docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) |