在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 查啓動不了的緣由。

相關文章
相關標籤/搜索