Docker 网络(八)

文章详细介绍了Docker容器之间的网络通信,包括默认的桥接模式如何实现容器间的通信,Docker的Link参数以及自定义网络的作用。通过示例展示了如何创建和管理自定义网络,确保容器间的互联互通。此外,还讨论了Redis集群的部署,验证了网络配置在高可用性中的重要性。
摘要由CSDN通过智能技术生成

一、背景:

        想一下这个问题,容器和容器之间是否可以通过网络正常通信?宿主机和容器是否可以通信?如果可以通信,那为什么可以通信。如果不可以通信,如何让他们之间通信。接下来就详细的讲解下 docker 的网络。

二、Docker 网络现状

        1、首先删除所有的镜像和容器,如下所示:

 # 删除所有容器
docker rm -f $(docker ps -aq)

# 删除所有镜像,这个 rmi 是专门删除镜像的命令
docker rmi -f $(docker images -aq) 

        2、 查看网卡信息,如下所示:

ip addr

        如果你出现的是下面的这种多个地址,那么你可以进行 删除 virbr0修改 ens33 的操作。

        3、docker 的容器和容器之间是如何进行网络访问的?如下所示:

# 运行 tomcat 容器
docker run -d --name tomcat01 tomcat

# 进入容器
docker exec -it tomcat01 bash

# 下载安装 ip 命令相关的安装包
apt-get update & apt-get install -y iproute2 
 
# 查看ip
ip addr

        我们可以发现,172.17.0.2 是容器的地址,我们用宿主机测试下是否可以 ping 通容器的地址,如下所示,发现是可以 ping 通的。

三、原理分析:

        1、每启动一个 docker 容器,docker 就会给容器分配一个 IP,只要我们安装了 docker 就会有一个默认的网卡 docker0,使用的是桥接模式,veth-pair (虚拟网线,即一端连着容器,一端连着 docker0 的网卡)技术。

        再启动一个 tomcat 容器,命令如下:

# 运行 tomcat 镜像
docker run -d --name tomcat02 tomcat

# 进入容器
docker exec -it tomcat02 bash

# 下载安装 ip 命令相关的安装包
apt-get update & apt-get install -y iproute2 
 
# 查看ip
ip addr

        查看容器和宿主机 ip 如下所示:

        我们发现,这个容器带来的网卡都是一对一对的,veth-pair 就是一对虚拟设备接口,他们都是成对出现,一端连着协议,一端彼此相连,veth-pair 充当于一个桥梁,连接各种网络设备。

        2、测试 tomcat02 是否可以 ping tomcat01,如下所示:

        结论: Tomcat01 Tomcat02 是公用的一个路由器 docker0,左右的容器在不指定网络的情况下,都是 docker0 来路由的,docker 会给我们分配一个默认的可用 IP

        Docker 使用的是 Linux 桥接,如下图所示:

四、Docker 的 Link 参数:

        1、思考一个场景,我们编写了一个微服务,比如 mysql 的连接地址为:database.url=ip:port ,如果数据库 IP 换掉了,我们想不重启解决这个问题,是否可以通过名字访问容器?

        测试是否可以通过容器名称 ping 通另一个容器,如下所示,ping 不通。

        我们使用 link 的方式再次启动一个容器 tomcat03 ,再次尝试,如下所示:

# 启动 tomcat03 容器
docker run -d --name tomcat03 --link tomcat01 tomcat

# 进入容器
docker exec -it tomcat03 bash

# 安装 ping 工具
apt-get update & apt-get install -y iputils-ping

# 测试
ping tomcat01

        我们发现 tomcat03 是可以 ping tomcat01 的,那么反过来可以吗?显然是不可以的。

        因为我们在启动 tomcat03 的时候在本地配置了 tomcat01,如下所示:

        --link 参数就是在 hosts 中增加了 172.17.0.2 tomcat01 202aa737790a,但是我们现在已经不推荐这种方式了。即 docker0 不支持自定义网络。

五、自定义网络

        1、查看所有的 docker 网络,输入 docker network ls ,如下所示:

bridge:桥接 docker(默认,自己创建也使用 bridge 模式)

none:不配置网络

host:和宿主机共享网络

container:容器网络连通(用的少)

# 这两个命令是一样的,只不过 --net bridge 可以省略,是默认的
#  --net bridge, 这个就是我们的 docker0
# docker0 的特点是默认不能访问域名,但是可以通过 --link 打通,但是太麻烦,不推荐
docker run -d --name tomcat01 tomcat = docker run -d --name tomcat01 --net bridge tomcat

        2、我们可以自定义一个网络,首先输入 docker network --help 查看需要的参数,如下所示:

        接下来执行下面命令,并查看当前的网络信息

