Docker自娱—7.network

docker网络的核心概念就是docker0;docker有4种网络类型,安装时默认会创建其中三种: bridge、 none 、host



 

实践过程

查看linux主机网卡

[root@wg ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

- 网卡类型
| lo       本机回环地址
| ensxx    网卡地址
| docker0  docker网络,相当于路由器

[root@wg ~]# docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
db75e3ed6573   bridge                bridge    local
da929a3925d2   host                  host      local
f1b6f9435c59   none                  null      local

- 使用docker run创建容器时,可以指定容器的网络模式:
| host模式:      --net host 指定
| none模式:      --net none 指定
| bridge模式:    --net bridge 指定,默认设置
| container模式: --net container:name(或者id)

启动容器查容器网卡

[root@wg ~]# docker run -d -P --name tomcat01 tomcat ifconfig
136a45dec626121cb034dc365217d0694f5c3a3ced4a76afc3da95a436571310
docker: Error ... exec: "ifconfig": executable file not found in $PATH: unknown.

[root@wg ~]# docker run -id -P --name tomcat01 tomcat
[root@wg ~]# docker exec -it tomcat01 /bin/bash
root@id:/usr/local/tomcat# apt update && apt install -y iproute2 
root@id:/usr/local/tomcat# ip addr
root@id:/usr/local/tomcat# apt -y install iputils-ping
root@id:/usr/local/tomcat# C-p-q

[root@wg ~]# docker exec -it tomcat01 ip addr
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc...
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

[root@wg ~]# ip addr
14: veth4925ff7@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
    link/ether 76:00:bb:6a:9b:ea brd ff:ff:ff:ff:ff:ff link-netnsid 2

[root@wg ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.110 ms

相关内容补充说明

- 不装net-tools或iproute2,直接查网卡方式
| docker inspect 容器id | grep IPAddress

- 再创建一个容器,让两者互ping,可以ping通
| docker exec -it tomcat02 ping tomcat01IP

- 删除容器,网卡消失

每启动一个容器,就会在宿主机和容器内成对出现两个网卡,自动分配一个ip,使用的是桥接模式。

这是veth-pair技术,实现一对虚拟设备接口彼此相连,能够通信

openstac,docker容器间连接,ovs的连接,都是使用veth_pair技术


 
--- 这里是以前的笔记,不记得是什么原因没开启转发 ---

# 没开启转发,需要开启转发,否则容器没有网络
vi /etc/sysctl.conf
net.ipv4.ip_forward=1

# 重启网络
systemctl restart network 

# 验证配置
sysctl net.ipv4.ip_forward          // 看到net.ipv4.ip_forward=1就可以了

# 重启docker,重新生成容器。。。

# 正确的方式
vi /usr/lib/sysctl.d/00-system.conf
net.ipv4.ip_forward=1
systemctl restart network
sysctl net.ipv4.ip_forward
systemctl restart docker

 

容器互通

单向方法

- 目的是实现通过容器名互通,实现高可用性

[root@wg ~]# docker exec -it tomcat02 ping tomcat01    // 无法联通

[root@wg ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat        
[root@wg ~]# docker exec -it tomcat03 ping tomcat02    // 通了,但无法反向联通

- 其实就是重新配置了容器内/etc/hosts,增加了地址解析
- 基本用不到,了解下

容器网络详情

- 网络设置里的规则在这里查看,回头详细补充下
| docker network inspect 容器id

 

自定义网络


实现同网络容器联通

- docker0无法实现地址解析式互通
- 通过自定义网络实现互通
- 默认启动就是bridge模式
- 指定启动使用加 --net bridge

[root@wg ~]# docker -run -P --name tomcat01 --net bridge tomcat
[root@wg ~]# docker network ls       // 查看所有docker网络

1、创建一个子网

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network ls
docker network inspect 子网名称        // 查看自己设置的子网

2、创建容器

docker run -d -P --name tomcat01 --net mynet tomcat            
docker run -d -P --name tomcat02 --net mynet tomcat
docker exec -it tomcat01 /bin/bash        // 连个容器都操作一遍
apt update && apt install -y inetutils-ping

3、测试联通

docker exec -it tomcat01 ping tomcat02         // 相互ping通
docker exec -it tomcat01 curl tomcat02:8080    // 直接搞定 不用安装ping

 

网络联通

实现不同网络容器联通

[root@wg ~]# docker network create --driver bridge --subnet 192.168.5.0/24 --gateway 192.168.5.1 mynet1
[root@wg ~]# docker run -d -P --name tomcat11 --net mynet1 tomcat
[root@wg ~]# docker exec -it tomcat11 apt update
[root@wg ~]# docker exec -it tomcat11 apt install -y inetutils-ping
[root@wg ~]# docker network connect mynet1 tomcat11
[root@wg ~]# docker exec -it tomcat11 ping tomcat01

- 其实就是给tomcat11添加了一块网卡

 

指定IP

[root@wg ~]# docker run -e TZ="Asia/Beijing" -id -p 3101:3306 -e MYSQL_ROOT_PASSWORD=123 \ 
           > --name master --network=mynet --ip 192.168.4.101 xiaorenwudashuju/mysql:test1

 

集群实践

1、设置配置文件

for port in $(seq 1 6)
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.1.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

# 留神,结尾EOF前边不能有空格,尼玛载了无数次跟头

2、启动服务

docker run -p 6371:6379 -p 16371:16379 --name redis-1 -v /mydata/redis/node-1/data:/data -v\/mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.1.0.11 redis redis-server /etc/redis/redis.conf

docker run -p 6372:6379 -p 16372:16379 --name redis-2 -v /mydata/redis/node-2/data:/data -v\/mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.1.0.12 redis redis-server /etc/redis/redis.conf

docker run -p 6373:6379 -p 16373:16379 --name redis-3 -v /mydata/redis/node-3/data:/data -v\/mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.1.0.13 redis redis-server /etc/redis/redis.conf

docker run -p 6374:6379 -p 16374:16379 --name redis-4 -v /mydata/redis/node-4/data:/data -v\/mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.1.0.14 redis redis-server /etc/redis/redis.conf

docker run -p 6375:6379 -p 16375:16379 --name redis-5 -v /mydata/redis/node-5/data:/data -v\/mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.1.0.15 redis redis-server /etc/redis/redis.conf

docker run -p 6376:6379 -p 16376:16379 --name redis-6 -v /mydata/redis/node-6/data:/data -v\/mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.1.0.16 redis redis-server /etc/redis/redis.conf

# 神烦,回头得写shell脚本了。。。
# 最后的redis-server /etc/redis/redis.conf 别晕,意思是依托conf文件启动服务,执行了一条命令
# 进入容器,注意,有的版本是用/bin/sh
docker exec -it redis-1 /bin/bash

3、创建集群

redis-cli --cluster create 172.1.0.11:6379 172.1.0.12:6379 172.1.0.13:6379 172.1.0.14:6379 172.1.0.15:6379 172.1.0.16:6379 --cluster-replicas 1

# 输入yes继续执行
# 出现 OK] All 16384 slots covered 完成

4、测试

redis-cli -c

cluster info

 

命令补充
docker inspect 网卡名/id      // 查看网卡详细数据
docker network rm 网卡名/id   // 删除网卡
posted @   梵高de画笔  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示