一,使用 --link容器互联 html
docker 默认使容许container 互通的(经过-icc=false 关闭互通)同一个宿主机上的多个docker容器之间若是想进行通讯,能够经过使用容器的ip地址来通讯,也能够经过宿主机的ip加上容器暴露出的端口号来通讯,前者会致使ip地址的硬编码,不方便迁移,而且容器重启后ip地址会改变,除非使用固定的ip,后者的通讯方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通讯。经过docker的link机制能够经过一个name来和另外一个容器通讯,link机制方便了容器去发现其它的容器而且能够安全的传递一些链接信息给其它的容器。 node
格式 -link name:alias 命令链接指定container web
1,建立并启动一个被链接的容器spring
docker run --name mypostgres_merry -d -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e PGDATA=/data/ -e POSTGRES_USER=admin -e POSTGRES_DB=my_db postgres
查看容器名称 docker pssql
2,修改主程序配置文件docker
# 生产配置 server: port: 8081 spring: jpa: show-sql: true hibernate: ddl-auto: update properties: hibernate: jdbc: lob: non_contextual_creation: true datasource: driverClassName: org.postgresql.Driver url: jdbc:postgresql://db:5432/my_db username: admin password: 123456 initialization-mode: always #执行根目录下面data.sql初始化数据 continue-on-error: false
3,启动主程序并链接到另外一个容器数据库
docker run -d --name web --link mypostgres_merry:db -p 8081:8081 ejiyuan/demo-docker
注意,link后面的名字要必须是一个存在的容器名称(与上图中NAMES一致)冒号后面的别名为容器内部识别名称,别名要与主程序配置文件一致json
4,验证安全
登陆到容器网络
docker exec -it node /bin/sh
执行 env 查看环境变量(或者使用: docker exec 16087e0f620a env),包含db相关配置参数
执行 ping db 能够ping通
使用了link机制后,能够经过指定的名字来和目标容器通讯,这实际上是经过给/etc/hosts
中加入名称和IP的解析关系来实现的,下面是名为web的容器中的/etc/hosts
信息.
二,使用network互联
1,查看docker网络说明:
docker network ls
Docker内置这三个网络,运行容器时,你能够使用该--network标志来指定容器应链接到哪些网络。
1.1 Host:host至关于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址
1.2 Container:在理解了host模式后,这个模式也就好理解了。这个模式指定新建立的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新建立的容器不会建立本身的网卡,配置本身的IP,而是和一个指定的容器共享IP、端口范围等。一样,两个容器除了网络方面,其余的如文件系统、进程列表等仍是隔离的。两个容器的进程能够经过lo网卡设备通讯。
1.3 None:该模式将容器放置在它本身的网络栈中,可是并不进行任何配置。在容器并不须要网络(例如只须要写磁盘卷的批处理任务)使用该模式关闭了容器的网络功能。
1.4 Bridge:至关于Vmware中的Nat模式,容器使用独立network Namespace,并链接到docker0虚拟网卡(默认模式)。经过docker0网桥以及Iptables nat表配置与宿主机通讯;bridge模式是Docker默认的网络设置,此模式会为每个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器链接到一个虚拟网桥上,除非你使用该docker run --network=<NETWORK>选项指定,不然Docker守护程序默认将容器链接到此网络。
2,查看容器网络配置
docker inspect 容器id
查看networks段配置
查看brigdge 网络配置
docker network inspect bridge
结果以下:
3,建立网络
docker network create --driver bridge new_net_1
--driver为网络类型,后面“new_net_1”为网络名称,默认为bridge能够不指定--driver bridge
经过network inspect再次查看网络
经过 inspect 查看,分配了一个新的ip段
4,启动服务加入网络
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e PGDATA=/data/ -e POSTGRES_USER=admin -e POSTGRES_DB=my_db --network new_net_1 postgres
使用inspect 查看网络设置
docker inspect ba5e1d752bc9
5,启动另外一个程序服务加入网络另外一个网络
docker run -d -t --name web -p 8081:8081 ejiyuan/demo-docker
由于不在一个网段,没法访问,经过docker logs xxxx 输出日志发现
6,修改配置文件链接字符串jdbc:postgresql://db:5432/my_db使用 --link链接
修改启动参数
docker run -d -t --name web --link gracious_mcnulty:db -p 8081:8081 ejiyuan/demo-docker
服务没法启动,错误以下:
Error response from daemon: Cannot link to /gracious_mcnulty, as it does not belong to the default network.
7,修改启动参数加入同一个网络
docker run -d -t --name web --net new_net_1 -p 8081:8081 ejiyuan/demo-docker
使用inspect查看网络设置
验证能够正常访问的
三,总结
四,参考资料