# --driver bridge ,桥接的方式
# --subnet 192.168.0.0/16 (16代表255*255个端口=65535) 192.168.0.2 到 192.168.255.255
# --gateway 192.168.0.1,设置网关 ip
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 xhf_net

        我们自己的网络就建好了,如下所示:

        3、接下来重新创建两个 tomcat 容器,测试是否互通,命令如下:

# 先启动 tomcat_01
docker run -d --name tomcat_01 --net xhf_net tomcat

# 进入容器
docker exec -it tomcat_01 bash

# 配置 dns,要不无法访问互联网
echo "nameserver 8.8.8.8" >> /etc/resolv.conf

# 安装 ping 工具
apt-get update & apt-get install -y iputils-ping


# 再启动 tomcat_02
docker run -d --name tomcat_02 --net xhf_net tomcat

# 进入容器
docker exec -it tomcat_02 bash

# 配置 dns,要不无法访问互联网
echo "nameserver 8.8.8.8" >> /etc/resolv.conf

# 安装 ping 工具
apt-get update & apt-get install -y iputils-ping

        反向测试也没有问题,网络是互通的,即我们自定义的网络,docker 都已经帮我们维护好了对应关系,推荐这样使用。

        4、针对于 mysql redis 集群来说,好处是不同集群使用不同网络,保证集群安全、健康。

        5、如果此时我想 tomcat01 和 tomcat_01 互通,也就是和 xhf_net 打通,怎么操作?

# 将 xhf_net 和 tomcat01 打通
docker network connect xhf_net tomcat01

        查看 xhf_net 详情,如下所示,发现 xhf_net Containers 中多了一个 tomcat01 容器。

docker network inspect xhf_net

        6、假如我要跨网络操作别人,就需要用 docker network connect 来连接。即 docker 通过一个容器两个 IP 的方式,如:阿里云公网 IP 和私网 IP,将两个容器打通。

六、部署一个 redis 集群

        我们创建一个 redis 集群,分配同一个网段,测试其中一个节点挂掉之后,其他的节点是否还可以继续工作。

        1、创建网卡 redis 和相关的配置文件,如下所示:

# 创建网卡
docker network create redis --subnet 172.38.0.0/16

# 使用脚本创建6个配置文件
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.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

        2、启动六个 redis 容器,如下所示:

# 启动redis-1
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.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 启动redis-2
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.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
 # 启动redis-3
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.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
 # 启动redis-4
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.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
 # 启动redis-5
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.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
 # 启动redis-6
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.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

        3、创建集群,命令如下:

# 随便进入一个容器
docker exec -it redis-1 /bin/sh

# 创建集群的命令
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

        4、测试主从,当主挂了之后,从是否会成为主

# 进入容器
docker exec -it redis-1 /bin/sh

# 进入 redis 命令行模式,-c是进入集群模式
redis-cli -c

# 查看集群信息
cluster info

# 查看节点信息
CLUSTER nodes

#  随便存一个值,发现存在172.38.0.13:6379
set a b

# 当172.38.0.13 这台服务挂了之后,测试是否能查询到值,停掉 redis-3
docker stop redis-3

# 重新查询
get a

# 重新查看节点状态,发现 172.38.0.13:6379 fail, 172.38.0.14 已经成为了 master
CLUSTER nodes 

七、Eclipse 整合 Docker

 创建项目

        1、使用 eclipse 创建一个 springboot 项目

        2、编写一个 hello world

@RestController
public class HelloWorld {
 
	@RequestMapping("/hello")
	public String Hello() {
		
		return "Hello World";
	}
}

        3、启动测试下,本地访问没问题就可以

         4、打成 jar

打包镜像

        1、在项目下编写 Dockerfile 文件,将打包好的 jar 包拷贝到 Dockerfile 同级目录

FROM java:8

# 服务器只有 dockerfile 和jar在同级目录
COPY *.jar /app.jar

CMD ["-server.port=8080"]

# 指定容器要暴露的端口
EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]

        2、Dockerfile 和项目的 jar 包上传到 linux 服务器上,构建运行。

[root@localhost home]# cd eclipsetest/
[root@localhost eclipsetest]# pwd
/home/eclipsetest
[root@localhost eclipsetest]# ls
com.DockerTestOne-0.0.1-SNAPSHOT.jar  Dockerfile

