12-容器之間link

12-容器之間link

這篇主要講 容器之間如何 link

需要準備的是,創建兩個容器 test1test2 通過 busybox

在之前的課程中已經創建的只需要重新啟動即可。

什么情況下需要link

例如有一個容器是 web 服務器,并且跑在一個docker容器內,這個web程序需要訪問后臺數據庫,一般來說我們會把數據庫也運行在一個docker的容器內,那么此時就需要兩個容器進行 link

訪問數據庫需要知道數據庫的ip地址和端口,那么我們在開發的時候是不能確定數據庫的ip地址的,而且也有可能數據庫地址會發生變化,那么我們將很難修改配置。

查看容器的ip地址命令docker inspect test1

但是我們可以通過一種方式,給容器起一個名字,然后可以通過這個名字就可以代替ip地址訪問數據庫。這時只需要在開發的時候先想好這個數據庫容器的名字即可。

link容器

  1. 刪除 test2 容器

    docker stop test2 && docker rm test2
    

    查看當前容器情況

    docker ps
    
    [vagrant@10 ~]$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    da991beadf34        busybox             "/bin/sh -c 'while t…"   5 hours ago         Up 5 hours                              test1
  2. 重新創建 test2

    通過 link 連接到 test1 容器

    docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600; done"
    
  3. 進入 test2 容器

    docker exec -it test2 /bin/sh
    
  4. 查看ip情況

    / # ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
    27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ffinet 172.17.0.3/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
    

    ping test1 容器的地址

    / # ping 172.17.0.2
    PING 172.17.0.2 (172.17.0.2): 56 data bytes
    64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.225 ms
    64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.156 ms
    

    是可以ping通的,那么我們ping test1 這個名字呢?

    / # ping test1
    PING test1 (172.17.0.2): 56 data bytes
    64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.167 ms
    64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.190 ms
    

    ping 這個 test1 名字也是可以的。這是為什么呢?原因就是--link 參數會增加一個 DNS 記錄。

這樣我們在 test2 中是不需要知道 test1 的具體地址的,我們就可以訪問。但是在test1中去ping test2 名字是不可以的,ip是可以的。說明 --link是具有方向性的。

