Docker 网络

目录

一. 自定义网络

网络模式

二. 网络连通

三. 部署Redis 集群

四. Sprintboot 微服务打包成Docker 镜像


一. 自定义网络

docker 通过--link 和自定义网络都可以实现网络互连;

docker network --help # 显示network 命令的相关用法, 主要是与docker网络相关
docker network ls # 显示所有的网络
docker inspect 64c5bf769554 # inspect 命令查看网络id 为64c5bf769554 的详细情况, 网络id可以使用docker network 查询

网络模式

bridge:桥接模式,就是在docker 上面搭桥(docker 默认是这种模式);

none:不配置网络;

host:和宿主机共享网络;

container:容器内的网络连通,但是使用的情况比较少(局限性比较大);

通过docker create 命令创建网络,我们之前启动一个容器的时候默认会加上--net bridge,而这个就是我们的docker0,例如:

docker run -d -P --name tomcat01 --net bridge tomcat  # -P表示随机分配一个端口

docker0 特点:默认的网络,但是域名不可以访问,--link 可以打通连接,除此之外我们还可以自定义一个连接:

docker network create --help # 查看创建网络命令的具体用法
docker network create --driver bridge --subnet 190.168.0.0/16 --gateway 190.168.0.1 mynet
# 使用create 命令创建一个自定义的网络, 网络号和主机号都是16位
docker network ls # 查看所有的网络

使用docker network inspect 自定义网络的名字就可以查看自定义的网络,这样我们后面就可以将自己的服务放到自定义的网络上:

启动tomcat-net-01容器和tomcat-net-02容器并将其放到自定义网络mynet中:

docker run -d -P --name tomcat-net-01 --network mynet tomcat # 启动tomcat-net-01 容器并且将其放到自定义的网络mynet上面
docker run -d -P --name tomcat-net-02 --network mynet tomcat # 启动tomcat-net-02 容器并且将其放到自定义的网络mynet上面

docker0 网络默认是不能够通过容器名实现ping通,而自定义网络则可以实现这个功能(自定义的网络是非常完善的),我们自定义的网络docker 都已经帮助我们维护好了关系,推荐我们平时这样使用网络,好处:例如不同的集群可以使用不同的网络,保证集群是安全和健康的;

docker exec -it tomcat-net-01 ping tomcat-net-02 # 进入容器并且使用ping 命令看是否可以ping 通

二. 网络连通

现在已经有两个网络了,一个是docker0,第二个是mynet,我们可以在docker0 网络上启动tomcat-01 和tomcat-02(不加--network默认就是docker0网络),查看docker0 和自定义网络mynet 是否可以ping 通:

docker run -d -P --name tomcat-01 tomcat # tomcat-01默认是docker0 网络
docker run -d -P --name tomcat-02 tomcat # tomcat-02默认是docker0 网络

这个时候docker0网络和自定义网络mynet 需要打通才可以ping 通,此时需要将容器与mynet 打通,使用docker network --help 命令可以看到我们可以使用connect 参数将容器连接到一个网络:

docker exec -it tomcat-01 ping tomcat-net-01 # 使用ping命令判断是否可以ping通
docker network connect --help # 查看connect 参数的具体用法
docker network connect mynet tomcat-01 # 使用connect命令将tomcat-01容器和mynet 网络打通
docker network inspect mynet # 查看自定义网络mynet的详细信息
docker exec -it tomcat-01 ping tomcat-net-01 # 使用ping命令判断属于两个不同的网络使用connect命令之后是否可以ping通

使用docker network inspect 命令查看mynet 网络可以发现多了一个docker0网络的tomcat-01容器,并且分配了当前mynet 网络的一个ip 地址,相当于一个容器两个ip地址(也即相当于路由器给给一个容器分配了ip 地址)====> 容器与容器不可以直接打通但是容器与网卡是可以打通的:

因为打通的tomcat-01 到mynet 网络,所以tomcat-02还是ping 不同mynet 网络的容器的;

结论:加入需要跨网络操作连接别的容器,那么就需要使用connect 命令打通容器与别的网卡。

三. 部署Redis 集群

之前学习Redis 的时候使用的是哨兵模式,这里使用的是分片 + 高可用 + 负载均衡模式 :

6个容器启动比较慢,我们可以写一段shell 脚本,先需要写一个redis 网络(使用docker rm -f $(docker ps -aq)先清除掉之前的所有容器方面后面测试docker 网络):

