docker容器互访三种方式

摘要:
我们都知道,码头集装箱彼此隔离,无法相互访问。但如果有一些依赖服务,我们该怎么办。方法1:在安装Docker进行虚拟IP访问时,Docker默认会创建一个内部桥接网络Docker0。创建的每个容器都将分配一个虚拟网卡,容器可以根据IP地址相互访问。方法2:link在运行容器时,添加参数link以运行第一个容器dockerrun-it-namecentos-1docker。io/centos:最新运行第二个容器[root@CentOS~]#dockerrun it--namecentos-2--linkcentos-1:centos-1docker。Io/centos:latest--link:参数中的第一个centos-1是容器名称,第二个centos-2是定义的容器别名。为了便于使用,通用别名默认为容器名称。

我们都知道docker容器之间是互相隔离的,不能互相访问,但如果有些依赖关系的服务要怎么办呢。下面介绍三种方法解决容器互访问题。

方式一、虚拟ip访问

 安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间可以根据ip互相访问。

复制代码
[root@33fcf82ab4dd /]# [root@CentOS ~]# ifconfig
......
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:35ff:feac:66d8  prefixlen 64  scopeid 0x20<link>
        ether 02:42:35:ac:66:d8  txqueuelen 0  (Ethernet)
        RX packets 4018  bytes 266467 (260.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4226  bytes 33935667 (32.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
......
复制代码

 运行一个centos镜像, 查看ip地址得到:172.17.0.7

复制代码
[root@CentOS ~]# docker run -it --name centos-1 docker.io/centos:latest
[root@6d214ff8d70a /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.7  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe11:7  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:11:00:07  txqueuelen 0  (Ethernet)
        RX packets 16  bytes 1296 (1.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 648 (648.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
复制代码

以同样的命令再起一个容器,查看ip地址得到:172.17.0.8

复制代码
[root@CentOS ~]# docker run -it --name centos-2 docker.io/centos:latest
[root@33fcf82ab4dd /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.8  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe11:8  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:11:00:08  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 648 (648.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 648 (648.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
复制代码

容器内部ping测试结果如下:

复制代码
[root@33fcf82ab4dd /]# ping 172.17.0.7
PING 172.17.0.7 (172.17.0.7) 56(84) bytes of data.
64 bytes from 172.17.0.7: icmp_seq=1 ttl=64 time=0.205 ms
64 bytes from 172.17.0.7: icmp_seq=2 ttl=64 time=0.119 ms
64 bytes from 172.17.0.7: icmp_seq=3 ttl=64 time=0.118 ms
64 bytes from 172.17.0.7: icmp_seq=4 ttl=64 time=0.101 ms
复制代码

这种方式必须知道每个容器的ip,在实际使用中并不实用。

方式二、link

运行容器的时候加上参数link

运行第一个容器

docker run -it --name centos-1 docker.io/centos:latest

运行第二个容器

[root@CentOS ~]# docker run -it --name centos-2 --link centos-1:centos-1 docker.io/centos:latest

--link:参数中第一个centos-1是容器名,第二个centos-1是定义的容器别名(使用别名访问容器),为了方便使用,一般别名默认容器名。

测试结果如下:

复制代码
[root@e0841aa13c5b /]# ping centos-1
PING centos-1 (172.17.0.7) 56(84) bytes of data.
64 bytes from centos-1 (172.17.0.7): icmp_seq=1 ttl=64 time=0.210 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=2 ttl=64 time=0.116 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=3 ttl=64 time=0.112 ms
64 bytes from centos-1 (172.17.0.7): icmp_seq=4 ttl=64 time=0.114 ms
复制代码

 此方法对容器创建的顺序有要求,如果集群内部多个容器要互访,使用就不太方便。

方式三、创建bridge网络

1.安装好docker后,运行如下命令创建bridge网络:docker network create testnet

查询到新创建的bridge testnet。

docker容器互访三种方式第11张

2.运行容器连接到testnet网络。

使用方法:docker run -it --name <容器名> ---network <bridge> --network-alias <网络别名> <镜像名>

[root@CentOS ~]# docker run -it --name centos-1 --network testnet --network-alias centos-1 docker.io/centos:latest
[root@CentOS ~]# docker run -it --name centos-2 --network testnet --network-alias centos-2 docker.io/centos:latest

3.从一个容器ping另外一个容器,测试结果如下:

复制代码
[root@fafe2622f2af /]# ping centos-1
PING centos-1 (172.20.0.2) 56(84) bytes of data.
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=1 ttl=64 time=0.158 ms
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=2 ttl=64 time=0.108 ms
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=3 ttl=64 time=0.112 ms
64 bytes from centos-1.testnet (172.20.0.2): icmp_seq=4 ttl=64 time=0.113 ms 
复制代码

4.若访问容器中服务,可以使用这用方式访问 <网络别名>:<服务端口号> 

推荐使用这种方法,自定义网络,因为使用的是网络别名,可以不用顾虑ip是否变动,只要连接到docker内部bright网络即可互访。bridge也可以建立多个,隔离在不同的网段。

容器内脚本访问容器内服务

1、以mysql:5.6镜像创建一个mysql容器服务 容器端口3306映射宿主机端口3307

启动后配置阿里云服务器安全组开放映射的端口

docker run -id -p 3307:3306 
--name=my1 
--network testnet 
--network-alias my1 
-v $PWD/conf/myconf.d:/etc/mysql/conf.d 
-v $PWD/logs:/logs 
-v $PWD/data:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=root 
mysql:5.6

2、以centos:7基础镜像创建一个python脚本 查询mysql数据库中的内容

docker run -it 
--name=my2 
--network testnet 
--network-alias my2 
centos:7 
bash

脚本

import pymysql

db = pymysql.connect("120.78.72.136","root","root","docker",port=3307)
cursor = db.cursor()
cursor.execute("SELECT * FROM test")
data = cursor.fetchone()
print (data)
db.close()
# ip为宿主机ip  端口为容器映射到宿主机的端口
2、容器访问容器服务(离线)

s1容器放mysql服务,s2容器放一个python脚本能够查询s1容器内mysql数据库的内容

由上面方法创建bridge网络,s1和s2容器能够后互相ping通

创建s1容器(mysql)

docker run -id -p 3307:3306 
--name=s1 
--network testnet 
--network-alias s1 
-v $PWD/conf/myconf.d:/etc/mysql/conf.d 
-v $PWD/logs:/logs 
-v $PWD/data:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=root 
mysql:5.6

容器端口3306映射宿主机端口3307,对外开放3307端口,若想让外部访问需配置安全组开放3307端口

docker exec -it s1 bash    # 进入容器内
mysql -uroot -proot        # 进入mysql数据库 创建库和表

创建s2容器(python脚本)

容器创建

docker run -it 
--name=my2 
--network testnet 
--network-alias my2 
centos:7 
bash

脚本创建

import pymysql

db = pymysql.connect("s1","root","root","docker",port=3306)
cursor = db.cursor()
cursor.execute("SELECT * FROM test")
data = cursor.fetchone()
print (data)
db.close()

# s1      为网络别名 在我们创建容器时创建
# 3306    容器内的服务端口号

免责声明:文章转载自《docker容器互访三种方式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Tengine环境安装【K8S】基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境(环境搭建篇)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

loki简单安装配置使用

Grafana Loki isa set of components that can be composed into a fully featured logging stack. Unlike other logging systems, Loki is built around the idea of only indexing labels f...

使用Docker 容器配置nexus3.29 私有仓库

在创建 repository之前,还是需要先设定一个指定的文件存储目录,便于统一管理。 默认创建在nexus安装目录下数据目录 选择仓库类型 这里选择proxy类型如图 配置仓库该仓库指定一个唯一的名称、HTTP的端口、允许交互的API等由于访问中央仓库有时候会比较慢,这里我添加一个阿里云的代理仓库,然后优先级放到默认中央库之前, 阿里云的mave...

mysql查看表中列信息

查看所有数据库中所有表的数据库名和表名 SELECT `TABLES`.`TABLE_SCHEMA`, `TABLES`.`TABLE_NAME` FROM `information_schema`.`TABLES` 查看所有数据库中所有基本表的数据库名和表名 SELECT `TABLES`.`TABLE_SCHEMA`, `TAB...

Mysql 的 长连接? 短连接?

什么是短连接? 短连接是指程序和数据库通信时需要建立连接,执行操作后,连接关闭。短连接简单来说就是每一次操作数据库,都要打开和关闭数据库连接,基本步骤是:连接 →数据传输 →关闭连接。 什么是长连接? 长连接是指程序之间的连接在建立之后,就一直打开,被后续程序重用。使用长连接的初衷是减少连接的开销,尽管MySQL的连接比其他数据库要快得多。 以PHP程序为...

centos下面配置key登录

centos下需要配置使用key登录,并且要禁止root登录 下面的操作都是用root来设置的 1.添加新用户 例如用户名leisiyuan useradd leisiyuan 2.设置密码 passwd leisyuan 3.给新用户添加到root权限组 运行visudo命令,找到root ALL=(ALL) ALL,在下面添加一行 ,然后保存即可 le...

彻底解决INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误、安装包与之前设备上的安装包签名不一致

有时候开发的问题:会遇到在公司上班的时候,公司的IDE能跑程序,把程序拷贝回家,再跑一次,就会出现以下错误: INSTALL_FAILED_UPDATE_INCOMPATIBLE 原因:就是你的安装包与之前设备上的安装包签名不一致。百度的时候,有的人说:运行太多次也会出现上述的问题,但我没遇到过。 简单处理: 如果你的程序只是自己跑着玩的,不是很重要的程序...