docker分阶段构建
图形链接
查看maven官方镜像
选择3-open-jdk8
使用maven官方镜像手动构建
1.下载镜像
docker pull maven:3-openjdk-8
2.代码拷贝到镜像里
解压源码包
其中pom.xml是编译需要的各种依赖
启动maven镜像
docker run -it --name maven -d maven:3-openjdk-8 /bin/bash
代码复制到maven 镜像目录
docker cp hello-world-war maven:/opt/
进入容器查看文件
docker exec -it maven /bin/bash
查看maven版本
修改阿里云maven国内源
修改为阿里云源
复制出来修改好,在拷贝到maven中
把这块删除,添加进去
替换成功后保存
再次拷贝到maven镜像中
docker cp settings.xml maven:/usr/share/maven/conf/settings.xml
进入maven容器查看内容
进入镜像并且编译
clean package是清除上次构建的包
构建完成
查看编译后的target包
将编译后的代码copy出来
先新建一个app目录存储编译后的代码
再存放代码
重新编写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
删除上次构建的镜像
使用dockerfile重新构建
但是这个方法每次都要重新构建镜像,还要删除已经构建的镜像等等
这个时间就可以使用分阶段构建
流程图
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"]
分阶段构建
docker build -t app:v1 .
报错了
没有tomcat_jdk_221:8.5.50镜像重新构建
构建成功
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"]
再次分阶段构建app:v1
构建成功
测试
跨主机通信
第一种方法:静态路由模式说明
先清空docker-11和docker-12docker网络设置
配置docker-11
配置docker-12
"bip": "192.168.200.1/24",
systemctl daemon-reload
systemctl restart docker
ip a
添加静态路由和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
docker-12主机添加
跨主机容器通信测试
docker自带的
macvlan
overlay
macvlan模式
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
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发现可以正常通讯
第三方的
flannel + overlay
consul + overlay
跨主机通信-Consul实现
Consul介绍
Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方 案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。 它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多 数据中心
删除以前新建的网络
二进制安装步骤
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
修改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
重启docker-11
systemctl daemon-reload
systemctl restart docker.service
报错了
解决方法
先复原以前环境
使用systemctl stop docker
再改回来
同样方法修改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
注意:docker-12主机上不要consoul文件
在docker主机上创建overlay网络
在docker-11上创建网络,然后会自动同步到docker-12上
docker network create -d overlay overlay_net
里面还有静态路由配置的信息
要修改回来才能做
原来是有个空格
重启docker-12的docker.service
在docker主机上创建overlay网络
在docker-11上创建网络,然后会自动同步到docker-12上
docker network create -d overlay overlay_net
分别在两个节点上创建容器
docker-11上运行命令
docker run -it --net=overlay_net --name busybox01 busybox:latest
docker-12上运行命令
docker run -it --net=overlay_net --name busybox02 busybox:latest
查看IP地址
测试联通性
flannel通信原理