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.mzph.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…