docker network create redis --subnet 172.40.0.0/16 # 创建一个自定义的redis网络
docker network ls # 查看所有的网络
docker network inspect redis # 查看自定义网络的redis信息

因为redis 需要写配置文件,写一个脚本,在linux 终端中运行这些脚本:

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.40.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

 

进入redis 的目录查看对应的配置文件:

本身的服务器是带不起来很多个redis的,docker就可以,下面使用run命令启动6个的redis(一个一个启动),其实也可以写一个脚本进行启动:

# 通过后台启动第1个redis服务
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.40.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 启动第2个redis服务
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.40.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 启动第3个redis服务
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.40.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 启动第4个redis服务
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.40.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf


# 启动第5个redis服务
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.40.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 启动第6个redis服务
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.40.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

上面启动了6个redis服务,下面是创建redis集群,在/data 目录创建集群:

docker exec -it redis-1 /bin/sh # 使用exec 命令进入正在运行的redis-1容器, 注意是sh而不是bash, 进入容器之后可以发现进入的目录为/data目录
redis-cli --cluster create 172.40.0.11:6379 172.40.0.12:6379 172.40.0.13:6379 172.40.0.14:6379 172.40.0.15:6379 172.40.0.16:6379 --cluster-replicas 1 # 创建集群

接下来就是连接集群,可以使用cluster info与cluster nodes 查看集群的相关信息:

redis-cli -c # -c表示集群
cluster info # 查看集群的信息
cluster nodes # 查看节点的信息

我们可以使用set a b 命令,可以发现处理我们服务的是第三个master 节点,a的值应该存储到第三个master节点,并且对应的从机也应该有这个值,如果第三个master节点挂掉了那么对应的从机也应该替代上来才可以实现高可用;测试:可以停止redis-3 这个master 节点,思考一下能否get到master的值呢?现在的主机已经挂掉了,如果是高可用那么主机挂掉之后那么从机会替代上来,拿到当前的值,当在第三个master 节点get a 的时候可以发现是从第4个slave 节点获取到的值:

docker stop redis-3

使用cluster nodes 命令可以发现第三个master 节点出现故障,第四个slave节点变为master节点: 

四. Sprintboot 微服务打包成Docker 镜像

具体的实现步骤:

1. 构建springboot 项目

2. 打包应用

3. 编写Dockerfile

4. 构建镜像

5. 发布运行

可以写一个简单的控制器,访问对应的请求可以显示具体的内容即可,然后在idea 页面右侧找到packag点击package,构建成功可以在target 目录可以找到对应的jar 包,我们可以先测试一下本机是否可以成功启动,成功启动之后找到jar 包所在目录使用cmd 模式启动jar 包:java -jar jar 包的名字;有了jar 包之后我们需要将其发布到Dockerfile 中,可以在idea 中安装一个插件,在settings-plugins 中搜索docker 插件,安装之后Dockerfile 文件的内容可以高亮,在idea 项目目录下创建Dockerfile 文件,在发布的时候发布两个内容:将jar 包和Dockerfile 发布上去,下面是Dockerfile 文件内容:

FROM java:8
COPY *.jar /app.jar 
CMD ["--server.port=8081"]
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "/app.jar"]

  

构建成功:

在本地使用:java -jar jar 包的名字命令启动,,如果本地正常启动说明应该是没有问题的:

先删除之前启动的容器,在/home/zhangyu目录下创建idea 目录,将打包的jar 包和Dockerfile 文件通过xftp 上传到/home/zhangyu/idea 目录,将上传的这两个文件打一个包,使用docker build -t docker-springboot . 命令构建当前的镜像,使用docker images 命令可以查看当前所有镜像,可以发现多了一个刚才我们构建的镜像,通过镜像启动容器,使用命令:docker run -d -P --name docker-springboot docker-springboot 启动容器,在linux 中使用curl localhost:端口号/hello(因为使用了-P 所以默认会分配一个Linux 的端口号),如果成功输出了消息那么说明成功发布了,所以以后写项目的时候给别人的是一个镜像而不是一个jar 包,而镜像直接运行即可,以后要写一个项目,只要将其打包成一个镜像上传到公有云仓库,直接拉取运行即可;如果存在很多个镜像呢?分别维护会非常麻烦,真正的企业实战还需要学习三个东西:Docker Compose,Docker Swarm 和CI/CD 之Jenkins;

如果在浏览器中输入Linux 配置的ip地址:端口号/hello 请求成功访问会显示对应的字符串:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值