技术交流QQ群:①185473046   ②190706903   ③203744115   网站地图
登录

下次自动登录
现在的位置: 首页Docker>正文
使用docker network进行Docker容器之间通信
2021年10月18日 Docker 暂无评论 ⁄ 被围观 537次+

本教程中用到的配置文件请参考下面的连接

Linux下使用Docker容器部署Web应用

https://www.osyunwei.com/archives/11855.html

一、基础概念

1、默认状态下,创建好的容器之间通过容器内部的虚拟ip是能够相互ping通和访问的

2、因为容器有可能在停止、重启等操作后容器内部ip地址发生变化,从而导致连接失败

3、一般不使用容器的虚拟ip来进行通信,而是使用容器的名称(docker run --name)来相互通信

4、Docker容器使用[容器的名称]进行相互通信有两种方式:Link 单向访问和 Bridge 网桥双向访问

5、使用Link 单向访问,需要在创建容器的时候指定容器a和哪个容器进行link连接。

例如:docker run -d --name a --link b #容器b必须要存在

这个时候进入到容器a,ping容器b的名称,可以ping通,

但是,--link实现的是容器间的单向通信,我们进入到容器b,ping容器a的名称,则是ping不通的。

6、--link使用的是容器内的/etc/hosts解析名称的,可能因为容器的启动停止等操作损坏/etc/hosts,从而导致连接失败。

7、使用link强制了容器之间的依赖关系,集群环境下不易扩展。

8、Docker官方已经不建议使用link,而强烈推荐使用docker network

9、docker network ls #查看docker默认的三种网络模式bridge、host、null

10、我们一般使用Bridge网桥模式创建docker network

11、

#参数-d bridge my-bridge创建一个名称为my_bridge的网桥

docker network create -d bridge my-bridge

#查看网桥

docker network ls

#把容器加入网桥(容器与网桥绑定)

docker network connect my-bridge mysqlv8.0.26

docker network connect my-bridge php-fpm8.0.11

docker network connect my-bridge nginx1.20.1

#分别进入上面三个容器,现在已经均能相互ping通访问了

#每创建一个网桥就会在宿主机上安装一个虚拟网卡,虚拟网卡承担网关的作用,由虚拟网卡构成的网关形成了内部的一个网络环境,只要有容器绑定到这个网桥(虚拟网卡)上,都能相互通信

#虚拟网卡的IP地址也是虚拟的,如果要和外部通信的话,必须要和宿主机的物理网卡进行地址转换

#容器内部发送的数据包都会经过虚拟网卡做地址转换,将其转成物理网卡的数据包向外网进行通信

#从外网回来的数据先进入物理网卡,之后再通过地址转换进入到虚拟网卡,再由虚拟网卡进行数据的分发

#Docker安装时会创建一个名为docker0的虚拟网桥,默认情况下新建的容器都会自动连接到这个虚拟网桥提供的网络,bridge网络用于同一主机上的docker容器相互通信,连接到同一个网桥docker0的docker容器可以相互通信。

#bridge对宿主机相当于一个单独的网卡设备。对于运行在宿主机上的每个容器来说相当于一个交换机,所有容器的虚拟网线的一端都连接到docker0上。

#容器通过本地主机进行上网,容器会创建名为veth的虚拟网卡,网卡一端连接到docker0网桥,另一端连接容器,容器就可以通过网桥分配的ip地址进行上网。

#我们可以使用默认的bridge网络,docker官方建议使用自定义bridge网络

创建一个自定义网络, 可以指定子网、IP地址范围、网关等网络配置

docker network create --driver bridge --subnet 172.31.0.0/16 --gateway 172.31.0.1 mycust-bridge

#查看docker网络

docker network ls

brctl show

ifconfig

docker network inspect mycust-bridge

#创建容器myclass,连接到自定义网络mycust-bridge

docker run --name myclass -it --network mycust-bridg nginx:1.20.1

二、下载容器镜像

以下容器镜像是提前制作好并上传到阿里云镜像仓库

