在docker中链接两个容器

建立 Sonarqube 的时候,须要额外建立一个数据库容器好比 Postgres,然而官方却没指明如何链接,且通常生产部署的时候直接 build 成了个 image,没有这种奇怪的问题sql

简单粗暴式 IP

最简单的方式,也是最不靠谱的。使用 docker 分配给容器的内部 ip。如何查询?docker

# 1. 查看机器的 hosts 文件
docker exec containerId sh -c "exec cat /etc/hosts"
# 2. 查看容器信息。IPAddress
docker inspect containerId
复制代码

不靠谱的方式在于,docker 给容器分配的内部 ip 是动态的,下一次启动可能就变了,链接到另外一个容器里了。gg数据库

举个栗子:网络

  • 先启动 c1 再启动 c2c2 的 ip 多是 *.*.0.3
  • 先启动 c2 再启动 c1c2 的 ip 多是 *.*.0.2

也就是说,docker 分配的内部 ip 与容器启动顺序有关。万一启动顺序变了,ip 就 ggdom

传统方式 --link

注意:这个可能在将来的版本被移除post

给个官方警告连接,简单来讲应该是经过 link 方式链接的两个 container 会共享环境变量,不一样应用可能会有冲突ui

只能在 docker run 时指定:url

docker run --link postgres
# 设置 alias
docker run --link postgres:db
复制代码

看官方的文档里貌似是说更新 /etc/hosts,例如:spa

172.17.0.5 6e5cdeb2d300
172.17.0.89 postgres 6e5cdeb2d300 db
复制代码

网络方式 network

docker 里的网络分为不少种,默认的是 bridge,用来链接不一样的容器。postgresql

跟着官方教程一步一步走,不要太简单。官方提示生产环境最好本身建立一个 bridge,多是默认的连太多了吧。。。

发现用默认的 network ping ip 能通,容器名不行:

docker attach sonar
# root@6e5cdeb2d300: /
ping -c 2 172.17.0.2 # 能通
ping -c 4 posgres    # 不能解析主机
复制代码

只能自定义个:

docker network create --driver bridge sonar
复制代码

使用超鸡简单:

docker run --network sonar
# 你甚至能在 run 命令以后使用
docker network connect sonar
复制代码

链接的时候,容器名就是 domin。

最后

docker run -e sonar.jdbc.url=jdbc:postgresql://db/sonar
复制代码

开心地连上了!以后启动也方便多了,不用每次 docker logs 查启动不了的缘由。

相关文章
相关标签/搜索