docker制作ssm镜像(三)docker compose


上一篇博客讲了通过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

猜你喜欢

转载自blog.csdn.net/qq_41538097/article/details/107224883