看这里:
戳此链接 通往 关于 Docker 所有的学习文章 !
我们知道,在我们 run a Container 的时候,可以使用 -P(随机端口映射) 或 -p(指定端口映射);那么这是 run 容器的时候做的,那么我们如果给一个运行中的容器做端口映射呢?
首先排除 docker run ,因为docker run 每执行一次就会创建一个 新的容器,跟我们之前旧的容器没有任何关系!还有 docker update 也只是更新容器中 mem、cpu 限制的配置。 并没有针对端口做更新!
当前,并没有直接使用 docker command 可以实现针对:运行容器中 端口映射的更改!但是不代表无法实现!
看一下 docker run 时 -P 和 -p 的用法:
docker run -P :
root@zhengzelin:~# docker run -itd -P nginx:latest
root@zhengzelin:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a436a2d7f6a3 nginx:latest "nginx -g 'daemon of…" 12 minutes ago Up 12 minutes 0.0.0.0:32768->80/tcp optimistic_thompson
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
docker run -p :
-p : 指定端口映射(有以下四种格式:)
ip:hostport:ContainerPort
ip::ContainerPort
hostPort:ContainerPort
ContainerPort (最常用了吧)
root@zhengzelin:~# docker run -itd -p 8080 nginx:latest
0f39e1c98b408eb13d2b15b92116306906fc9786067cde08cebfc348f9d6949e
root@zhengzelin:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f39e1c98b40 nginx:latest "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 80/tcp, 0.0.0.0:32771->8080/tcp determined_bassi
a436a2d7f6a3 nginx:latest "nginx -g 'daemon of…" 58 minutes ago Up 3 minutes 0.0.0.0:32769->80/tcp optimistic_thompson
我们都知道 docker commit 是将 docker Container 打包成一个镜像!那么我们就可以使用 docker commit 将该容器打包,然后再使用 docker run 基于打包后的 new image 构建一个 new container !
关于 docker commit 命令详解 ,及 docker container 其他 commands 介绍
"1、打包容器成为镜像!"
docker commit -a "指定作者名" -m "指定注释消息" 容器ID(Name 也可) imagename:tag
# 上面 -a 和 -m 选项为 可选选项! 不是必须加,不过 推荐加! 你可以使用 docker inspect imagename 来查看镜像信息!
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
"2、查看生成的镜像:"
docekr images , 或 docker inspect 镜像名
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
"3、docker run 新的容器"
随机端口映射: docker run -itd -P 生成的镜像名:tag
docker ps
指定端口映射(文章开头有格式):
eg: docker run -itd -p 指定的端口 生成的镜像名:tag
root@zhengzelin:~# docker run -itd -p 8080 nginx:latest
0f39e1c98b408eb13d2b15b92116306906fc9786067cde08cebfc348f9d6949e
root@zhengzelin:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f39e1c98b40 nginx:latest "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 80/tcp, 0.0.0.0:32771->8080/tcp determined_bassi
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
如果因为新容器IP的变更,导致其他的变更,你可以查看旧容器的ip,然后将旧容器删除,
更改新容器的IP为旧容器的IP,然后重启docker 服务,重启容器!(不推荐,只能在某些时间段更改)
关于方法,下面有!往下滑!
1、我们都知道 docker 容器的默认存储路径为: /var/lib/docker/containers/
2、使用 docker ps 查看容器的 ID!(不是默认路径使用:docker inspect | grep 容器ID 即可!)
3、便可得知,需要更改的容器的配置文件的路径;
4、开始修改
5、修改完成
6、重启docker服务,重启之前开启的所有容器
注意:不推荐使用,只是这也是一种方法! 生产环境中 谁敢随随便便重启 某个服务? 还有导致很多 docker container stop,这不是没事找死呢吗?
★ ★ ★ 强烈不推荐!!!只是知道还有这种方法可以实现!
1、获得 容器id:
root@zhengzelin:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e8b0d9697474 nginx:latest "nginx -g 'daemon of…" 19 minutes ago Up 19 minutes 80/tcp, 0.0.0.0:32774->8080/tcp cool_gauss
2、修改配置文件:(这里的路径只是我的路径,你的路径使用你的容器ID)
root@zhengzelin:~# vim /var/lib/docker/containers/e8b0d9697474f...../hostconfig.json
3、找到里面关于 HostPort 的配置选项:
"PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":""}]}
# 将这个端口改为你要更改的端口即可!除了 tcp ,你还可以使用 udp;
# 默认是tcp,如果使用 udp的话,你得提前声明 : 8080/udp
如果你的这里和我显示的不一样,你可以参考这篇文章:http://www.360doc.com/content/20/0419/18/835902_907077226.shtml
4、重启docker 服务,重启 容器 !!!(强烈不推荐使用该方法!)
修改容器 hostname 和 ip(也不推荐,只是告诉方法:)
在上面那个路径: /var/lib/docker/容器ID/ 目录下,还有其他两个配置文件: hostname 和 hosts ,你查看一下就知道了!不过也需要 重启服务 和 容器,谁闲的没事更改这些配置啊,不推荐使用!
1、获取容器的 IP:
格式: docker inspect 容器ID/容器名 | grep -i ipaddress
root@zhengzelin:~# docker inspect cool_gauss | grep -i ipaddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
将 容器的8000端口映射到docker主机的8001端口
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.2:8000