文章目录
上一篇博客讲了通过dockerfile定制镜像,接下来通过docker compose对多个镜像进行编排
一、环境
Linux:centos8
docker: 18.09.1
ssm.war
二、compose简介
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。
Docker-Compose 通过一个配置文件来管理多个Docker容器,在配置文件(docker-compose.yml)中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
三、compose安装
以 Linux 为例,其它系统请自行百度
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:
链接: https://github.com/docker/compose/releases.
运行以下命令以下载 Docker Compose 的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换 1.26.1。
将可执行权限应用于二进制文件:
chmod 777 /usr/local/bin/docker-compose
创建软链:
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
docker-compose --version
四、ssm项目部署
注意:yml 文件不能含有 Tab 键,及其他特殊字符
1、构建部署ssm
当前ssm项目需要的组件很简单,jdk、tomcat、mysql,接下来会使用 dockerfile 分别 dockerhub 仓库的镜像进行重构,即自定义定制镜像,因为官方的 tomcat 镜像自带 jdk , 所以我们就不定制jdk镜像,只需要使用dockerfile文件对tomcat以及mysql镜像进行修改,对 dockerfile 不了解的可以看我另一篇博客
链接: https://blog.csdn.net/qq_41538097/article/details/107196797.
Ⅰ、整体构建
1)、项目结构
配置docker-compose.yml文件,全部使用官方镜像,如下简单示例
version: "3"
services:
web:
image: tomcat:8 //基础镜像
container_name: web //生成容器名
volumes: //将 项目挂载在webapps目录
- "/root/compose-ssm/ssm/:/usr/local/tomcat/webapps/"
ports:
- "8023:8080"
environment:
username: root
userpass: 123456
depends_on:
- mysql
entrypoint:
- "catalina.sh"
- "run"
mysql:
image: mysql:latest
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: "123456"
ports:
- "3323:3306"
2)、测试结果
docker-compose up -d
按照如上配置可以正常部署项目,测试结果如下
项目截图
远程连接数据库截图
3)、遇到的问题
上面这个配置可以正常使用,下面讲讲过程中遇到的错误
tomcat 7 和 tomcat 6可以正常使用
当使用 tomcat:latest 报错
当使用 startup.sh 代替 catalina.sh 报错(平常使用这两个没区别)
对于这两个错误总体来说就是 OCI运行时创建失败:导致找不到启动文件,可以参考如下博客解决(ps:我还没去测试,过几天写个博客说明到底能否解决)
链接: https://blog.csdn.net/qq_35916684/article/details/89400564.
Ⅱ、分步构建
1)、目录结构
2)、dockerfile-tomcat
有以下两种,第一种相对简单直接在 tomcat 的镜像上做修改,第二种相对复杂,而且下载安装的东西比较多,执行特别慢,但第二种可修改的参数更多,推荐使用第一种,需要在 centos 镜像安装 tomcat、jdk ( centos 镜像没有自带的 jdk )
①、利用 tomcat 镜像定制
新建 dockerfile-tomcat 文件,粘贴如下内容
# 直接从docker提供的远程镜像仓库中拉取最新的tomcat组件
FROM tomcat
# 本镜像的制作者的信息
MAINTAINER 781990434@qq.com
# 把当前文件目录下的docker-ssm.war移动到容器中tomcat自动启动的目录下
COPY ssm.war /usr/tomcat/webapps/
# 暴露端口,如果启动容器时,没有使用-p自定义端口,则默认使用容器此端口
EXPOSE 8080
# 容器启动时启动tomcat
ENTRYPOINT /usr/tomcat/bin/startup.sh
②、利用 centos 镜像定制
新建 dockerfile-tomcat 文件,粘贴如下内容
FROM centos
MAINTAINER 781990434@qq.com
//我用的mkdir创建切换工作目录,容器内部生成/root/DockerFile/目录,也可以使用 WORKDIR ,yum 如果不添加 -y 会失败,-y代表安装过程中全选yes
RUN mkdir -p /root/DockerFile/ && cd /root/DockerFile/ \
&& yum update -y \
&& yum install wget -y \
&& wget "https://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.57/bin/apache-tomcat-8.5.57.tar.gz" \
&& tar -zxvf apache-tomcat-8.5.57.tar.gz
&& wget "https://mirrors.huaweicloud.com/java/jdk/8u171-b11/jdk-8u171-linux-x64.tar.gz" \
&& tar -zxvf jdk-8u171-linux-x64.tar.gz
COPY ssm.war /root/DockerFile/apache-tomcat-8.5.57/webapps/
EXPOSE 8081
//配置Java环境变量
ENV JAVA_HOME=/root/DockerFile/jdk1.8.0_171
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 容器启动时启动tomcat
ENTRYPOINT /usr/tomcat/bin/startup.sh
想替换tomcat版本可以在 https://tomcat.apache.org/ 查找
想替换jdk版本可以在 https://repo.huaweicloud.com/java/jdk/ 查找,注意替换环境变量
3)、dockerfile-mysql
新建 dockerfile-mysql 文件,粘贴以下内容
FROM mysql:latest
MAINTAINER 781990434@qq.com
# 把要执行的sql文件放到MySQL的/usr/local/目录下
# mysql/ssm.sql 宿主机目录 ,/usr/local/docker-initdb 容器内部目录
COPY ssm.sql /usr/local/docker-initdb
# 把要执行的shell文件放到/mysql-initdb/目录下
COPY ssm.sh /usr/local/mysql-initdb
# 给执行文件增加可执行权限
RUN chmod 777 /usr/local/mysql-initdb/ssm.sh
4)、ssm.sh 初始化数据库
该脚本用于执行 ssm.sql 从而初始化数据库
#!/bin/bash
#-u后面为数据库用户名 -p后面跟的是密码
#-p后面要紧跟你的密码,不要有空格!!!!!!
mysql -u root -p123456 <<EOF
source /usr/local/docker-initdb/ssm.sql;
EOF
ssm.sql 为你的SQL语句,可以将你原来的数据库数据导出为可执行sql文件,复制进来
5)、新建 docker-compose.yml文件
version: "2"
services:
web: #编排文件中容器的别名
build:
context: ./tomcat #上下文路径
dockerfile: dockerfile-tomcat #指定构建镜像的 Dockerfile 文件名,如果不配置,默认为Dockerfile
image: tomcat-ssm:1.0.0 #构建之后镜像的名字
container_name: web #容器的名字
restart: always #容器重启之后总是会重新构建本镜像
depends_on: #依赖启动,在mysql启动之后再启动本容器
- mysql
ports:
- "8023:8080" #冒号左边8023代表宿主机中的端口,右边的8080代表容器中的端口
mysql:
build:
context: ./mysql #说明已经进入./mysql目录,dockerfile-mysql配置时不能带mysql目录
dockerfile: dockerfile-mysql
image: mysql-ssm:1.0.0
container_name: mysql
restart: always
ports:
- "3323:3306"
volumes:
- "/root/compose-ssm/logs:/logs"
- "/root/compose-ssm/data:/var/lib/mysql"
environment: #在mysql初始化的时候设置登陆密码
MYSQL_ROOT_PASSWORD: "123456"
2、生成镜像
docker-compose up -d
docker images
docker ps
3、上传镜像
上传镜像到阿里云和dockerhub请参考我另一篇博客
https://blog.csdn.net/qq_41538097/article/details/106861717.
若上传镜像到 github,直接将 compose-ssm文件夹上传即可,和上传文件代码没什么区别,这里就不罗嗦了
五、docker三剑客简单总结
1、docker-compose
主要是解决本地docker容器编排问题
解决单主机docker多容器编排问题,一般是通过yaml配置文件来使用它,这个yaml文件里能记录多个容器启动的配置信息(镜像、启动命令、端口映射等)
2、docker-machine
解决docker运行环境问题
非Linux环境选择,win10自带了hyper-v虚拟机,可以直接装docker,对于非linux环境想要使用docker,可以使用docker-machine,hyper-v或者virtualbox
3、docker-swarm
解决多主机多个容器调度部署得问题
swarm是基于docker平台实现的集群技术,他可以通过几条简单的指令快速的创建一个docker集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。暂不成熟,目前多使用Kubernetes