通過自定義bridge連接容器

  1. 重新創建一個 test2

    docker stop test2 && docker rm test2docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"
    
  2. 查看docker network

    [vagrant@10 ~]$ docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    056d0ece100f        bridge              bridge              local
    a78b081f0bda        host                host                local
    51a236124cac        none                null                local
    

    其實我們在創建容器的時候,默認會去連 bridge,但是我們也可以設定連接 host 或者 none

  3. 手動創建一個bridge

    docker network create -d bridge my-bridge
    

    -d 為選擇驅動driver

    查看創建情況

    [vagrant@10 ~]$ docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    056d0ece100f        bridge              bridge              local
    a78b081f0bda        host                host                local
    283184c10e65        my-bridge           bridge              local
    51a236124cac        none                null                local
    

    通過brctl查看

    [vagrant@10 ~]$ brctl show
    bridge name         bridge id		STP enabled	    interfaces
    br-283184c10e65		8000.02421fd39394	no		
    docker0		        8000.024257ac11fe	no		    veth01f8da0veth06618ed
    

    這里的br-283184c10e65 就是我們剛剛創建的bridge。

  4. 創建 test3 指定連接新的bridge

    docker run -d --name test3 --network my-bridge busybox /bin/sh -c "while true; do sleep 3600; done"
    

    如果不指定則默認連接bridge

    查看容器

    [vagrant@10 ~]$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    cadffadd2dcf        busybox             "/bin/sh -c 'while t…"   28 seconds ago      Up 27 seconds                           test3
    f984609b03ee        busybox             "/bin/sh -c 'while t…"   14 minutes ago      Up 14 minutes                           test2
    da991beadf34        busybox             "/bin/sh -c 'while t…"   5 hours ago         Up 5 hours                              test1
    

    通過brctl查看

    [vagrant@10 ~]$ brctl show
    bridge name         bridge id		STP enabled	    interfaces
    br-283184c10e65		8000.02421fd39394	no	        veth7092b9a	
    docker0		        8000.024257ac11fe	no		    veth01f8da0veth06618ed
    

    從上面可以看到 test3 連接到了 我們自己創建的bridge。

    查看我們創建的 my-bridge 網絡情況。

    $:docker inspect network 283184c10e65
    "Containers": {
    "cadffadd2dcf756d982c219c819b66ba1b6dea9224bbededa9a5069654427bd0": {"Name": "test3","EndpointID": "f0a6e3343b0deeb420d63faf378affbacbec6714b674b1a5fbe472545f1ed674","MacAddress": "02:42:ac:12:00:02","IPv4Address": "172.18.0.2/16","IPv6Address": ""
    }
    

    這里可以看到 test3 確實是連接到了我們自己創建的bridge上。

  5. 更改 test2 連接到 my-bridge

    $: docker network connect my-bridge test2
    "Containers": {
    "cadffadd2dcf756d982c219c819b66ba1b6dea9224bbededa9a5069654427bd0": {"Name": "test3","EndpointID": "f0a6e3343b0deeb420d63faf378affbacbec6714b674b1a5fbe472545f1ed674","MacAddress": "02:42:ac:12:00:02","IPv4Address": "172.18.0.2/16","IPv6Address": ""
    },
    "f984609b03ee96dc20a90053699cc46cc41969c20d07625826100535b4369a57": {"Name": "test2","EndpointID": "0bf52944835e82a689f863764ac8b4309ff157d566857913fca4da76278aa9d8","MacAddress": "02:42:ac:12:00:03","IPv4Address": "172.18.0.3/16","IPv6Address": ""
    }
    

    可以看到 test2 已經連接到了 my-bridge上。也可以通過brctl查看

    [vagrant@10 ~]$ brctl show
    bridge name	        bridge id		STP enabled	interfaces
    br-283184c10e65		8000.02421fd39394	no		veth7092b9avethd05370d
    docker0		8000.024257ac11fe	no		        veth01f8da0veth06618ed
    

    再查看默認的bridge

    $: docker network inspect bridge
    "Containers": {
    "da991beadf34ef53be9cf3de8f0c5ba1599b76f4433f6627f96c46c09751ecf5": {"Name": "test1","EndpointID": "4764dcc3a29b9ee7efb6ea5dc5c905840362c8ddc0d944356a4c0e7b07a99d98","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": ""
    },
    "f984609b03ee96dc20a90053699cc46cc41969c20d07625826100535b4369a57": {"Name": "test2","EndpointID": "024a2dfeb6b74aac46c3d61a6b2d834fa20c63f47e3a0f0db5aaad78c84442af","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","IPv6Address": ""
    }
    

    那么 test2 既連接到 bridge 也連接到了我們創建的my-bridge上。

  6. 測試連通情況

    進入 test3

    docker exec -it test3 /bin/sh
    

    查看ip

    / # ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
    32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ffinet 172.18.0.2/16 brd 172.18.255.255 scope global eth0valid_lft forever preferred_lft forever
    

    剛剛查看 test2my-bridge 上的ip地址為 172.18.0.3,那我們ping測試

    / # ping 172.18.0.3
    PING 172.18.0.3 (172.18.0.3): 56 data bytes
    64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.171 ms
    64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.179 ms
    

    是可以ping通的。現在我們去ping test2 這個名字。

    / # ping test2
    PING test2 (172.18.0.3): 56 data bytes
    64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.151 ms
    64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.178 ms
    

    是可以ping通的。這是為什么呢?我們并沒有設定link參數,這是因為 test2test3 都連接到了我們創建的 my-bridge 上。到這里也許會有疑問,之前 test1test2 也是連接到同一個bridge上的,不加link參數為什么就不能ping通呢?這是因為在創建自定義my-bridge的時候是和默認bridge不一樣的,如果兩個容器都連接到了自定義的 bridge 上,那么這兩個容器默認是項目link的。

    這時可以測試一下在 test2 中是否可以 ping 通 test3,答案是可以的。

    [vagrant@10 ~]$ docker exec -it test2 /bin/sh
    / # ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
    29: eth0@if30: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ffinet 172.17.0.3/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
    34: eth1@if35: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ffinet 172.18.0.3/16 brd 172.18.255.255 scope global eth1valid_lft forever preferred_lft forever
    

    我們可以看到這里有兩個ip地址,一個是 172.17.0.3,另一個是 172.18.0.3,這是因為 test2 連接到了兩個bridge上,從而分配了兩個ip地址。

    測測ping test3

    / # ping test3
    PING test3 (172.18.0.2): 56 data bytes
    64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.248 ms
    64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.173 ms
    

    結果是連通的。那么ping test1 呢,其實很明顯,是不通的。

    / # ping test1
    ping: bad address 'test1'
    

    那么如果我們把 test1 也連接到自定義的my-bridge上,也是可以ping通的,那我們實驗一下。

    test1 連接到 my-bridge 上。

    [vagrant@10 ~]$ docker network connect my-bridge test1
    

    進入 test2 并 ping test1

    [vagrant@10 ~]$ docker exec -it test2 /bin/sh
    / # ping test1
    PING test1 (172.18.0.4): 56 data bytes
    64 bytes from 172.18.0.4: seq=0 ttl=64 time=0.217 ms
    

其實一般來說,在實際項目中很少使用 --link參數,而是使用 創建自定義bridge的方式進行連接。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536034.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536034.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

13-容器的端口映射

13-容器的端口映射 部署一個簡單web nginx容器 docker run -d --name web nginxnginx 默認的端口是 80 端口&#xff0c;此時我們是沒有辦法訪問的。 好的&#xff0c;通過前面的學習我們已經知道&#xff0c;這個 web 容器四連接到 bridge 網橋上的&#xff0c;那我們查看一…

14-容器網絡之host和none

14-容器網絡之host和none 在之前的小節&#xff0c;我們有看到過 host 和 none。 通過 docker network ls 查看。 none 網絡 刪除 test1 容器 docker stop test1 && docker rm test1創建 test1 容器并連接到none網絡 docker run -d --name test1 --network none busy…

15-多容器復雜應用的部署

15-多容器復雜應用的部署 此節主要是通過部署一個復雜的應用場景&#xff0c;進而練習容器的網絡相關知識。 創建一個flask-web應用 創建一個 flask-web 文件夾 mkdir flask-web在此文件夾內創建 app.py 文件 cd flask-web touch app.py編寫一個簡單的 web 程序 import os im…

16-多機器通信

16-多機器通信 回顧上節課的思考題。 flask-redis 想訪問 redis&#xff0c;該如何通信&#xff1f; 創建另外一臺linux虛擬機 直接拷貝Vagrantfile文件創建一個 centos 虛擬機 我們創建一個centos7-2文件夾&#xff0c;然后創建虛擬機 vagrant up創建的過程中提示選擇網絡接…

17-Docker的數據持久化介紹

17-Docker的數據持久化介紹 回顧容器與鏡像 容器是在鏡像之上創建的一層運行時層&#xff0c;這一層是可以讀寫的&#xff0c;我們能夠在容器內添加數據&#xff0c;讀取數據。 也就是說我們在創建容器的時候&#xff0c;我們能夠在容器內創建文件&#xff0c;安裝軟件等等&a…

18-數據持久化-Data Volume

18-數據持久化-Data Volume Data Volume 使用場景。一般來講有些容器自己會產生一些數據&#xff0c;我們不想數據隨著容器的銷毀而銷毀&#xff0c;我們想保存數據&#xff0c;正常一般用在數據庫&#xff0c;比如我們想保存數據庫中的數據&#xff0c;這個時候我們就會使用 …

19-數據持久化-Bind Mounting

19-數據持久化-Bind Mounting Bind Mounting 與 Data Volume區別 Data Volume 需要在 Dockerfile 內聲明需要創建的 volume 目錄。 Bind Mounting 則不需要在 Dockerfile 聲明 volume&#xff0c;只需要在創建容器的時候&#xff0c;也就是 run 的時候聲明即可。 如: dock…

go自定義包教程

go自定義包教程 而是環境為 go version go1.11 linux/amd64linux mint 19 創建一個自定義的包 切換到src目錄下&#xff0c;創建demo目錄 cd src mkdir demo再創建smap 文件夾 cd demo mkdir smap創建包文件 cd smap touch map.gomap.go文件內容 package smapimport "…

在Linux中對硬盤進行分區、格式化和掛載

在Linux中對硬盤進行分區、格式化和掛載 我最近有一個全新的4-TB硬盤加入我的電腦。所以我需要在Linux中安裝它。為此&#xff0c;我需要執行以下操作&#xff1a; 分區格式化掛載檢查是否已安裝硬盤驅動器 分區 首先&#xff0c;在通過SATA和電源線將硬盤連接到計算機后&am…

Angular gitlab持續集成之runner配置

gitlab持續集成 安裝Runner 正常安裝 sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64sudo chmod x /usr/local/bin/gitlab-runner sudo useradd --comment GitLab Runner --creat…

javascript編譯壓縮

javascript編譯 js是JavaScript 源碼文件&#xff0c; .min.js是壓縮版的js文件。 .min.js文件經過壓縮&#xff0c;相對編譯前的js文件體積較小&#xff0c;傳輸效率快。經過編碼將變量和函數原命名改為毫無意義的命名&#xff0c;以防止他人窺視和竊取 js 源代碼 在線版 g…

vscode設置中文

vscode設置中文 當我們安裝完成vscode后&#xff0c;會發現它是中文的&#xff0c;因為默認情況下&#xff0c;vscode使用的語言為英文(us)。 那很多同學是不喜歡英文的&#xff0c;不是看不懂&#xff0c;而是不方便哈。 修改語言配置文件 使用快捷鍵組合【CtrlShiftp】 在…

linux下編譯boost

linux下編譯boost 下載boot庫 官方下載地址 下載完成會解壓。 編譯 1.進入解壓后的文件夾內 cd boost_1_69_0 執行下面的語句 ./bootstrap.sh --with-librariesall --with-toolsetgcc–with-libraries 指定編譯哪些boost庫&#xff0c;all的話就是全部編譯&#xff0c;只想…

C++通過原子變量代替互斥量

C通過原子變量代替互斥量 廢話不多說&#xff0c;直接上代碼。 實現類似lock_guard功能 #include <atomic> #include <thread>class ClockGuard { public:ClockGuard(std::atomic_flag & atomic):m_lockedFlag(atomic){lock();}~ClockGuard(){unlock();}voi…

conky安裝配置

conky安裝配置 安裝conky sudo apt-get install conky-all修改配置 在主目錄下創建’.conkyrc’ 文件內容&#xff1a; # set to yes if you want Conky to be forked in the background background no cpu_avg_samples 2 net_avg_samples 2 out_to_console no # X font w…

Windows子系統安裝圖形界面

Windows子系統安裝圖形界面 有很多同學需要使用 linux 系統,但是又不想真正安裝一個 linux 系統。于是微軟大哥就把 ubuntu 系統集成到 windows 內了&#xff0c;你說 微軟 屌不屌&#xff1f; 言歸正傳。 安裝Xlaunch 因為這個是最靠譜的圖形化界面了&#xff0c;所以不解…

C++ 判斷類是否有某變量

C 判斷類是否有某變量 話不多說上代碼。 #define HAS_MEMBER(member)\template<typename T, typename... Args>struct has_member_##member\ {\private:\template<typename U> static auto Check(int) -> decltype(std::declval<U>().member(std::declv…

C++將地址轉換為字符串

C將地址轉換為字符串 有時候在做程序設計的時候&#xff0c;有可能需要做一個類似messageBus的功能&#xff0c;并且需要一個key保證唯一&#xff0c;那么如何實現這個key的唯一呢&#xff1f;大致兩種思路: 使用函數簽名&#xff0c;因為messagebus綁定的是一個函數&#xf…

Angular 8之升級和新功能摘要

Angular 8之升級和新功能摘要 Angular 8已經到來,并帶來了大量的工作流程和性能改進。就像我們之前發布的幾個版本一樣,讓我們回顧一下Angular 8的新功能,以及如何將Angular 7應用程序升級到Angular 8。 Angular 8中明顯的新功能數量有限,但確實還有一些好東西: Differen…

Linux下查看顯卡PCIE速率x16x8x4及設定

Linux下查看顯卡PCIE速率x16x8x4 由于linux軟件并不是很齊全所以查看顯卡占用PCIE的帶寬并不直觀&#xff0c;所以本文介紹如何查看。 Windows下使用GPU-Z即可查看 Linux 確定當前顯卡型號 lspci | grep NVIDIA返回 02:00.0 3D controller: NVIDIA Corporation GM107M [GeFor…