Docker镜像编排部署SpringBoot应用

本文同步更新于自己的博客,欢迎访问 https://www.zhoutao123.com/page/book/blog/category/docker_compose

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官网教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 一 、什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国...
    Blazzer阅读 3,128评论 0 13
  • 《Docker从入门到实践》阅读笔记 原书地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo阅读 11,352评论 1 39
  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,505评论 15 147
  • 原来每个人的成长都像是一场穿越荆棘的旅程,只是有的人望着伤口感怀世事,有的人忍着疼痛继续前行。 每一段经历都是一个...
    一路人阅读 635评论 0 0
  • 今天部门组织年终聚会,这是我们部门重组以来第一次真正意义上的聚会,大家都比较激动,对明年都充满了期待和干劲...
    周小末_0700阅读 119评论 0 1