Docker网络
docker网络
一、docker网络
1.1 原理
Docker本身的技术依赖于Linux内核虚拟化技术的发展。所以Docker对Linux内核的特性有很强的依赖。
Docker使用到的与Linux网络有关的技术分别有:网络名称空间、Veth、Iptables、网桥、路由。
为了支持网络协议栈的多个实例,Linux在网络协议栈中引入了网络名称空间(NetworkNamespace),这些独立的协议栈被隔离到不同的命名空间中。处于不同的命名空间的网络协议栈是完全隔离的,彼此之间无法进行网络通信,就好像两个“平行宇宙”。通过这种对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境,为了将这些不同的命名空间连接起来就引入了Veth设备对。
1.2 为何要用Veth设备对
引入veth设备对就是为了让两个不同的网络名称空间连接起来,因为是连接两个命名空间,所有veth都是成对出现
1.3 veth设备对原理
创建veth设备对,我们将其中一端称为另一端的peer。在Veth设备的一端发送数据时,它会将数据直接发送到另一端,并触发另一端的接收操作。
二、docker网络模式
docker分为四种模式:host模式、containe模式、none模式、bridge模式
2.1 host模式
格式:
docker run -d -it --network=host [镜像名称|ID]
特点:
host模式是容器与宿主主机共享网络名称空间,容器使用的是宿主主机端口与网卡
2.2 conataine模式
格式:
docker run -d --network='container:[容器名称|ID]' [镜像名称|ID]
特点:
conataine模式是容器与容器之间共享网络名称空间,网卡IP完全一致。
# 注:容器之间端口不能冲突
2.3 none模式
格式:
docker run -it --network=none [镜像名称|ID]
特点:
none模式只为容器提供一个回环网络,这种模式非常安全,因为外界无法访问
2.4 bridge模式
# bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式
原理:
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡vethpair设备,Docker将vethpair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctlshow命令查看 # 相当于交换机
三、网桥相关命令
3.1 创建网桥
格式:
docker network create [网桥名称]
# 默认自带三个网桥
3.2 查看网桥列表
格式:
docker network ls
案列:
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
259c496916d9 bridge bridge local
484a3424cd09 gjl bridge local
6fb9a81048a8 host host local
dbeaadc8064d none null local
3.3 查看网桥详细信息
格式:
docker network inspect [网桥名称]
案列:
[root@docker ~]# docker network inspect gjl
[
{
"Name": "gjl",
"Id": "484a3424cd09e3a47bf56a6ca953e363b5a3c655badb1aa778f0d45c7e0516ee",
"Created": "2021-07-28T16:42:33.0424966+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
3.4 连接一个网桥
格式:
docker network connect [网桥名称] [容器名称|ID]
案列:
[root@docker ~]# docker network connect gjl nginx
3.5 断开网桥连接
格式:
docker network disconnect [网桥名称] [容器名称|ID]
案列:
[root@docker ~]# docker network disconnect gjl nginx
3.6 清理没有被使用的网桥
格式:
docker network prune
案列:
[root@docker ~]# docker network prune
3.7 总结(知识点)
# 使用同一个网桥的所有容器网络彼此独立
# 容器之间访问可以通过ID访问,不能够通过名称访问,可以通过--name将容器名称加入docker的DNS解析
四、搭建wordpress
# 创建网桥
[root@docker ~]# docker network create gjl
# 创建映射文件
[root@docker ~]# mkdir /mnt/html
# 下载并解压wordpress安装包
[root@docker html]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@docker html]# tar -xf latest-zh_CN.tar.gz
[root@docker html]# chmod -R 777 wp-content
# 启动MySQL容器并连接网桥
[root@docker ~]# docker run -d -e MYSQL_ROOT_PASSWORD='123' --name=mysql --network gjl mysql:5.6
# 启动PHP容器映射目录并连接网桥
[root@docker ~]# docker run -d --name php -v /mnt/html/:/usr/share/nginx/html --network gjl 796494687971
# 启动nginx容器映射目录并连接网桥
[root@docker ~]# docker run -d --name nginx -v /mnt/html/:/usr/share/nginx/html --network gjl -p 80:80 nginx
# 修改配置文件(也可以映射)
1.修改nginx.conf
[root@docker ~]# docker cp nginx:/etc/nginx/nginx.conf .
# 注:只需要修改用户为www
[root@docker ~]# docker cp nginx.conf nginx:/etc/nginx/nginx.conf
2.修改default.conf
[root@docker ~]# docker cp nginx:/etc/nginx/conf.d/default.conf .
[root@docker ~]# cat default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
root /usr/share/nginx/html;
location / {
index index.php index.html index.htm;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@docker ~]# docker cp default.conf nginx:/etc/nginx/conf.d/default.conf
# 进入nginx容器创建用户并重启
[root@docker ~]# docker exec -it nginx bash
root@63d9ec17bfd5:/# useradd www
root@63d9ec17bfd5:/# nginx -s reload
2021/07/27 12:08:20 [notice] 63#63: signal process started
# 进入MySQL容器创建数据库
[root@docker ~]# docker exec -it mysql bash
root@9ea0a76ed913:/# mysql -uroot -p'123'
mysql> create database wordpress;

浙公网安备 33010602011771号