阅读目录
看起来很复杂,不要被吓到,其实都是抄的官网 Tomcat 镜像的Dockerfile,然后改动了一点,主要是后面三句:删除容器 ROOT 文件夹,拷贝上下文目录的 ROOT 文件夹到 wenapps 目录下,重启服务。
RUN rm -rf /usr/local/tomcat/webapps/ROOT/ ONBUILD COPY ROOT /usr/local/tomcat/webapps/ROOT/ ONBUILD ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
tips:1、ONBUILD 命令本次镜像不会被执行,只有以这个镜像为基础镜像的时候才会被执行。
2、上下文目录指的是 Dockerfile 文件所在的目录。
3、该镜像已上传到 DockerHub 上:https://hub.docker.com/r/jmcui/tomcat-env/
2、微服务镜像打包
有了基础环境镜像 tomcat-env,那么打包一个服务镜像就是一件再简单不过的事情了:
FROM tomcat-env:1.0
没错,就是这么简单,因为我们把所有的工作都放在 tomcat-env 中了,其实就是那个 ONBUILD 命令的效果啦~~
三、编排文件 docker-compose.yml
微服务项目要部署起来,主要是靠 docker-compose.yml 文件进行编排,规定服务之间的关联以及先后启动顺序,然后把几十个零散的微服务当成一个整体来统一管理。
首先,困扰我的是网络问题。做过开发的都知道,要在项目中指定(Spring 在 applicationContext.xml)数据库地址和 Zookeeper 地址,那么我怎么知道容器的 ip 地址是多少呢?先来了解下 Docker 的网络模式?
Docker 的默认网络配置是 "bridge",当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。Docker 会随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口,它会在挂载到它的网口之间进行转发。当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。
也就是说,每次容器启动以后的 ip 地址是不固定的,这该怎么办呢?当然可以写死 IP 地址,规定局域网网段,给每个服务编排 IP 地址;当然也可以把network_mode="host",统一用宿主机的网络地址。当然!这些都不是最好的办法:
version: '3.7' #服务列表 services: #基础组件 zookeeper zookeeper: image: zookeeper restart: always ports: - 4181:2181 #基础组件 MySQL db: image: mysql:5.7.17 command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --init-connect='SET NAMES utf8mb4;' ports: - "3636:3306" volumes: - /var/mysqldb:/var/lib/mysql - /docker/mysql/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf restart: always environment: MYSQL_ROOT_PASSWORD: password #消费者服务1 admin admin: image: "admin:2.3.1" ports: - "7575:8080"
关键字:
青岛 Python培训
可能你正在寻找一家靠谱的IT培训机构,
渴望突破职业瓶颈,
找一份得体的工作。
恰巧万码学堂正在寻找像你这样不甘平凡的追光者!
我们拒绝纸上谈兵,直接参与真实开发流程!
现在行动,未来可期
立即拨打0532-85025005,预约免费职业规划咨询
前20名咨询者赠送《2025高薪技术岗位白皮书》!
你不是在报名课程,而是在投资五年后的自己!