Docker-compose是一个基于Docker的编排工具,所谓编排个人理解就是将不同的镜像通过配置,组成一个新的运行环境,官方定义是:Compose is a tool for defining and running multi-container Docker applications.

很简单的一句话,下面我们看下怎么部署一个JavaWeb项目.主要有几大步骤:

  • 安装Dcoker 和Docker-compose
  • 编译项目生成JAR包
  • 创建自定义的docker镜像
  • 创建docker-compose的配置文件
  • 启动服务

安装

安装docker 和 docker-compose 一样都非常的简单,这里不在多赘述,官网都有非常详细的教程.

至于docker_compose就是一个命令文件,将其所在的路径配置PATH环境变量中即可,不配置也行,这样的话就要打全路径了,比较麻烦.

启动Docker服务

我是用的是Manjaro的Linux发行版本,启动docker服务的命令systemctl start docker,

$ docker version
Client:
Version: 18.05.0-ce
API version: 1.37
Go version: go1.10.2
Git commit: f150324782
Built: Wed May 16 22:27:45 2018
OS/Arch: linux/amd64
Experimental: false
Orchestrator: swarm Server:
Engine:
Version: 18.05.0-ce
API version: 1.37 (minimum version 1.12)
Go version: go1.10.2
Git commit: f150324782
Built: Wed May 16 22:28:17 2018
OS/Arch: linux/amd64
Experimental: false

查看Docker-compose

下载docker-compose完成之后,使用chmod +x docker-componse 来授权,否则会出现权限拒绝的报错信息

配置完成只有,在命令行中输入docker-compose version查看是否安装成功,输出类似以下信息,则代表成功


$ docker-compose version
docker-compose version 1.22.0-rc2, build 6817b533
docker-py version: 3.4.1
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0f 25 May 2017

创建Docker镜像

创建配置文件

此文件名位Dockerfile

FROM hub.c.163.com/library/java:8
VOLUME /tmp
ADD dmc_user.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • 依赖网易云的java:8镜像
  • 拷贝jar文件到镜像中
  • 执行命令运行

下面我们将使用Shell脚本的方式来利用这个Docker文件来进行创建镜像

编译生成镜像文件

由于这里使用SpringBoot创建的项目,个人使用Gradle构建项目,使用Maven或者其他方式构建的均可,这里写了一个Shell脚本,如下所示:


#!/usr/bin/env bash #配置相关的路径地址
#配置项目名称
project_name="DMC_USER"
# 配置源码地址
project_dir="/home/yan/code/work/zhuxun/dmc_user"
#配置shell地址
shell_dir="/home/yan/code/shell/dmc/user" echo "正在准备编译项目${project_name}....."
#切换到项目目录
cd ${project_dir}
echo "已经成功切换到${project_name}的工作目录......"
#使用gradle编译,跳过单元测试
./gradlew build -x test
if [ $? -eq 0 ]; then
echo "正在拷贝JAR文件............"
# 编译成功,则将JAR文件拷贝当前Shell目录
cp build/libs/dmc_user-0.0.1-SNAPSHOT.jar ${shell_dir}/dmc_user.jar
cd ${shell_dir}
echo "编译成功,正在编译为Docker镜像,请等待...."
# 使用docker build命令构建镜像文件,此时会读取Dockerfile文件
docker build -t dmc_user:latest ${shell_dir}
if [ $? -eq 0 ]; then
echo "编译镜像成功,请使用docker images命令查看效果....."
fi
fi

添加运行权限,运行之......

由于我这里使用的多个项目进行同事运行,因此需要在次编译另外一个项目,方法类似,这里不在赘述.

编译完成之后,我们在Dockerfile中查看一下镜像


$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dmc_user latest a7ea7b79390f 3 hours ago 692MB
dmc_apim latest 56c7f37aee13 16 hours ago 704MB
hub.c.163.com/library/java 8 a001fc27db5a 19 months ago 643MB

创建配置文件

到这里,我们的镜像已经准备好了,下面我们使用docker-compose来编排镜像,组成新的服务.在shell的目录下创建 文件名称docker-compose.yml的配置文件,内容如下(删除注释)...