# 构建镜像
[root@localhost eclipsetest]# docker build -t eclipse_project .
[+] Building 86.2s (7/7) FINISHED                                                                             docker:default
 => [internal] load .dockerignore                                                                                       0.1s
 => => transferring context: 2B                                                                                         0.1s
 => [internal] load build definition from Dockerfile                                                                    0.1s
 => => transferring dockerfile: 305B                                                                                    0.1s
 => [internal] load metadata for docker.io/library/java:8                                                               1.2s
 => [internal] load build context                                                                                       3.8s
 => => transferring context: 14.50MB                                                                                    3.7s
 => [1/2] FROM docker.io/library/java:8@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d        80.9s
 => => resolve docker.io/library/java:8@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d         0.7s
 => => sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d 2.00kB / 2.00kB                          0.0s
 => => sha256:d23bdf5b1b1b1afce5f1d0fd33e7ed8afbc084b594b9ccf742a5b27080d8a4a8 4.73kB / 4.73kB                          0.0s
 => => sha256:5040bd2983909aa8896b9932438c3f1479d25ae837a5f6220242a264d0221f2d 51.36MB / 51.36MB                        6.9s
 => => sha256:76610ec20bf5892e24cebd4153c7668284aa1d1151b7c3b0c7d50c579aa5ce75 42.50MB / 42.50MB                        6.0s
 => => sha256:fce5728aad85a763fe3c419db16885eb6f7a670a42824ea618414b8fb309ccde 18.54MB / 18.54MB                        5.2s
 => => sha256:60170fec2151d2108ed1420625c51138434ba4e0223d3023353d3f32ffe3cfc2 593.15kB / 593.15kB                      6.3s
 => => sha256:e98f73de8f0d2ef292f58b004d67bc6e9ee779dcfaff7ebb3964649d4787b872 214B / 214B                              6.7s
 => => sha256:11f7af24ed9cf47597dd6cf9963bb3e9109c963f0135e869a9e9b4999fdc12a3 242B / 242B                              6.9s
 => => sha256:49e2d6393f32abb1de7c9395c04c822ceb2287383d5a90998f7bd8dbfd43d48c 130.10MB / 130.10MB                     17.9s
 => => sha256:bb9cdec9c7f337940f7d872274353b66e118412cbfd433c711361bcf7922aea4 289.05kB / 289.05kB                      7.4s
 => => extracting sha256:5040bd2983909aa8896b9932438c3f1479d25ae837a5f6220242a264d0221f2d                              17.4s
 => => extracting sha256:fce5728aad85a763fe3c419db16885eb6f7a670a42824ea618414b8fb309ccde                               2.5s
 => => extracting sha256:76610ec20bf5892e24cebd4153c7668284aa1d1151b7c3b0c7d50c579aa5ce75                              27.0s
 => => extracting sha256:60170fec2151d2108ed1420625c51138434ba4e0223d3023353d3f32ffe3cfc2                               0.3s
 => => extracting sha256:e98f73de8f0d2ef292f58b004d67bc6e9ee779dcfaff7ebb3964649d4787b872                               0.0s
 => => extracting sha256:11f7af24ed9cf47597dd6cf9963bb3e9109c963f0135e869a9e9b4999fdc12a3                               0.1s
 => => extracting sha256:49e2d6393f32abb1de7c9395c04c822ceb2287383d5a90998f7bd8dbfd43d48c                              23.3s
 => => extracting sha256:bb9cdec9c7f337940f7d872274353b66e118412cbfd433c711361bcf7922aea4                               0.1s
 => [2/2] COPY *.jar /app.jar                                                                                           2.9s
 => exporting to image                                                                                                  0.6s
 => => exporting layers                                                                                                 0.6s
 => => writing image sha256:ba975b2669801dca343a3593bebfc81fd5ecb2e7662ac114d16e760efd3ca1c3                            0.1s
 => => naming to docker.io/library/eclipse_project                                                                      0.0s

# 查看镜像
[root@localhost eclipsetest]# docker images
REPOSITORY                                                                 TAG                IMAGE ID       CREATED         SIZE
eclipse_project                                                            latest             ba975b266980   7 seconds ago   658MB

# 运行
[root@localhost eclipsetest]# docker run -d -p 8080:8080 --name myeclipse_project eclipse_project
586214466a8cf9c4a8584cab2cfb5c524765f7300227c59077ea7f77c87f7489
[root@localhost eclipsetest]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                                       NAMES
586214466a8c   eclipse_project   "java -jar /app.jar …"   7 seconds ago   Up 2 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   myeclipse_project

# 测试访问
[root@localhost eclipsetest]# curl localhost:8080/hello
Hello World[root@localhost eclipsetest]# 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的小三菊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值