注:此处以 Ubuntu 镜像为例
方法一 :将容器提交为新的镜像之后运行镜像并添加端口
1.将容器打包成镜像
docker commit :从容器创建一个新的镜像。 语法 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] OPTIONS说明: • -a :提交的镜像作者; • -c :使用Dockerfile指令来创建镜像; • -m :提交时的说明文字; • -p :在commit时,将容器暂停。
docker commit -m 'no port' ubuntu np-ubuntu:v1
2.运行镜像并添加端口
docker run -itd --name=ubuntu1 -p 5022:22 np-ubuntu:v1 /bin/bash
5022:22 代表:主机端口:容器内部的端口
执行示例如下:
方法二:端口转发
1. 获取容器IP
docker inspect : 获取容器/镜像的元数据。 语法 docker inspect [OPTIONS] NAME|ID [NAME|ID...] OPTIONS说明: -f :指定返回值的模板文件。 -s :显示总的文件大小。 --type :为指定类型返回JSON。
docker inspect `container_name` | grep IPAddress1
docker inspect ubuntu | grep IPAddress
注:容器需在运行中
2. iptable转发端口
iptables详解请参考:iptables入门指南 --- iptables详解 ---iptbales 防火墙
将容器的 22 端口映射到docker主机的 6022 端口
iptables -t nat -A DOCKER -p tcp --dport 6022 -j DNAT --to-destination 172.17.0.2:22
执行示例如下:
补充:
查看iptables到底设置了什么规则
sudo iptables -t nat -vnL
如果加错了或者想修改:
先显示行号查看
sudo iptables -t nat -vnL DOCKER --line-number
删除规则3
sudo iptables -t nat -D DOCKER 3
操作示例如下:
方法三:修改容器对应的配置文件
即:修改/var/lib/docker/containers/[containerId]目录下,hostconfig.json和config.v2.json 两个配置文件。
1. 停止容器,停止docker服务
docker stop container_id
systemctl stop docker
2. 修改配置文件
2.1 修改 hostconfig.json文件,修改点一处
在 hostconfig.json 里有 "PortBindings":{} 这个配置项,可以改成"PortBindings":{"22/tcp":[{"HostIp":"","HostPort":"5022"}]} 这里 22 是容器端口, 5022 是本地端口
2.2 修改 config.v2.json 文件,修改点两处
在 config.v2.json 里面添加一个配置项 "ExposedPorts":{"22/tcp":{}}
配置项 "Ports": {} 修改成 "Ports": {"22/tcp": [{"HostIp": "0.0.0.0","HostPort": "5022"}]}
注:修改配置文件前必须先停掉容器及docker服务否则修改将无效