2022-02-28 day 94 Docker 分阶段构建跨主机通信

docker分阶段构建

图形链接

查看maven官方镜像

image.png
image.png

选择3-open-jdk8

image.png

使用maven官方镜像手动构建
1.下载镜像

docker pull maven:3-openjdk-8

image.png
image.png

2.代码拷贝到镜像里
解压源码包

image.png

其中pom.xml是编译需要的各种依赖

image.png

启动maven镜像

docker run -it --name maven -d maven:3-openjdk-8 /bin/bash

image.png

代码复制到maven 镜像目录
docker cp hello-world-war maven:/opt/

image.png

进入容器查看文件

docker exec -it maven /bin/bash

image.png

查看maven版本

image.png

修改阿里云maven国内源

image.png

修改为阿里云源

复制出来修改好,在拷贝到maven中


image.png
image.png
image.png

把这块删除,添加进去

image.png

替换成功后保存

image.png

再次拷贝到maven镜像中

docker cp settings.xml maven:/usr/share/maven/conf/settings.xml

image.png

进入maven容器查看内容

image.png

进入镜像并且编译

image.png

clean package是清除上次构建的包

image.png

构建完成

image.png

查看编译后的target包

image.png
image.png

将编译后的代码copy出来
先新建一个app目录存储编译后的代码

image.png

再存放代码

image.png

重新编写dockerfile

FROM maven:3-openjdk-8
COPY settings.xml /usr/share/maven/conf/settings.xml
ADD hello-world-war.tar.gz /opt/
WORKDIR /opt/hello-world-war
RUN mvn clean package
image.png

删除上次构建的镜像

image.png

使用dockerfile重新构建


image.png
image.png
image.png
image.png
image.png
image.png

但是这个方法每次都要重新构建镜像,还要删除已经构建的镜像等等

这个时间就可以使用分阶段构建

流程图

https://www.processon.com/view/link/621c2b6a637689370a338fec

https://www.processon.com/view/link/621cc9cae401fd520c1bb007

分阶段构建镜像改写dockerfile

FROM maven:3-openjdk-8
COPY settings.xml /usr/share/maven/conf/settings.xml
ADD hello-world-war.tar.gz /opt/
WORKDIR /opt/hello-world-war
RUN mvn clean package


FROM tomcat_jdk_221:8.5.50 
COPY --from=0 /opt/hello-world-war/target/hello-world-war-1.0.0.war /opt/tomcat/webapps/hello-world.war 
EXPOSE 8080 
CMD ["/opt/tomcat/bin/catalina.sh","run"]

image.png

分阶段构建
docker build -t app:v1 .

image.png

报错了


image.png

没有tomcat_jdk_221:8.5.50镜像重新构建

image.png
image.png
image.png

构建成功

FROM jdk:8u221
ADD apache-tomcat-8.5.50.tar.gz /opt/
RUN ln -s /opt/apache-tomcat-8.5.50 /opt/tomcat
RUN rm -rf /opt/tomcat/webapps/* && \
    mkdir /opt/tomcat/webapps/hello-world && \
    ln -s /opt/tomcat/webapps/hello-world /opt/tomcat/webapps/ROOT && \
    rm -rf /opt/tomcat/webapps/hello-world
EXPOSE 8080
CMD ["/opt/tomcat/bin/catalina.sh","run"]

image.png

再次分阶段构建app:v1

image.png

构建成功

image.png
image.png

测试

image.png
image.png

跨主机通信
第一种方法:静态路由模式说明

先清空docker-11和docker-12docker网络设置

image.png
image.png
image.png

配置docker-11

image.png
image.png

配置docker-12

"bip": "192.168.200.1/24",

systemctl daemon-reload
systemctl restart docker
ip a

image.png

添加静态路由和iptables规则

docker-11主机添加
route add -net 192.168.200.0/24 gw 10.0.0.12
iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT

image.png

docker-12主机添加

image.png

跨主机容器通信测试

image.png
image.png
image.png
image.png

docker自带的

macvlan
overlay

macvlan模式


image.png

macvlan介绍
https://docs.docker.com/network/macvlan/ 简单来说,macvlan就是将在物理网虚拟出一个网卡,这个网卡有自己的mac地址,从而让容器可以直 接使用物理网卡

创建网络-所有机器都要配置

docker network create -d macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
image.png
image.png

docker-11启动容器
docker run -it --network macvlan_1 --ip 10.0.0.100 busybox /bin/sh

docker-12启动容器
docker run -it --network macvlan_1 --ip 10.0.0.200 busybox /bin/sh

启动后互相ping发现可以正常通讯

image.png
image.png

第三方的

flannel + overlay
consul + overlay

跨主机通信-Consul实现
Consul介绍
Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方 案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。 它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多 数据中心

image.png

删除以前新建的网络


image.png
image.png

二进制安装步骤

wget https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip 
unzip consul_1.4.4_linux_amd64.zip 
mv consul /usr/bin/ 
chmod +x /usr/bin/consul 
nohup consul agent -server -bootstrap -ui -data-dir /var/lib/consul -client=10.0.0.11 -bind=10.0.0.11 &> /var/log/consul.log &
tail -f /var/log/consul.log
image.png

修改docker-11启动文件
vim /lib/systemd/system/docker.service
加一条数据

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul://10.0.0.11:8500 --cluster-advertise 10.0.0.11:2375
image.png

重启docker-11
systemctl daemon-reload
systemctl restart docker.service

报错了

image.png

解决方法
先复原以前环境


image.png

使用systemctl stop docker

image.png

再改回来


image.png

同样方法修改docker-12的配置
vim /lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul://10.0.0.11:8500 --cluster-advertise 10.0.0.12:2375
image.png
image.png

注意:docker-12主机上不要consoul文件

在docker主机上创建overlay网络
在docker-11上创建网络,然后会自动同步到docker-12上
docker network create -d overlay overlay_net

里面还有静态路由配置的信息


image.png

要修改回来才能做


image.png
image.png

原来是有个空格


image.png
image.png
image.png

重启docker-12的docker.service

image.png
image.png

在docker主机上创建overlay网络
在docker-11上创建网络,然后会自动同步到docker-12上
docker network create -d overlay overlay_net

image.png

image.png

分别在两个节点上创建容器
docker-11上运行命令
docker run -it --net=overlay_net --name busybox01 busybox:latest

image.png

docker-12上运行命令
docker run -it --net=overlay_net --name busybox02 busybox:latest

image.png

查看IP地址


image.png
image.png

测试联通性

image.png

flannel通信原理

你可能感兴趣的:(2022-02-28 day 94 Docker 分阶段构建跨主机通信)