最近在研究docker,发现个问题就是创建docker容器之后不能再继续添加端口映射了,于是写一下我新加端口映射的记录,供大家参考
首先我使用的是一台centos7的虚拟机,然后在虚拟机内创了一个docker容器,镜像从网易云的docker仓库拉取下来的
https://c.163yun.com/hub#/m/home/
下载地址为:docker pull hub.c.163.com/public/centos:6.7-tools
也是我们在创建docker时需要使用的命令
因为版本中有7.2-tools,所以我把命令改成了
docker pull hub.c.163.com/public/centos:7.2-tools
# 1.下载关于Docker的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2
# 2.设置下载Docker的镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3.安装Docker
yum -y install docker-ce
# 4.启动Docker并添加开机启动
systemctl start docker
systemctl enable docker
验证Docker是否安装成功
docker version
docker run hello-world
如果执行第一条命令能出现版本号,意味着docker安装成功
下面开始创建centos的容器
# 1.获取centos镜像
docker pull hub.c.163.com/public/centos:7.2-tools
# 后台运行docker,名字为centos-test,设置高权限,端口映射从本地2200到docker的22端口(用于ssh连接)
docker run -d --name centos-7.2 --privileged=true -p 2200:22 hub.c.163.com/public/centos:7.2-tools /usr/sbin/init
# 进入docker
docker exec -it centos-7.2 /bin/bash
能进入代表启动成功
exit
退出
docker ps -a
查看所有的docker容器,其中会有写端口映射的内容
这个就是本地的2200端口映射到docker的22端口
因为docker的start指令没有-p参数,所以只能通过修改配置文件来增加端口映射
注意:在添加端口映射前要关掉相应的docker容器,修改文件之后要重启docker服务,然后再开启相应的容器,也就是先docker stop XXX
,然后修改配置文件,然后systemctl restart docker
,最后docker start xxx
docker的主目录在/var/lib/docker
,docker容器的目录在这个目录的containers/
中,这里的文件夹名字很长,不过文件夹前12位字符,就是通过docker ps -a
展示出来的CONTAINER ID
我的centos容器的CONTAINER ID为ada5bcd7d743
所以我的这个容器的文件夹名字就是以这个开头的,进入到这个容器的目录中
/var/lib/docker/containers/ada5bcd7d7433d585c87eb85ebf6bbbade43f190a5874c1e1e9e0f0ff06a0a1d
里面有config.v2.json
和hostconfig.json
两个文件需要修改,这里我把两个文件传到本地计算机,修改完之后再传上去,这样本地编辑器有格式化工具,方便修改
# 这里是 config.v2.json文件,我们可以找到如下的内容
# 我们在"Tty"这一项上面的"ExposedPorts"添加内容
# 如果没有做过端口映射,那"ExposedPorts"是空的,直接按照我这个格式改就可以
"ExposedPorts": {
"22/tcp": {},
# 这里是我们添加的内容
"80/tcp": {}
},
"Tty": false,
# 这个文件还有个位置需要更改
# 在下面有"Ports"一项,这里按照之前的22端口映射的格式,加了一项80的端口映射
# "80/tcp"指的是容器内部的端口,使用tcp协议,里面的"HostPort"指定的外部主机的端口800
"Ports": {
"22/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "2200"
},
{
"HostIp": "::",
"HostPort": "2200"
}
],
# 这一项是我添加的内容
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "800"
},
{
"HostIp": "::",
"HostPort": "800"
}
]
},
# 这里是 hostconfig.json文件,我们可以找到如下的内容
# 按照之前创建容器时指定的22号端口的映射配置
# 我添加了一项格式相同的配置80端口的映射
# "80/tcp"指的是容器内部的端口,使用tcp协议,里面的"HostPort"指定的外部主机的端口800
"PortBindings": {
"22/tcp": [
{
"HostIp": "",
"HostPort": "2200"
}
],
# 这一项是我添加的内容
"80/tcp": [
{
"HostIp": "",
"HostPort": "800"
}
]
}
这只是文件内容的一部分,不要直接把这些内容覆盖进去
配置文件修改完成之后上传到主机服务器上
systemctl restart docker
重启docker服务
docker ps -a
查看之前的docker容器,记录下来CONTAINER ID
docker start [CONTAINER ID]
通过你的CONTAINER ID启动docker,也可以使用之前指定的名字,我的是centos-7.2
docker ps -a
这时我们看到我们的docker容器已经增加了端口映射