本教程中用到的配置文件请参考下面的连接
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容器之间通信教程完成。