利用docker 进行前后端工程镜像制作和容器化运维的配置文件

243 阅读2分钟

参考 华为cse(CloudServiceEngine,slogon是省心运维多语言又开源) github.com/huaweicse/s…

.dockerignore

/node_modules

Host中的settings.xml

 <?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
   <mirrors>
        <mirror>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <mirrorOf>central</mirrorOf>
       </mirror>
   </mirrors>
</settings>

jenkins 的 docker-compose.yml

version: '3'

services:
  jenkins:
    image: jenkins/jenkins:latest
    container_name: cicd-jekins
    ports:
      - 19527:8080
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
      - /root/jenkins/BRIDGE:/SRC

其中/var/run/docker.sock的属性为777

container jenkins 中编译 java11

docker run -it --rm --name my-maven-project -v "/root/jenkins/BRIDGE/":/usr/src/mymaven  -v "$HOME/.m2":/root/.m2  -w /usr/src/mymaven/{projectname} maven:3.6.3-jdk-11  mvn clean package

Dockerfile 之 jdk8

#For springboot project
FROM openjdk:8-jdk-alpine
VOLUME /tmp
MAINTAINER ElonMuscle
#COPY jdk1.8.0_172 jdk1.8.0_172
#

ADD xxx-0.0.1-SNAPSHOT.jar xxx-0.0.1-SNAPSHOT.jar

# env
#ENV JAVA_HOME=/jdk1.8.0_172
#ENV PATH=$JAVA_HOME/bin:$PATH
#ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

EXPOSE 8300

ENTRYPOINT ["java", "-jar", "/xxx.jar"]

Dockerfile 之 jdk11

FROM alpine:latest as packager
RUN apk --no-cache add openjdk11-jdk openjdk11-jmods
ENV JAVA_MINIMAL="/opt/java-minimal"
# build minimal JRE
RUN /usr/lib/jvm/java-11-openjdk/bin/jlink --verbose --add-modules java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument \
    --compress 2 --strip-debug --no-header-files --no-man-pages --release-info="add:IMPLEMENTOR=radistao:IMPLEMENTOR_VERSION=radistao_JRE" \
    --output "$JAVA_MINIMAL"
FROM alpine:latest
ENV JAVA_HOME=/opt/java-minimal
ENV PATH="$PATH:$JAVA_HOME/bin"
COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"
COPY yourapp.jar  app.jar
EXPOSE 80
ENTRYPOINT ["java","-jar","/app.jar"]

Dockerfile 之 frontend

用到了下文中的nginx.conf

#For Vue project
# node镜像
FROM node:alpine  as build-stage
#RUN apk update && apk add yarn python g++ make && rm -rf /var/cache/apk/*
# RUN apk update && apk add  python   make && rm -rf /var/cache/apk/*
# RUN apk --no-cache add --virtual native-deps \
#   g++ gcc libgcc libstdc++ linux-headers make python && \
#   npm install --quiet node-gyp -g &&\
#   npm install --quiet && \
#   apk del native-deps
# 指定接下来的工作路径为/app  - 类似于cd命令
WORKDIR /app
COPY package*.json ./

# # 设置淘宝npm镜像
#RUN npm install -g cnpm --registry=https://registry.npm.taobao.org
#RUN npm config set registry http://registry.npm.taobao.org/
# RUN npm install -g node-pre-gyp@0.10.0
# # 安装依赖
#RUN  cnpm
RUN npm install
# # 拷贝前端项目到app目录下
COPY .  .

# # build app for production with minification
RUN npm run build
# # 打包 - 目的:丢到nginx下跑
# RUN cnpm run build

# 前端项目运行命令
# CMD ["npm","run","start"]


# # ======================== 上:npm打包  下:nginx运行 ========================
# # nginx镜像
# FROM  nginx    as production-stage
 

# # 移除nginx容器的default.conf文件、nginx配置文件
# RUN rm /etc/nginx/conf.d/default.conf
# RUN rm /etc/nginx/nginx.conf
# # # 把主机的nginx.conf文件复制到nginx容器的/etc/nginx文件夹下
# COPY ./nginx.conf /etc/nginx/
# # 拷贝前端vue项目打包后生成的文件到nginx下运行
# COPY --from=build-stage /app/dist  /usr/share/nginx/html

# # # 暴露800端口
# EXPOSE 8400

# # 注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
# #    RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

# # 使用daemon off的方式将nginx运行在前台保证镜像不至于退出
# CMD ["nginx", "-g", "daemon off;"]

nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    keepalive_timeout  65;

    # include /etc/nginx/conf.d/*.conf;
 
    upstream apiservice {
        server 192.168.1.200:80;
    }
 	#upstream frontend {
    #    server 192.168.1.100:80;
    #}

    server {
        listen       8400;
        charset utf-8;
 

        # start ---------------------------------------------------------------------------------------------

        location / {
           root   /usr/share/nginx/html;
           try_files $uri $uri/ /index.html;
        }        
        #location / {
        #    /usr/share/nginx/html;
        #    index index.html;
        # }

        location /web/ {
        #    # autoindex on;      
        #    # alias  /usr/share/nginx/html;
        #    # index index.html;
        	proxy_pass http://frontend/;   # 注意和 proxy_pass http://frontend; 的区别        
        }
   

        location ~^/api/[^\/]+/[^\/]+ {
        rewrite ^(/api)(.*)$ $2 break;
        proxy_pass http://apiservice;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       }
        # end ---------------------------------------------------------------------------------------------

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
   }

} 

部署本地registry仓库

docker run -d -p 5000:5000 --restart=always --name registry -v /mnt/docker_imgs:/var/lib/registry registry:latest 修改仓库通讯方式https为http 增加deamon.json文件配置

$ vim /etc/docker/daemon.json
{
    "insecure-registries":["xxx.xxx.xxx.xxx:5000"]
}

重启服务

$ systemctl daemon-reload
$ systemctl restart docker

docker-compose.yml

用于调用镜像制作和容器运行的管理脚本

version: "3"
services:
  xxx:
    build:
      dockerfile: Dockerfile
      context: .
    image: xxx
    #container_name: xxx
    # restart: always
    # build: .  
    environment:
      TZ: Asia/Shanghai
    ports:
      - "8400:8400"

参考:

  1. Nginx 入门教程-#proxy_pass url 反向代理的坑
  2. Github-huaweicse/servicecomb-practices