docker pull registry.cn-hangzhou.aliyuncs.com/osyunwei/nginx:1.20.1 #nginx容器镜像

docker pull registry.cn-hangzhou.aliyuncs.com/osyunwei/php-fpm:8.0.11 #php-fpm容器镜像

docker pull registry.cn-hangzhou.aliyuncs.com/osyunwei/mysql:v8.0.26 #mysql容器镜像

docker images #查看镜像

#修改镜像标签

docker tag 153f21624ecc nginx:1.20.1

docker tag 597d18ebb61d php-fpm:8.0.11

docker tag b4d1dc08fa3f mysql:v8.0.26

三、创建容器网络

#创建一个自定义网络

docker network create --driver bridge --subnet 172.31.0.0/16 --gateway 172.31.0.1 mycust-bridge

#查看网络信息

docker network inspect mycust-bridge

四、创建数据共享容器

4.1创建共享容器挂载数据,创建一个新的容器但不启动它

mkdir -p /docker/data/webshare

docker create --name webshare -v /docker/data/webshare:/data/web centos:7.9.2009

4.2创建数据容器(一个不运行的容器)

docker run -it --name webshare -v /docker/data/webshare:/data/web centos:7.9.2009

#4.1和4.2两种方式选择一种即可

docker ps -a #查看所有容器

#把容器webshare加入到mycust-bridge网络中

docker network connect mycust-bridge webshare

#共享容器的目的是定义好挂载点,然后其他容器通过 --volumes-from 共享容器名来实现和共享容器同样的挂载目录。

#如果有多个容器,而且挂载目录有变化时,不用每个容器都去通过-v修改挂载点,只需要修改共享容器的挂载目录即可。

五、创建docker运行容器

5.1创建mysql容器,并把容器加入自定义网络mycust-bridge

docker run -d -p 3306:3306 --name=mysqlv8.0.26 --network mycust-bridge -v/docker/data/mysql/database:/var/lib/mysql -v/docker/data/mysql/etc/mysql/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql:v8.0.26 --character-set-server=utf8 --collation-server=utf8_general_ci

5.2创建php-fpm容器

#把容器加入自定义网络mycust-bridge

#挂载共享容器webshare

docker run -d --name php-fpm8.0.11 --network mycust-bridge --volumes-from webshare -v/docker/data/php/etc:/usr/local/php/etc php-fpm:8.0.11

5.3创建nginx容器

#把容器加入自定义网络mycust-bridge

#挂载共享容器webshare

docker run -d -p 80:80 --name=nginx1.20.1 --network mycust-bridge --volumes-from webshare -v/docker/data/nginx/conf/ssl:/usr/local/nginx/conf/ssl -v/docker/data/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf -v/docker/data/nginx/conf/vhost:/usr/local/nginx/conf/vhost nginx:1.20.1

六、进入mysql容器创建数据库信息

数据库名称:wordpress

数据库用户名:userwordpress

数据库密码:123456

docker ps #查看容器

docker exec -it mysqlv8.0.26 /bin/bash #进入容器

docker inspect 容器id #查看容器ip地址等信息

mysql -uroot -p #输入root密码

Create DATABASE IF NOT EXISTS `wordpress` default charset utf8 COLLATE utf8_general_ci; #创建数据库

CREATE USER 'userwordpress'@'%' IDENTIFIED BY '123456'; #创建用户

grant all privileges on `wordpress`.* to 'userwordpress'@'%'; #授权用户userwordpress对数据库wordpress具有全部操作权限

grant SUPER on *.* to 'userwordpress'@'%' ; #授予用户对所有数据库有SUPER权限,否则只能连接无任何操作权限。

七、部署wordpress应用系统

下载wordpress

cd /usr/local/src

wget https://cn.wordpress.org/latest-zh_CN.tar.gz

tar -zxvf latest-zh_CN.tar.gz --strip-components 1 -C /docker/data/webshare #解压到web根目录

chown www.www -R /docker/data/webshare #设置目录权限

