基于Docker-Compose 部署前后端分离单体项目(二)

大概部署的思路在上篇文章已经介绍清楚,本文的目的特别简单,只有两件事情需要做:

  • 1.制作镜像。
  • 2.推送镜像。

上文说到,基于maven的java项目的推送和vue的推送是有差别的,那我们也就分为两部分来说明!
上文也说到,原理都是一样的,都是基于docker build命令来制作的,所以大家在阅读这篇文章的时候有必要了解以下docker build这个命令,以及Dockerfile。这里不再赘述,网上资料很多,自行查阅即可!

1.阿里云容器服务配置

1.1 创建命名空间

阿里云容器镜像服务创建命名空间

1.2 创建镜像服务

阿里云容器镜像服务创建镜像仓库

同时也推荐大家在创建镜像仓库的时候,多写镜像描述,如果是公开镜像方便其他人的使用,例如


镜像描述说明

2. maven项目的打包制作镜像以及镜像推送

为什么此处不写java项目或者springboot项目等,是因为我们这里是通过maven插件dockerfile-maven-plugin来进行打包推送的.

从上面我们创建的镜像来看,我们是需要把当前镜像推送到pitaya-vistor这个镜像仓库的。话不多少,先把项目需要配置的贴出来再解释

  • 先看项目结构,以及文件位置


    maven项目结构

    需要修改的只有标出来的几个文件

  • .dockerignore
  • docker-compose.yml
  • Dockerfile (这个文件与镜像制作以及推送无关,放在此处是为了项目更清晰)
  • pom.xml
  • settings.xml (maven的settings.xml配置)

2.1 maven集成docker插件

  • pom.xml添加properties
<properties>
     <!-- 仓库地址 在阿里云上可以找到 -->
    <docker.registry>registry.cn-shenzhen.aliyuncs.com</docker.registry>

    <!-- 这里指的是阿里云上配置的命名空间名字-->
    <docker.image.prefix>pitaya</docker.image.prefix>
</properties>

上面的配置信息去哪里找,请查看注释。

  • pom.xml添加plugins
<build>
       
       <!-- 此处需要注意和你的项目名对应起来-->
        <finalName>pitaya-vistor</finalName>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.10</version>
                <configuration>
                    <contextDirectory>${project.basedir}</contextDirectory>
                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
                    <dockerfile>${project.basedir}/Dockerfile</dockerfile>
                    <repository>${docker.registry}/${docker.image.prefix}/${project.artifactId}</repository>
                    <tag>${project.version}</tag>
                    <buildArgs>
                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

这里有一个比较重要的事情是,你pom.xml里面的 artifactId 对应的名字要和镜像仓库的名字对应起来,当然也可以进行修改,

<!--这里${project.artifactId}配置的就是仓库名字,如果需要修改,请修改这里 -->
<repository>${docker.registry}/${docker.image.prefix}/${project.artifactId}</repository>

2.2 maven的settings.xml文件配置,配置远程docker镜像服务账号密码

 <!-- docker服务器地址配置 begin -->
   <server>
     
     <!-- 远程docker镜像服务器地址,如果不同请修改 -->
     <id>registry.cn-shenzhen.aliyuncs.com</id>
     
     <!-- 账号 -->
     <username>xxx</username>
     
     <!-- 密码,注意此处的密码指的不是阿里云登录密码,容器镜像服务有单独密码 -->
     <password>xxx</password>
   </server>
<!-- docker服务器地址配置 end -->

2.3 docker配置

  • Dockerfile
#依赖jdk8镜像构建
FROM java:8

# 维护者信息
MAINTAINER weidan "2182129257@qq.com"

#配置一个具有持久化功能的目录
VOLUME /tmp

ARG JAR_FILE

#MYSQL主机地址
ENV MYSQL_HOST=127.0.0.1

#MYSQL端口
ENV MYSQL_PORT=3306

#MYSQL账号
ENV MYSQL_USERNAME=root

#MYSQL密码
ENV MYSQL_PASSWORD=123456

#MYSQL访问数据库schema
ENV MYSQL_SCHEMA=pitaya-vistor

#REDIS主机
ENV REDIS_HOST=127.0.0.1

#REDIS端口
ENV REDIS_PORT=6379

#REDIS密码
ENV REDIS_PASSWORD=""

#REDIS数据库序号
ENV REDIS_DB=0


COPY ${JAR_FILE} app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-Denv.mysql.host=${MYSQL_HOST}", "-Denv.mysql.port=${MYSQL_PORT}","-Denv.mysql.username=${MYSQL_USERNAME}","-Denv.mysql.password=${MYSQL_PASSWORD}","-Denv.mysql.schema=${MYSQL_SCHEMA}","-Denv.redis.host=${REDIS_HOST}","-Denv.redis.port=${REDIS_PORT}","-Denv.redis.password=${REDIS_PASSWORD}","-Denv.redis.database=${REDIS_DB}","-jar","/app.jar"]

说明:
为了实现在docker运行镜像的时候可以动态指定运行参数,上面Dockerfile指定了ENV环境变量,例如mysql的链接信息,redis的链接信息等,然后在通过java -jar 参数形式传递到java项目。这样我们的镜像可以不必写死我们的需要改变的配置信息。同时提供一些默认值,我们在运行的时候覆盖我们需要改变的即可!

其实此处也可以指定一些jvm的参数,方便后期jvm调优,如果需要大家可以加上去。

  • .dockerignore
