在Docker运行容器+端口映射和磁盘映射:
docker run -it -d -p 80:8080 -v /root/www/www:/usr/local/tomcat/webapps/ROOT tomcat
参数解读:
-d:后台运行;
-p:端口映射 上述80为宿机端口,8080为容器内部端口;
-v:文件挂载 指定宿机目录映射到容器内部的目录(上述就是把宿机/root/www/www的地址映射到容器内部的/usr/local/tomcat/webapps/ROOT目录里面去,容器加载/tomcat/webapps/ROOT目录的时候,实际就是用的www目录)
大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改。通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射。
有没有办法不保存镜像而直接修改已有的这个容器呢?有。在stackoverflow上面找到答案了,原帖链接
方法一
- 1、停止容器(docker stop d00254ce3af7)
- 2、停止docker服务(systemctl stop docker)
- 3、修改这个容器的hostconfig.json文件中的端口(原帖有人提到,如果config.v2.json里面也记录了端口,也要修改)
cd /var/lib/docker/containers/d00254ce3af7* #这里是CONTAINER ID
vim hostconfig.json
如果之前没有端口映射, 应该有这样的一段:
"PortBindings":{}
增加一个映射, 这样写:
"PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":"60000"}]}
前一个数字是容器端口, 后一个是宿主机端口。将宿主机的60000端口映射到容器的8080端口
而修改现有端口映射更简单, 把端口号改掉就行。
- 4、启动docker服务(systemctl start docker)
- 5、启动容器(docker start d00254ce3af7)
hostconfig.json文件
config.v2.json文件
方法二
1、获得容器IP
将container_name 换成实际环境中的容器名
docker inspect `container_name` | grep IPAddress
2、iptable转发端口
将宿主机的60000端口映射到容器的8080端口
iptables -t nat -A DOCKER -p tcp --dport 60000 -j DNAT --to-destination 172.17.0.2:8080
扩展
提交现有容器为新镜像,然后重新运行它
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a3422adeead ubuntu:14.04 "/bin/bash" About a minute ago Exited (0) About a minute ago agitated_newton
$ docker commit 5a3422adeead newimagename
$ docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash
export容器为镜像,然后import为新镜像
$docker container export -o ./myimage.docker 容器ID
$docker import ./myimage.docker newimagename
$docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash
解决重启容器后hostconfig.json被覆盖
首先输入docker ps -a 可以看到我当前的名叫mynginx容器只打开了80端口
然后执行docker update mynginx –restart=always
然后停止容器systemctl stop docker
然后进入到该容器的hostconfig.json文件中,增加一个8000的端口
参考
https://blog.csdn.net/qq_29611427/article/details/92626135
https://blog.csdn.net/weixin_42292991/article/details/95529217
发表回复