成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Docker Compose:鏈接外部容器的幾種方式

云計算
容器之間的鏈接是一種很常見的操作:它提供了訪問其中的某個容器的網絡服務而不需要將所需的端口暴露給Docker Host主機的功能。Docker Compose中對該特性的支持同樣是很方便的。然而,如果需要鏈接的容器沒有定義在同一個 docker-compose.yml 中的時候,這個時候就稍微麻煩復雜了點。

[[197068]]

在Docker中,容器之間的鏈接是一種很常見的操作:它提供了訪問其中的某個容器的網絡服務而不需要將所需的端口暴露給Docker Host主機的功能。Docker Compose中對該特性的支持同樣是很方便的。然而,如果需要鏈接的容器沒有定義在同一個 docker-compose.yml 中的時候,這個時候就稍微麻煩復雜了點。

在不使用Docker Compose的時候,將兩個容器鏈接起來使用 —link 參數,相對來說比較簡單,以 nginx 鏡像為例子:

  1. docker run --rm --name test1 -d nginx  #開啟一個實例test1 
  2. docker run --rm --name test2 --link test1 -d nginx #開啟一個實例test2并與test1建立鏈接 

這樣, test2 與 test1 便建立了鏈接,就可以在 test2 中使用訪問 test1 中的服務了。

如果使用Docker Compose,那么這個事情就更簡單了,還是以上面的 nginx 鏡像為例子,編輯 docker-compose.yml 文件為:

  1. version: "3" 
  2. services: 
  3.  test2: 
  4.  image: nginx 
  5.  depends_on: 
  6.  - test1 
  7.  links: 
  8.  - test1 
  9.  test1: 
  10.  image: nginx 

最終效果與使用普通的Docker命令 docker run xxxx 建立的鏈接并無區別。這只是一種最為理想的情況。

  1. 如果容器沒有定義在同一個 docker-compose.yml 文件中,應該如何鏈接它們呢?
  2. 又如果定義在 docker-compose.yml 文件中的容器需要與 docker run xxx 啟動的容器鏈接,需要如何處理?

針對這兩種典型的情況,下面給出我個人測試可行的辦法:

  1. 方式一:讓需要鏈接的容器同屬一個外部網絡

我們還是使用nginx鏡像來模擬這樣的一個情景:假設我們需要將兩個使用Docker Compose管理的nignx容器( test1 和 test2 )鏈接起來,使得 test2 能夠訪問 test1 中提供的服務,這里我們以能ping通為準。

首先,我們定義容器 test1 的 docker-compose.yml 文件內容為:

  1. version: "3" 
  2. services: 
  3.  test2: 
  4.  image: nginx 
  5.  container_name: test1 
  6.  networks: 
  7.  - default 
  8.  - app_net 
  9. networks: 
  10.  app_net: 
  11.  external: true 

容器 test2 內容與 test1 基本一樣,只是多了一個 external_links ,需要特別說明的是: 最近發布的Docker版本已經不需要使用external_links來鏈接容器,容器的DNS服務可以正確的作出判斷 ,因此如果你你需要兼容較老版本的Docker的話,那么容器 test2 的 docker-compose.yml文件內容為:

  1. version: "3" 
  2. services: 
  3.  test2: 
  4.  image: nginx 
  5.  networks: 
  6.  - default 
  7.  - app_net 
  8.  external_links: 
  9.  - test1 
  10.  container_name: test2 
  11. networks: 
  12.  app_net: 
  13.  external: true 

否則的話, test2 的 docker-compose.yml 和 test1 的定義完全一致,不需要額外多指定一個 external_links 。相關的問題請參見stackoverflow上的相關問題: docker-compose + external container

正如你看到的那樣,這里兩個容器的定義里都使用了同一個外部網絡 app_net ,因此,我們需要在啟動這兩個容器之前通過以下命令再創建外部網絡:

  1. docker network create app_net 

之后,通過 docker-compose up -d 命令啟動這兩個容器,然后執行 docker exec -it test2 ping test1 ,你將會看到如下的輸出:

  1. docker exec -it test2 ping test1 
  2. PING test1 (172.18.0.2): 56 data bytes 
  3. 64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.091 ms 
  4. 64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.146 ms 
  5. 64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.150 ms 
  6. 64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.145 ms 
  7. 64 bytes from 172.18.0.2: icmp_seq=4 ttl=64 time=0.126 ms 
  8. 64 bytes from 172.18.0.2: icmp_seq=5 ttl=64 time=0.147 ms 

證明這兩個容器是成功鏈接了,反過來在 test1 中ping test2 也是能夠正常ping通的。

