目录
Docker-第三部分
Docker容器间的通信及容器间数据共享
容器间Link单项通信
单项通信: 在Docker环境下如果有2个容器,由容器A向容器B建立单项的网络连接
比如开发的web应用是在tomcat下,但是需要连接的数据库mysql是在另外一个容器中。tomcat需要连接mysql,但是mysql并不需要知道tomcat的存在,那么就可以建立单项连接进行访问
docker容器下的虚拟ip
在每个docker环境下,创建容器后,会给创建的容器创建一个虚拟ip,这个ip在外部无法访问,但是在docker容器之间可以互通。但是通过虚拟ip来进行容器访问,有很大的局限性,因为docker run创建容器很容易,每次创建这个容器ip都会发生变化,例如mysql这个容器不用了,新创建一个mysql容器,重新分配了地址,如果tomcat使用虚拟需要修改为新建的mysql的ip才能访问。在大集群环境下,需要修改所有的tomcat配置才能重新访问。所以在容器间进行通信时,一般不使用虚拟ip进行通信,而是通过容器名称进行通信。当新创建的mysql容器和原有的容器同名,不用重启tomcat就可以访问。
–link 容器名容器间的单项通信
启动容器时添加参数 –link 容器名可进行容器间的单项通信,
命令: docker run -d --name 容器自定义名 --link 要连接的容器名 要启动的镜像
演示过程:
- 通过 docker run -d --name web 为tomcat创建一个名为web的容器并运行
docker run -d --name web tomcat
- 创建一个基础的centos系统容器,名称为database,-it使用交互模式,使用交互模式是因为centos创建后默认是退出状态。
docker run -d --name database -it centos /bin/bash
- docker ps 查询容器运行状态获取容器id
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0c7e53e5a72 centos "/bin/bash" About a minute ago Up About a minute database
b6a4632b9878 tomcat "catalina.sh run" 12 minutes ago Up 12 minutes 8080/tcp web
[root@localhost ~]#
- ** docker inspect 容器id **查询对应容器的原始数据
docker inspect b6a4632b9878
定位到NetworkSettings,在这里可以找到"IPAddress": “172.17.0.2”,说明tomcat的虚拟ip是172.17.0.2
"NetworkSettings": {
"Bridge": "",
"SandboxID": "a74b8c72d78a205b014d9a297eb5124484829658756ddde492990d783a7ac1e2",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"8080/tcp": null
},
"SandboxKey": "/var/run/docker/netns/a74b8c72d78a",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "f7e3aab383d0563fe10349a4147c8f9392740c66aed623ad51c5c137f78d3b4e",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "0f79cf34aedbb7a61eaaccf6134f82bb7d63c3d33583808def2f0293f9e10abd",
"EndpointID": "f7e3aab383d0563fe10349a4147c8f9392740c66aed623ad51c5c137f78d3b4e",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
同样可以查看database的虚拟ip,可以看到daatabase的虚拟ip是"172.17.0.3"
"NetworkSettings": {
"Bridge": "",
"SandboxID": "6ca06aa6c00a2b9e83e7d781eef7b20e37deef81ce0e48e49bd54ee5b21e851c",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/6ca06aa6c00a",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "1459ee53c8aa71725f79509904b5246a7b48a6b01e77fe8e78e5d632d5706748",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,