一、Docker相关知识

1、Docker 包括三个基本概念:

镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看作一个代码控制中心,用来保存镜像。

私有仓库和公共仓库
公共仓库地址

https://registry.hub.docker.com/

2、镜像介绍

镜像查看

[root@node5 ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
jenkinsci/blueocean   latest              532869e91ca2        8 weeks ago         563MB
star7th/showdoc       latest              769c823006f3        2 months ago        384MB
ubuntu                latest              775349758637        2 months ago        64.2MB
openjdk               8-jdk-alpine        a3562aa0b991        8 months ago        105MB
node                  6-alpine            dfc29bfa7d41        9 months ago        56.1MB

镜像查找

[root@node5 ~]# docker search java
NAME                                     DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
node                                     Node.js is a JavaScript-based platform for s…   8302                [OK]
tomcat                                   Apache Tomcat is an open source implementati…   2614                [OK]
openjdk                                  OpenJDK is an open-source implementation of …   2072                [OK]
java                                     Java is a concurrent, class-based, and objec…   1976                [OK]
ghost                                    Ghost is a free and open source blogging pla…   1085                [OK]
jetty                                    Jetty provides a Web server and javax.servle…   321                 [OK]
groovy                                   Apache Groovy is a multi-faceted language fo…   82                  [OK]

拉取镜像,默认下载latest最新版本

[root@node5 ~]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
146bd6a88618: Pull complete
9935d0c62ace: Pull complete
db0efb86e806: Pull complete
e705a4c4fd31: Pull complete
3d3bf7f7e874: Pull complete
49371c5b9ff6: Pull complete
e7873a7ca0fd: Pull complete
925a95344b57: Pull complete
0448a86618da: Pull complete
71917b8caada: Pull complete
Digest: sha256:f8edbcba564eca1d3d6d5d73d993a661801b5a7c6542dff44bdab57d0bccc567
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest

拉取获取,下载指定版本

docker pull tomcat:8.5.50-jdk8-adoptopenjdk-openj9

删除镜像

[root@node5 ~]# docker rmi tomcat
Untagged: tomcat:latest
Untagged: tomcat@sha256:f8edbcba564eca1d3d6d5d73d993a661801b5a7c6542dff44bdab57d0bccc567
Deleted: sha256:ed94f55483b8ee076a1ee5c395a1337e9743699e73f7d40d22048ef5dc3fc7ea
Deleted: sha256:288f7f8993a3f112b43f23e6f0bb7c8ff92cb4e1d6aaf97c282824ff15222641
Deleted: sha256:4a618b4ff1b1178b2f02ffe63072a5c1a10d5e24b82fffecb6f73afcbe8bbffc
Deleted: sha256:0543b39fecf8a7a33251b0ec42b364897a55018d30f115553c89ee8d8f7c5612
Deleted: sha256:0a4afc1cab55dd0056a106cd20d803a23107157b20f4ed22a5d2c3909c0caf6c
Deleted: sha256:311b0879faaf75ffd13399961aa49cabaf6d81fdbd01df2d5a48e7197148d809
Deleted: sha256:6fb055c9e37568db5de072a620da74188b8405cd8697acebe226ade122a7367b
Deleted: sha256:05340d226ca3ff0041553d3d732257a8f3182e11612e47ac15cde17fa8a5e568
Deleted: sha256:9cbb0103d6c58071dae6b3b5e5a471e954785875803067ab570008cd50e3db13
Deleted: sha256:f7c732c81f969b4677ef4312ca2f70e5e3368e5e3a2244809d064a9533e0576d
Deleted: sha256:ebb9ae013834b54e76c8d7dfde0ca9018f6bb3495740356a8f1dc655a8552130

创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1、从已经创建的容器中更新镜像,并且提交这个镜像
2、使用 Dockerfile 指令来创建一个新的镜像

IDEA将项目docker化,详情参见本章四、拓展一节。
Dockerfile
脚本示例

FROM openjdk:8-jdk-alpine
ADD *.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

3、容器介绍

启动容器(后台模式)

使用以下命令创建一个以进程方式运行的容器

[root@node5 ~]# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
ce41e1a8fa2669ca1e9fdb1350c2efbb7ab3663971c7046321c97ed843989905

在输出中,我们没有看到期望的 “hello world”,而是一串长字符
ce41e1a8fa2669ca1e9fdb1350c2efbb7ab3663971c7046321c97ed843989905
这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。
首先,我们需要确认容器有在运行,可以通过 docker ps 来查看:

[root@node5 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                                     NAMES
ce41e1a8fa26        ubuntu:15.10        "/bin/sh -c 'while t…"   About a minute ago   Up About a minute

输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
Created(已创建)
Restarting(重启中)
Running(Up)(运行中)
Removing(迁移中)
Paused(暂停)
Exited(停止)
Dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
在容器内使用 docker logs 命令,查看容器内的标准输出:

[root@node5 ~]# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
ce41e1a8fa2669ca1e9fdb1350c2efbb7ab3663971c7046321c97ed843989905
[root@node5 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                                     NAMES
ce41e1a8fa26        ubuntu:15.10        "/bin/sh -c 'while t…"   About a minute ago   Up About a minute                                                     festive_heyrovsky
[root@node5 ~]# docker logs ce41e1a8fa26
hello world
hello world
hello world
hello world

进入容器

[root@node5 ~]# docker run -it ubuntu /bin/bash
root@a6e699a9c423:/# pwd
/
root@a6e699a9c423:/# cd root/
root@a6e699a9c423:~# ll
total 8
drwx------ 2 root root   37 Oct 29 21:25 ./
drwxr-xr-x 1 root root    6 Jan 17 07:52 ../
-rw-r--r-- 1 root root 3106 Apr  9  2018 .bashrc
-rw-r--r-- 1 root root  148 Aug 17  2015 .profile
root@a6e699a9c423:~# exit
exit
[root@node5 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                                     NAMES
a6e699a9c423        ubuntu              "/bin/bash"              39 seconds ago      Exited (0) 22 seconds ago                                             jolly_tharp

在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

docker attach(exit后容器停止)

[root@node5 ~]# docker run -itd ubuntu /bin/bash
94bafa4fc167db8c65a37b6521ff581abe72405f10bc4543206ab3d30402c343
[root@node5 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                     NAMES
94bafa4fc167        ubuntu              "/bin/bash"              13 seconds ago      Up 13 seconds                                                        clever_lehmann
[root@node5 ~]# docker attach 94bafa4fc167
root@94bafa4fc167:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@94bafa4fc167:/# exit
exit
[root@node5 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                     NAMES
94bafa4fc167        ubuntu              "/bin/bash"              50 seconds ago      Exited (0) 6 seconds ago                                             clever_lehmann

docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。

exec 命令

下面演示了使用 docker exec 命令。

[root@node5 ~]# docker run -itd ubuntu /bin/bash
4adec8c94f498c41b1e19f7b1c107e6c63b2aed66e4088fe2be4b70117e63315
[root@node5 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                     NAMES
4adec8c94f49        ubuntu              "/bin/bash"              11 seconds ago      Up 10 seconds                                                        heuristic_chandrasekhar
[root@node5 ~]# docker exec -it 4adec8c94f49 /bin/bash
root@4adec8c94f49:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@4adec8c94f49:/# exit
exit
[root@node5 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                     PORTS                                     NAMES
4adec8c94f49        ubuntu              "/bin/bash"              About a minute ago   Up About a minute                                                    heuristic_chandrasekhar

可以发现,即使exit以后,执行docker -ps 依然能够看到ubuntu的容器是Up状态。

options说明

-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端

注意: 如果从这个容器退出,不会导致容器的停止,这就是为什么推荐大家使用 docker exec 的原因。
更多参数说明请使用 docker exec --help 命令查看。

停止容器

我们使用 docker stop 命令来停止容器:
通过 docker ps 查看,容器已经停止工作:

[root@node5 ~]# docker run -d ubuntu:latest /bin/sh -c "while true; do echo hello world; sleep 5; done"
a2d683003ccf84543c27c961a209a86d2a3076481b435cb9e31ecdad590eb6fd
[root@node5 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                                     NAMES
a2d683003ccf        ubuntu:latest       "/bin/sh -c 'while t…"   8 seconds ago       Up 7 seconds                                                          tender_saha
[root@node5 ~]# docker stop a2d683003ccf
a2d683003ccf
[root@node5 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS                                     NAMES
a2d683003ccf        ubuntu:latest       "/bin/sh -c 'while t…"   40 seconds ago      Exited (137) 7 seconds ago                                             tender_saha

可以看到容器状态已经从Up变为Exited。

删除容器

删除容器使用 docker rm 命令:

[root@node5 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                                     NAMES
a2d683003ccf        ubuntu:latest       "/bin/sh -c 'while t…"   2 hours ago         Exited (137) 2 hours ago                                              tender_saha
[root@node5 ~]# docker rm -f a2d683003ccf
a2d683003ccf

下面的命令可以清理掉所有处于终止状态的容器。

[root@node5 ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
74e235219605c7c7fd622950583c4cd9e9fdf632e776e098f7d80220fbeee5d9Total reclaimed space: 32.77kB

二,Jenkins相关知识

1、概念介绍

Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。

2、两种运行方式

1、Docker

前面介绍了Docker的相关操作,Jenkins也支持Docker的运行,所以介绍第一种Jenkins的运行方式。

docker run -u root -d -p 8083:8080 -p 50000:50000  -v /var/run/docker.sock:/var/run/docker.sock  -v /var/jenkins_home:/var/jenkins_home jenkinsci/blueocean

2、war包

Jenkins提供WAR文件的运行,获取Jenkins的war包可以到如下地址:

http://mirrors.jenkins.io/war-stable/

最新版的Jenkins的部署文件地址如下,建议使用最新版的war文件部署,因为老版本的部署文件或者DockerLTS版本的Jenkins部署后,会存在一个自动杀死衍生进程的大坑,具体关于自动杀死衍生进程的问题我是在Java -jar 部署最新版的war包解决的,意见供参考:

http://mirrors.jenkins.io/war-stable/latest/jenkins.war

java -Dhudson.util.ProcessTree.disable=true -jar Jenkins.war --httpPort=8083

使用-Dhudson.util.ProcessTree.disable=true在通过war包启动Jenkins,可以避免Jenkins自动杀死衍生进程的问题,详情可以参考如下链接:

https://wiki.jenkins.io/display/JENKINS/ProcessTreeKiller

3、Jenkinsfile介绍

①两种语法方式

声明式,pipeline
Jenkinsfile (Declarative Pipeline)
pipeline {agent anystages {stage('Build') {steps {echo 'Building..'}}stage('Test') {steps {echo 'Testing..'}}stage('Deploy') {steps {echo 'Deploying....'}}}
}
脚本式,node
Jenkinsfile (Scripted Pipeline)
node {stage('Build') {echo 'Building....'}stage('Test') {echo 'Testing....'}stage('Deploy') {echo 'Deploying....'}
}

②在流水线中使用Docker

声明式
Jenkinsfile (Declarative Pipeline)
pipeline {agent {docker { image 'node:7-alpine' }}stages {stage('Test') {steps {sh 'node --version'}}}
}
脚本式
Jenkinsfile (Scripted Pipeline)
node {/* Requires the Docker Pipeline plugin to be installed */docker.image('node:7-alpine').inside {stage('Test') {sh 'node --version'}}
}

三,Jenkins+docker实际应用举例

脚本

node {/* Requires the Docker Pipeline plugin to be installed */stage('Package') {checkout scmdocker.image('maven:3-alpine').inside('-v $HOME/.m2:/root/.m2') {sh 'mvn clean -DskipTests=true package '}}stage('Build') {withEnv(['JENKINS_NODE_COOKIE=dontkillme','BUILD_ID=dontkillme']) {sh '''pid=`ps -ef|grep projectName-0.0.1-SNAPSHOT.jar |grep -v grep|awk '{print $2}'`if [ "$pid" ]; thenkill -9 $pidfinohup java -jar ./src/main/docker/projectName-0.0.1-SNAPSHOT.jar &'''}}
}

Jenkins管理页面


四、拓展

1、Jenkins部署自动升级build版本号

2、docker私有仓库的搭建

3、Dockerfile

什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
使用 Dockerfile 定制镜像
这里仅讲解如何运行 Dockerfile 文件来定制一个镜像,具体 Dockerfile 文件内指令详解,将在下一节中介绍,这里你只要知道构建的流程即可。
1、下面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)
在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:

FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

2、FROM 和 RUN 指令的作用
FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:
RUN <命令行命令># <命令行命令> 等同于,在终端操作的 shell 命令。
exec 格式:
RUN [“可执行文件”, “参数1”, “参数2”]# 例如:# RUN ["./test.php", “dev”, “offline”] 等价于 RUN ./test.php dev offline
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

FROM centos
RUN yum install wget \&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \&& tar -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
开始构建镜像
在 Dockerfile 文件的存放目录下,执行构建动作。
以下示例,通过目录下的 Dockerfile 构建一个 nginx:test(镜像名称:镜像标签)。
注:最后的 . 代表本次执行的上下文路径,下一节会介绍。

$ docker build -t nginx:test .

以上显示,说明已经构建成功。
上下文路径
上一节中,有提到指令最后一个 . 是上下文路径,那么什么是上下文路劲呢?

$ docker build -t nginx:test .

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
指令详解
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:
COPY [–chown=:] <源路径1>… <目标路径>
COPY [–chown=:] ["<源路径1>",… “<目标路径>”]
[–chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
ADD
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
格式:
CMD <shell 命令>
CMD ["<可执行文件或命令>","","",…]
CMD ["","",…] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTRYPOINT ["","","",…]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
示例:
假设已通过 Dockerfile 构建了 nginx:test 镜像:
FROM nginx
ENTRYPOINT [“nginx”, “-c”] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
1、不传参运行
$ docker run nginx:test
容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
2、传参运行
$ docker run nginx:test -c /etc/nginx/new.conf
容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
nginx -c /etc/nginx/new.conf
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
格式:
ENV
ENV = =…
以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 NODEVERSION引用:ENVNODEVERSION7.2.0RUNcurl−SLO"https://nodejs.org/dist/vNODE_VERSION 引用: ENV NODE_VERSION 7.2.0 RUN curl -SLO "https://nodejs.org/dist/vNODEV​ERSION引用:ENVNODEV​ERSION7.2.0RUNcurl−SLO"https://nodejs.org/dist/vNODE_VERSION/node-vKaTeX parse error: Undefined control sequence: \ at position 32: …ux-x64.tar.xz" \̲ ̲ && curl -SLO …NODE_VERSION/SHASUMS256.txt.asc"
ARG
构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
格式:
ARG <参数名>[=<默认值>]
VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。
格式:
VOLUME ["<路径1>", “<路径2>”…]
VOLUME <路径>
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
EXPOSE
仅仅只是声明端口。
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式:
EXPOSE <端口1> [<端口2>…]
WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
格式:
WORKDIR <工作目录路径>
USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
格式:
USER <用户名>[:<用户组>]
HEALTHCHECK
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
格式:
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
ONBUILD
用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
格式:
ONBUILD <其它指令>

4、在IDEA将项目docker化

创建Spring Boot项目,觉得比较重要,需要注意的地方在这里注明一下:

1、配置pom文件

需要在项目

<!-- 添加项目docker化插件-->
<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.0.0</version><configuration><dockerDirectory>src/main/docker</dockerDirectory><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration>
</plugin>
<plugin><artifactId>maven-antrun-plugin</artifactId><executions><execution><phase>package</phase><configuration><tasks><copy todir="src/main/docker" file="target/${project.artifactId}-${project.version}.${project.packaging}"></copy></tasks></configuration><goals><goal>run</goal></goals></execution></executions>
</plugin>

2、在src/main目录下创建docker目录,并创建Dockerfile文件

FROM openjdk:8-jdk-alpine
ADD *.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

3、在resource目录下创建application.properties文件

logging.config=classpath:logback.xml
logging.path=/home/developer/app/logs/
server.port=8990

参考文件

1、https://wiki.jenkins.io/display/JENKINS/ProcessTreeKiller
2、https://jenkins.io/zh/doc/
3、https://www.runoob.com/docker/docker-tutorial.html
4、https://registry.hub.docker.com/

Docker和Jenkins构建项目总结相关推荐

  1. Jenkins构建项目时报错“message“:“Error processing tar file(exit status 1): write/xxx/no space left on device

    文章目录 推荐文章 问题描述 原因分析: 解决方案: 1.查看磁盘占用情况 2.删除没有在用的镜像和容器 3.查找当前目录每个文件夹大小 推荐文章 Jenkins整合SpringCloud+GitLa ...

  2. Gitlab自动触发Jenkins构建项目

    Gitlab自动触发Jenkins构建项目 一.前提 Gitlab已安装配置好. Jenkins已安装Gitlab plugin. 二.配置jenkins中Job 1.勾选触发器下的gitlab触发器 ...

  3. Jenkins构建项目的时候出现构建不稳定异常UNSTABLE

    Jenkins构建项目的时候出现构建不稳定异常UNSTABLE 参考文章: (1)Jenkins构建项目的时候出现构建不稳定异常UNSTABLE (2)https://www.cnblogs.com/ ...

  4. jenkins构建项目配置及推送阿里云镜像仓库

    使用阿里云的k8s,更新一个项目需要如下步骤: 1.先更新代码 2.再将代码打包生成一个docker镜像,推送到阿里云镜像仓库(私有的) 3.在阿里云上使用新的镜像新启一个docker,并把老的doc ...

  5. Docker 搭建 Jenkins 流水线项目配置

    本篇介绍 Jenkins 流水线项目的配置及流水线脚本语法规则.至于 Jenkins 的安装及其它配置,我之前写过一篇文章可以查看. https://www.yuque.com/testpu/pro/ ...

  6. jenkins构建项目报错:java:[17,37] package xx.xx.xxx does not exist

    场景描述 今天遇到了一个很奇怪的问题,在IDEA运行正常的项目,发布到jenkins就会报错: [ERROR] COMPILATION ERROR : [INFO] ----------------- ...

  7. jenkins构建项目时跳过单元测试

    最近构建项目时突然构建失败,查看日志发现构建的时候就启动了项目,而且明明是构建测试环境的项目,日志却显示启动环境是开发环境,思前想后发现之所以构建的时候就启动了是因为跑了单元测试的原因,因此需要在打包 ...

  8. 基于k8s、docker、jenkins构建springboot服务

    环境准备 server-1 k8s-master Centos7 ip地址10.12.5.110server-2 k8s-node Centos7 ip地址10.12.5.115 两台服务执行如下命令 ...

  9. Jenkins构建项目poll SCM参数怎么配置

    触发项目: Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作.如下图配置: /5 * * * (每5分钟检查一次源码变化) ...

  10. Jenkins构建项目,JAVA_HOME is not defined correctly

    在Jenkins的界面中,也要配置Java环境 https://www.cnblogs.com/amy-2013/p/6347221.html

最新文章

  1. Mahout协同推荐简单实例
  2. 微软推出Python入门课,登上GitHub趋势榜第一(附视频)
  3. SQL Server 游标的使用示例
  4. 软考考前注意事项及答题技巧
  5. 【通俗易懂】层次聚类算法的原理及实现
  6. mysql什么隔离级别最好_面试必问的 Mysql 四种隔离级别,看完吊打面试官
  7. 5月18发布会,这次TDSQL又有什么大动作?
  8. 体验 Orbeon form PE 版本提供的 JavaScript Embedding API
  9. Difference: throw or throw ex?
  10. python 添加数据库表_通过时间表(Python库)简化复杂的计划
  11. 欣赏你的孩子(ZT)
  12. 【Python-3.5】Pygal模拟骰子点数,分析结果可视化
  13. RegExp-1 【转义符号与字符、正则基础、修饰/元字符】
  14. 美国TOP100大学优势专业位置分布!长篇吐血整理!
  15. C语言程序设计(2020)编程题答案——第14章结构体、共用体和用户定义类型
  16. 【JavaScript笔记 · 基础篇(五)】Array全家桶(引用数据类型中的数组 / Array对象 / Array.prototype)
  17. 菜孔孔学python--集合
  18. python合并两个列表并去重_python合并多个txt文件
  19. 向量点乘相关公式推导及 几何解释
  20. STM32HAL库学习之路(八):MG90S舵机应用

热门文章

  1. linux tar.7z如何解压,Linux下解压:tar、rar、7z命令简单易懂的教程(含实例)
  2. Kaggle Tweet Sentiment Extraction竞赛
  3. column xxx is of type integer but expression is of type character varying。String的成员变量存到int的数据库列 报错
  4. 第三章(第一部分) 月夜猫の魅 友谊的决裂
  5. 测试数据科学家聚类技术的40个问题(附答案和分析)
  6. Ubuntu上安装Firefox浏览器
  7. V2X车联网-学习整理笔记
  8. 新版MacBookPro风扇狂转的问题
  9. Android Studio 搭建微信界面
  10. 代码设置margintop_如何通过代码设置TextView的Margin参数?