# Ignore everything
**

# Allow files and directories
#这里大家修改为自己的jar的名称,其实也就是上面pom配置的finalname属性即可
!target/xxx.jar
!Dockerfile

这个文件的作用类似与.gitignore,忽略一些文件不打包到镜像,这样即可以减少我们镜像的大小,又可以降低信息透露出去的风险。

2.4 docker-compose

  • docker-compose.yml
version: '3'
services:
  pitaya_vistor_java: #次数也修改成为你自己服务的名字
    image: [Image]:[Tag]
    container_name: [容器名字,可以根据自己的需要指定]
    networks:
      pitaya_network:
        ipv4_address: 172.2.0.100
    ports:
      - 8080:8080
    environment:
      MYSQL_HOST: 172.2.0.10
      MYSQL_PORT: 3306
      MYSQL_USERNAME: [mysql的账号]
      MYSQL_PASSWORD: [mysql的密码]
      MYSQL_SCHEMA:  [链接的数据库名]
      REDIS_HOST: 172.2.0.11
      REDIS_PORT: 6379
      REDIS_PASSWORD: [redis的密码]
      TZ: Asia/Shanghai


networks:
  pitaya_network:
    external: true

该文件主要在部署的时候使用,在镜像制作用不到

2.5 打包制作镜像并且推送到阿里云服务器

mvn clean install package -Dmaven.test.skip=true dockerfile:build dockerfile:push

配置好之后一条命令搞定,是不是很简单!
最大的问题在于要注意细节以及一些名字的对应关系,配置还是很简单的!

3.Vue项目制作镜像

  • 项目结构


    Vue项目结构

    同样的,先列出来需要修改的文件,在项目根目录下添加以下几个文件即可

  • .dockerignore
  • docker-compose.yml(同样制作镜像用不到,部署的时候再使用)
  • Dockerfile
  • nginx.conf

3.1 docker配置

  • .dockerignore
/node_modules
/public
/screenshots
/src
/README.md
!Dockerfile
  • Dockerfile
# 设置基础镜像
FROM nginx

MAINTAINER "weidan <2182129257@qq.com>"

# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
COPY dist/  /usr/share/nginx/html/admin/

#nginx配置文件替换。
COPY nginx.conf /etc/nginx/conf.d/default.conf

#暴露81端口
EXPOSE 81
CMD ["nginx", "-g", "daemon off;"]
  • nginx.conf
server {
    listen 82;
    listen [::]:82;
    charset utf-8;
    access_log off;
    root /usr/share/nginx/html;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }
  
    location = /50x.html {
        root html;
    }
}

3.2 docker-compose

  • docker-compose.yml
version: '3'
services:

  #此处也改为你的容器服务名字
  pitaya_vistor_java:
    image: [Image]:[tag]
    container_name: [配置你的容器名字]
    environment:
      TZ: Asia/Shanghai
    networks:
      pitaya_network:
        ipv4_address: 172.2.0.202
    ports:
      - 82:82
networks:
  pitaya_network:
    external: true    

3.3 打包上传镜像

步骤1:修改api请求路径

#步骤2:打包
cnpm run build

#步骤3:制作镜像,注意修改版本号
docker build -t [image,去阿里云镜像仓库下找]:[tag版本,例如1.0.0] .

#步骤4:登录云服务器(输入两次密码,第一次是电脑密码,第二次是阿里云容器服务的密码)
sudo docker login --username=xxx registry.cn-shenzhen.aliyuncs.com

#步骤5: 推送到云服务器
sudo docker push [image,去阿里云镜像仓库下找]:[tag版本,例如1.0.0] .

4.uni-app 打包h5制作镜像

其实原理同vue打包一样的,只需要修改对应配置信息即可

uni-app项目结构

4.1 docker信息配置

  • .dockerignore
/components
/pages
/static
/utils
/App.vue
/main.js
/manifest.json
/pages.json
/uni.scss
!Dockerfile
  • Doclerfile
# 设置基础镜像
FROM nginx

MAINTAINER "weidan <2182129257@qq.com>"

# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
COPY unpackage/dist/build/h5/  /usr/share/nginx/html/h5/

#nginx配置文件替换。
COPY nginx.conf /etc/nginx/conf.d/default.conf

#暴露81端口
EXPOSE 81
CMD ["nginx", "-g", "daemon off;"]
  • nginx.conf
server {
    listen 81;
    listen [::]:81;
    charset utf-8;
    access_log off;
    root /usr/share/nginx/html;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }
  
    location = /50x.html {
        root html;
    }
}

4.2 docker-compse

version: '3'
services:
  
  #修改成你的容器服务名称
  pitaya_vistor_java:
    image: [image]:[tag]
    container_name: [修改成你的容器服务名称]
    environment:
      TZ: Asia/Shanghai
    networks:
      pitaya_network:
        ipv4_address: 172.2.0.201
    ports:
      - 81:81
networks:
  pitaya_network:
    external: true

4.3 部署上传


步骤1:修改api请求路径

#步骤2:打包
请查看dcloud h5打包

#步骤3:制作镜像,注意修改版本号
docker build -t .....

#步骤4:登录云服务器,密码a开头(输入两次密码,第一次是电脑密码,第二次是阿里云容器服务的密码)
在镜像仓库下可以找到命令

#步骤5: 推送到云服务器
在镜像仓库下可以找到命令

关于如何查找上面的命令


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