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;
posted @ 2023-05-17 20:34  秋洛尘  阅读(32)  评论(0)    收藏  举报