目录

一、端口映射(相当于添加iptables的DANT)

二、数据卷创建(宿主机目录或文件挂载到容器中)

三、数据卷容器(多个容器通过同一个数据卷容器为基点,实现所有容器数据共享)

四、容器互联(可以通过容器名称或连接别名通信)


一、端口映射(相当于添加iptables的DANT)

在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务的。

端口映射机制将容器内的服务提供给外部网络访问,实际上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可以访问容器内的服务。

两种方式

[root@localhost ~]#docker run -d --name test01 -P nginx:test###随机映射端口 (从32768开始)[root@localhost ~]#docker run -d --name test02 -p 1314:80 nginx:test##指定映射端口

原理:实际上就是创建了一条iptables规则DNAT规则

拓展:如何针对已经自定义的端口号,修改为新的端口号

方式一:将当前容器打包成镜像,重新指定映射端口,创建新的容器

就是类似于容器迁移 先快照保存,然后在本地导入,再重新docker run 去指定映射端口,但是容器的ip会变化,除非把原有的容器删除,然后再通过自定义网络模式去指定相同的ip

方式二:直接在原容器上进行修改

先关闭容器,然后查看容器的Id,然后进去docker管理容器的目录,修改hostconfig.json和config.v2.json文件;然后重启docker,重启容器。这种方式,一旦重启docker会让所有的容器停止。

##停止容器[root@localhost opt]#docker stop test01test01##查看容器的id[root@localhost opt]#docker inspect test01 |grep Id"Id": "0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e",##进入docker管理容器的库目录[root@localhost opt]#cd /var/lib/docker/containers/0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#ls0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e-json.logconfig.v2.json hostnamemounts resolv.conf.hashcheckpointshostconfig.jsonhosts resolv.conf##修改hostconfig.json 配置文件和config.v2.json配置文件[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#vim hostconfig.json [root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#vim config.v2.json ##重启docker[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#systemctl restart docker.service ##查看容器端口是否修改[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#docker inspect test01|grep 5566"HostPort": "5566"##重启容器[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#docker start test01test01[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#docker ps -aCONTAINER ID IMAGECOMMAND CREATED STATUS PORTS NAMES0a242c04664b nginx:test01 "nginx -g 'daemon of…" 5 minutes ago Up 4 seconds 0.0.0.0:5566->80/tcp, :::5566->80/tcp test01[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#curl 192.168.20.10:5566this is test01[root@localhost 0a242c04664bb5242624b5d40defa2e1b3936e510b5d60ea043bf880f659e31e]#

vim hostconfig.json "HostPort":"5566"

vim config.v2.json##如果有的话"HostPort":"5566"

拓展:关于-p指定端口映射,还有很多方式

二、数据卷创建(宿主机目录或文件挂载到容器中)

因为容器的数据是临时的,一旦容器被删除,数据将永久丢失。想要将容器中的数据持久化,可以将宿主机目录挂载到容器中。

数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于Linux下对目录进行的mount操作。

宿主机的目录可以同时挂载到多个容器中,可以实现基于宿主机将容器之间的数据进行共享!!

注意:一般只建议在创建容器时进行挂载,不建议启动容器后再挂载。因为启动容器后再挂载的话,需要修改配置文件,且不一定能挂载成功。

docker run -d -v 宿主机目录:数据卷镜像名称:标签 #将宿主机目录挂载到容器中 #注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。 #挂载后的目录默认可读可写 ##如果想要修改为只读,那么为docker run -d -v 宿主机目录:数据卷:ro镜像名称:标签也可以直接创建单独的数据卷,不挂载 docker run -v 数据卷#在容器内创建数据卷

容器通过宿主机作为基点,可以实现文件共享

宿主机的目录可以同时挂载到多个容器中,可以实现基于宿主机将容器之间的数据进行共享!!

宿主机挂载到容器目录中,并设置为只读

 #如果希望挂载后的目录为只读目录,可以在挂载时加:ro参数 docker run -v 宿主机目录:数据卷:ro#将宿主机目录挂载到容器中,只可读

三、数据卷容器(多个容器通过同一个数据卷容器为基点,实现所有容器数据共享)

直接创建数据卷,也可以创建多个数据卷。让容器之间基于数据卷容器,实现数据共享

docker run -itd --name cc01 -v /data -v /mnt nginx:test01##在cc01容器中创建两个数据卷docker exec -it test01 sh##进入容器完成测试文件编写 #使用--volumes-from 来挂载cc01容器中的数据卷到新的容器cc02和cc03中[root@localhost data]#docker run -d --name cc02 --volumes-from cc01 nginx:test01[root@localhost data]#docker run -d --name cc03 --volumes-from cc01 nginx:test01

创建数据卷的时候 将宿主机的目录挂载到了数据卷中,然后再将新的容器将test01容器的数据卷挂载到新创建的容器中

这样既可以实现数据的持久化,同时性能比较高,因为容器之间的通信比较块

#创建数据卷容器test01。创建/usr/share/nginx/html数据卷。docker run -d --name test01 -v /data/:/usr/share/nginx/html:ro nginx:test01#使用--volumes-from 来挂载test01容器中的数据卷到新的容器test03和test04中docker run -d --name test03 -p 9998:80 --volumes-from test01 nginx:test01docker run -d --name test04 -p 9997:80 --volumes-from test01 soscscs/myapp:v1##可以进去查看目录 docker exec -it test03 sh cd /usr/share/nginx/htmlls完成验证##因为做了端口映射或者使用curl 访问ip

四、容器互联(可以通过容器名称或连接别名通信)

容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之问建立一条隧道,接收容器可以看到源容器指定的信息。

#创建并运行源容器取名test01docker run -d --name test01 nginx:test01 #创建并运行接收容器取名test02,使用--link选项指定连接容器test01以实现容器互联。 docker run -itd --name test02 --link test01:aa centos:7 /bin/bash ##--link 容器名:连接的别名 ​ #进test02容器,ping test01,通过容器名称或者别名都可以通信 docker exec -it test02 bashping test01ping aa#可以看到c1容器的IP地址 ​#创建容器test03,没有与test01做互联docker run -d --name test03 nginx:test01 docker exec -it test03 bash#进入容器c5 #通过c1的容器名称和别名,都无法和c1通信/ # ping test01ping: bad address 'test01'/ # ping aaping: bad address 'aa'/ # ping 172.17.0.2PING 172.17.0.2 (172.17.0.2): 56 data bytes #只能通过IP进行通信