如果我們通過 docker run --rm --name test3 -d nginx 這種方式來先啟動了一個容器( test3 )并且沒有指定它所屬的外部網絡,而需要將其與 test1 或者 test2 鏈接的話,這個時候手動鏈接外部網絡即可:

  1. docker network connect app_net test3 

這樣,三個容器都可以相互訪問了。

方式二:更改需要鏈接的容器的網絡模式

通過更改你想要相互鏈接的容器的網絡模式為 bridge ,并指定需要鏈接的外部容器( external_links )即可。與同屬外部網絡的容器可以相互訪問的鏈接方式一不同,這種方式的訪問是單向的。

還是以nginx容器鏡像為例子,如果容器實例 nginx1 需要訪問容器實例 nginx2 ,那么 nginx2 的 doker-compose.yml 定義為:

  1. version: "3" 
  2. services: 
  3.  nginx2: 
  4.  image: nginx 
  5.  container_name: nginx2 
  6.  network_mode: bridge 

與其對應的, nginx1 的 docker-compose.yml 定義為:

  1. version: "3" 
  2. services: 
  3.  nginx1: 
  4.  image: nginx 
  5.  external_links: 
  6.  - nginx2 
  7.  container_name: nginx1 
  8.  network_mode: bridge 

需要特別說明的是,這里的 external_links 是不能省略的,而且 nginx1 的啟動必須要在 nginx2 之后,否則可能會報找不到容器 nginx2 的錯誤。

接著我們使用ping來測試下連通性:

  1. $ docker exec -it nginx1 ping nginx2  # nginx1 to nginx2 
  2. PING nginx2 (172.17.0.4): 56 data bytes 
  3. 64 bytes from 172.17.0.4: icmp_seq=0 ttl=64 time=0.141 ms 
  4. 64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.139 ms 
  5. 64 bytes from 172.17.0.4: icmp_seq=2 ttl=64 time=0.145 ms 
  6.  
  7. $ docker exec -it nginx2 ping nginx1 #nginx2 to nginx1 
  8. ping: unknown host 

以上也能充分證明這種方式是屬于單向聯通的。

在實際應用中根據自己的需要靈活的選擇這兩種鏈接方式,如果想偷懶的話,大可選擇第二種。不過我更推薦***種,不難看出無論是聯通性還是靈活性,較為更改網絡模式的第二種都更為友好。

責任編輯:武曉燕 來源: 推酷
相關推薦

2023-11-02 08:45:07

2022-06-24 10:11:15

DockerLinux

2019-05-14 14:27:36

KubernetesDocker存儲

2024-09-06 12:28:48

2021-05-07 16:19:36

異步編程Java線程

2018-07-30 09:00:19

容器Docker鏡像

2010-09-25 14:48:55

SQL連接

2021-01-19 11:56:19

Python開發語言

2011-06-13 17:29:16

外鏈

2018-07-11 15:32:57

KubernetesDNS方式

2015-12-30 09:58:49

Docker Comp容器

2018-09-17 08:31:08

容器Docker雪球

2017-07-04 16:23:10

容器ocker技術

2011-06-13 17:36:43

外鏈

2023-09-07 13:21:00

Linux軟件

2023-02-08 08:43:55

前端繼承原型

2021-06-16 07:02:22

Python方式郵件

2021-10-07 20:36:45

Redis集群場景

2010-11-24 09:56:20

mysql拷貝表

2021-08-02 11:13:28

人工智能機器學習技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: eeuss国产一区二区三区四区 | 午夜精品 | 国产视频一区二区 | 四虎影院免费在线播放 | 成年免费视频 | 中文字幕一区二区三区四区五区 | 日韩在线看片 | 先锋av资源网 | 欧美日韩成人影院 | 网站黄色av | 精品人伦一区二区三区蜜桃网站 | 亚洲 欧美 综合 | 亚洲一区二区三区免费在线 | 日韩高清电影 | 国产不卡在线观看 | 一级做a爰片性色毛片视频停止 | 国产91中文 | 91福利电影在线观看 | 伊人网影院 | 国产精品久久久久久久久久免费 | 久久精品综合网 | 日韩高清黄色 | 国产一区二区三区高清 | 不卡一区二区三区四区 | 91在线精品秘密一区二区 | 久久精品中文 | 亚洲一区二区三区在线视频 | 国产成人综合网 | 午夜网址 | 欧美一级片黄色 | 日日爱夜夜操 | 亚洲综合精品 | 91视频电影| 99精品视频免费观看 | 欧美男人天堂 | 久久久www成人免费无遮挡大片 | 国产精品69毛片高清亚洲 | 夜夜骑首页 | 日韩伦理电影免费在线观看 | 神马福利| 成人一区二区视频 |