# 配置文件的版本
version: '2'
# 创建的服务,这里我创建了3个服务,两个jar项目作为演示,一个mysql作为服务器
services:
dmc_api:
# 容器的名称
container_name: dmc_apim
# 容器的端口信息,这里的SpringBoot项目的端口是9092,可以在宿主机通过8082访问
ports:
- "8082:9092"
# 依赖的docker images镜像名称,当然也有版本这里是简写 dmc_api:latest
image: dmc_apim
# 创建自服务的依赖项,此服务依赖属于mysql,在我们创建的三个服务中的最后一个
depends_on:
- dmc_dev_mysql dmc_user:
container_name: dmc_user
ports:
- "8081:9091"
image: dmc_user
depends_on:
- dmc_dev_mysql dmc_dev_mysql:
# 这个属性非常重要,在SpringBoot的服务中,可以通过这个名称访问,如果名称冲突,docker_compose会自动的添加后缀导致SpringBoot项目找不到数据库连接,
# 从而启动失败,因此需要配置容器的名称
container_name: dmc_dev_mysql
# 挂载目录,其中 /docker-entrypoint-initdb.d/ 是比较重要的,他可以进行mysql的初始化,在我们的mysql服务的时候启动初始化脚本
# 因此需要在挂载的目录下创建init.sql脚本文件,用于初始化
volumes:
- ./data/:/var/lib/mysql/
- ./mysql/init/:/docker-entrypoint-initdb.d/
# 配置映射端口,这里mysql的端口默认是3306,我们将其映射到宿主机的9936端口
ports:
- "9936:3306"
# 依赖的镜像
image: hub.c.163.com/library/mysql
# 镜像运行需要的参数,可以根据自己的需要来配置,这个请参考镜像的说明文件
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: yse

这里和创建docker Image类似,都是使用配置文件,我们来看下我们的配置文件,配置文件名称是固定的,因此要求名称要写对,否则会报一些错误:


$ docker-compose up
ERROR:
Can't find a suitable configuration file in this directory or any
parent. Are you in the right directory? Supported filenames: docker-compose.yml, docker-compose.yaml

可以看到,最后一句话中说明了配置的文件名称 Supported filenames: docker-compose.yml, docker-compose.yaml

## 启动Docker-compose