cd /docker/data/nginx/conf/vhost

cp vhost.conf wordpress.conf #拷贝虚拟主机配置文件

vi wordpress.conf #编辑

root /data/web/;

fastcgi_pass php-fpm8.0.11:9000; #设置为php-fpm容器名php-fpm8.0.11

server_name www.wordpress-test.com #这里可以设置解析好的域名

:wq! #保存退出

#在本地hosts里面添加域名解析

192.168.21.8 www.wordpress-test.com

#重启启动nginx容器

docker stop nginx1.20.1

docker start nginx1.20.1

打开http://www.wordpress-test.com/

根据页面提示,填写数据库信息,直到安装完成。

扩展阅读:

Docker提供了三种方式将数据从宿主机挂载到容器中

1、volumes:由docker创建和管理,数据会放在/var/lib/docker/volumes/这个目录下,其他的应用不应该访问和修改这个目录的数据,一个volume可以挂载给多个容器使用

2、bind mounts:可以挂载在主机的任何目录存放数据,其他应用也可以随时访问和修改其中的数据,类似软连接

3、tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统(不常用)

上面的文档中挂载共享容器,其本质上还是bind mounts挂载,先在共享容器中进行bind mounts目录映射挂载,其他容器再挂载这个共享容器的挂载点

下面我们使用volumes挂载卷进行容器内部数据挂载

#创建一个数据卷webstie

docker volume create webstie

#查看宿主机数据卷信息

docker volume ls

#删除数据卷

docker volume rm webstie

#查看webstie这个数据卷详细信息

docker volume inspect webstie

[root@master01 ~]# docker volume inspect webstie

[

{

"CreatedAt": "2021-10-19T14:00:50+08:00",

"Driver": "local",

"Labels": {},

"Mountpoint": "/var/lib/docker/volumes/webstie/_data",

"Name": "webstie",

"Options": {},

"Scope": "local"

}

]

#webstie数据卷在宿主机中的实际位置

ls /var/lib/docker/volumes/webstie/_data

#创建容器并挂载数据卷

#挂载的数据圈名称--mount src=webstie

#把容器的/data/web目录挂载到webstie数据卷中,将容器中的数据持久化到宿主机中

#挂载php-fpm容器

docker run -d --name php-fpm8.0.11 --network mycust-bridge --mount src=webstie,dst=/data/web -v/docker/data/php/etc:/usr/local/php/etc php-fpm:8.0.11

#挂载nginx容器

docker run -d -p 80:80 --name=nginx1.20.1 --network mycust-bridge --mount src=webstie,dst=/data/web -v/docker/data/nginx/conf/ssl:/usr/local/nginx/conf/ssl -v/docker/data/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf -v/docker/data/nginx/conf/vhost:/usr/local/nginx/conf/vhost nginx:1.20.1

#清理卷

docker stop nginx1.20.1 #关闭容器

docker rm nginx1.20.1 #删除容器

docker volume rm webstie #删除数据卷

#使用bind mounts的方式挂载数据卷,将宿主机中的数据挂载到容器中

docker run -d -p 80:80 --name=nginx1.20.1 --network mycust-bridge --mount type=bind,src=/docker/data/webshare,dst=/data/web -v/docker/data/nginx/conf/ssl:/usr/local/nginx/conf/ssl -v/docker/data/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf -v/docker/data/nginx/conf/vhost:/usr/local/nginx/conf/vhost nginx:1.20.1

#在nginx和php-fpm两个容器组合的环境下,站点的根目录挂载必须一致。

至此,使用docker network进行Docker容器之间通信教程完成。

     

  系统运维技术交流QQ群:①185473046 系统运维技术交流□Ⅰ ②190706903 系统运维技术交流™Ⅱ ③203744115 系统运维技术交流™Ⅲ

给我留言

您必须 [ 登录 ] 才能发表留言!



Copyright© 2011-2021 系统运维 All rights reserved
版权声明:本站所有文章均为作者原创内容,如需转载,请注明出处及原文链接