使用命令```docker-compose up```可以启动编排,要求运行此命令运行路径下必须有docker-compose的配置文件,否则会报上面的找不到文件,
添加 *-d * 就可以后台运行,查看docker-compose的帮助文件我们看下docker容器的状况: ```shell
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c2b3823bd93 dmc_apim "java -Djava.securit…" 2 hours ago Up 2 hours 0.0.0.0:8082->9092/tcp dmc_apim
f1473486bbec dmc_user "java -Djava.securit…" 2 hours ago Up 2 hours 0.0.0.0:8081->9091/tcp dmc_user
3c632926a642 hub.c.163.com/library/mysql "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:9936->3306/tcp dmc_dev_mysql

可以看到两个SpringBoot项目和一个MySql项目在docker中运行完成.....

附录 docker-compose命令

命令名称 说明
docker-compose build Build or rebuild services
docker-compose bundle Generate a Docker bundle from the Compose file
docker-compose config Validate and view the Compose file
docker-compose create Create services
docker-compose down Stop and remove containers, networks, images, and volumes
docker-compose events Receive real time events from containers
docker-compose exec Execute a command in a running container
docker-compose help Get help on a command
docker-compose images List images
docker-compose kill Kill containers
docker-compose logs View output from containers
docker-compose pause Pause services
docker-compose port Print the public port for a port binding
docker-compose ps List containers
docker-compose pull Pull service images
docker-compose push Push service images
docker-compose restart Restart services
docker-compose rm Remove stopped containers
docker-compose run Run a one-off command
docker-compose scale Set number of containers for a service
docker-compose start Start services
docker-compose stop Stop services
docker-compose top Display the running processes
docker-compose unpause Unpause services
docker-compose up Create and start containers
docker-compose version Show the Docker-Compose version information

更多内容请查看 Docker-componse官网教程

Docker 镜像编排并部署SpringBoot应用的更多相关文章

  1. docker 镜像仓库 Harbor 部署 以及 跨数据复制

    docker 镜像仓库 Harbor 部署 跨数据复制 Harbor 是 Vmwar 公司开源的 企业级的 Docker Registry 管理项目 它主要 提供 Dcoker Registry 管理 ...

  2. 使用DaoCloud持续构建docker镜像,自动化部署

    我们学会了在主机上安装部署docker,也学会了构建自己的docker镜像和容器,启停也都会用了,下一步就需要持续构建发布docker的技能了. 我们希望能在代码提交后,有个远程服务能自动开始构建项目 ...

  3. Docker Compose编排工具部署lnmp实践及理论(详细)

    目录 一.理论概述 编排 部署 Compose原理 二.使用docker compose 部署lnmp 三.测试 四.总结 一.理论概述 Docker Compose是一个定义及运行多个Docker容 ...

  4. Docker快速上手之部署SpringBoot项目

    Docker是基于Go语言实现的云开源项目. Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装.分发.部署.运行等生命周期 ...

  5. 企业级Docker镜像仓库Harbor部署与使用

    yum install docker 官网地址:https://docs.docker.com/compose/install/ 运行此命令以下载Docker Compose的当前稳定版本 1 sud ...

  6. Docker镜像仓库Harbor部署

    一.Harbor组件 组件 功能 harbor-adminserver 配置管理中心 harbor-db Mysql数据库 harbor-jobservice 负责镜像复制 harbor-log 记录 ...

  7. k8s + docker + Jenkins使用Pipeline部署SpringBoot项目时Jenkins错误集锦

    背景 系统版本:CentOS7 Jenkins版本:2.222.1 maven版本:apache-maven-3.6.3 Java版本:jdk1.8.0_231 Git版本:1.8.3.1 docke ...

  8. Mac下 Docker部署SpringBoot应用

    一.安装Docker环境 使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker. Homebrew 的 Cask 已经支持 Docker for Mac,因此 ...

  9. IDEA部署Spring-boot到Docker容器

    一.准备工作 idea安装Docker插件 centos7系统安装docker 二.打开docker远程端口 1. 编辑docker.service文件 vim /usr/lib/systemd/sy ...

随机推荐

  1. FFmpeg开发实战(四):FFmpeg 抽取音视频的音频数据

    如何使用FFmpeg抽取音视频的音频数据,代码如下: void adts_header(char *szAdtsHeader, int dataLen); // 使用FFmpeg从视频中抽取音频 vo ...

  2. [Swift]LeetCode260. 只出现一次的数字 III | Single Number III

    Given an array of numbers nums, in which exactly two elements appear only once and all the other ele ...

  3. [Swift]LeetCode532. 数组中的K-diff数对 | K-diff Pairs in an Array

    Given an array of integers and an integer k, you need to find the number of unique k-diff pairs in t ...

  4. [Swift]LeetCode1031. 两个非重叠子数组的最大和 | Maximum Sum of Two Non-Overlapping Subarrays

    Given an array A of non-negative integers, return the maximum sum of elements in two non-overlapping ...

  5. spring-cloud-sleuth+zipkin源码探究

    1. spring-cloud-sleuth+zipkin源码探究 1.1. 前言   粗略看了下spring cloud sleuth core源码,发现内容真的有点多,它支持了很多类型的链路追踪, ...

  6. 使用(POI)SAX处理Excel大文件,防止内存溢出

    POISAXReader h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-chi ...

  7. Redis 设计与实现 (五)--多机数据库的实现

    多机数据库的实现 一.复制 slaveof  主服务器ip地址.形成主从关系. 1.同步  从向主服务器发送sync命令.  主服务器收到sync命令执行bgsave,生成rdb文件,缓冲区同时记录从 ...

  8. java 网络通信传输层协议——UDP和TCP

    本文原文由作者“zskingking”发表于:jianshu.com/p/271b1c57bb0b,本次收录有改动. 1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯网专注的即时通 ...

  9. node开发备注

    设置环境变量 // 命令行启动: "scripts": { "start": "export NODE_ENV=dev && node ...

  10. Qt窗口定制

    qt中的QWidget窗口支持窗体绘制,但是不支持窗口标题栏绘制,想要美观的界面,还需要自己去定制,下面我就介绍一种定制窗体的方法 一个窗口无非就3部分,标题栏.窗体和状态栏,接下来我定制的窗口没有状 ...