1. 环境搭建
1.1. Centos7网络问题
Centos7 废弃了ifconfig,采用ip addr
Centos7.5报name or service not known错误解决方案,以下标红的注意。
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=fed21190-4d75-4b64-acfb-3da287e05a3d
DEVICE=ens33
ONBOOT=yes
IPADDR=172.19.20.208
NETMASK=255.255.0.0
GATWAY=172.19.0.1
DNS1=8.8.8.8
DNS2=114.114.114.114
最后别忘了重启网络服务
systemctl restart network
2. Docker安装
- 确保yum更新到最新的
yum update
- 如果之前安装了,需要移除
yum remove docker docker-common docker-selinux docker-engine
- 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm
- 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- Docker-ce与docker-io、docker-ee的区别
-
Docker-ce是docker公司维护的开源项目 (社区版)
-
Docker-ee是docker公司维护的闭源项目 (商业版)
-
Docker-io是以前的早期版本,版本号是1.*
- 安装docker
yum install docker-ce
- 启动docker
systemctl start docker
systemctl enable docker
如果不启动,则提示无法连接docker server
- 验证docker安装是否成功
Client:
Version: 18.09.6
API version: 1.39
Go version: go1.10.8
Git commit: 481bc77156
Built: Sat May 4 02:34:58 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.6
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: 481bc77
Built: Sat May 4 02:02:43 2019
OS/Arch: linux/amd64
Experimental: false
3. 镜像、容器、仓库
3.1. 介绍
3.1.1. 镜像
操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker设计时,就充分利用Union FS的技术,将其设计为分层存储的架构。 镜像实际是由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
3.1.2. 容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照Docker最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新run,数据却不会丢失。
3.2. 常用命令
- 搜索镜像
docker search <image> #在docker index中搜索image
--automated=false #仅显示自动创建的镜像
--no-trunc=false #输出信息不截断显示
--s 0 #指定仅显示评价为指定星级的镜像
- 拉取镜像
docker pull tomcat
- 移除镜像
docker rmi <image id
3.3. 修改镜像仓库
阿里云创建镜像仓库
[root@localhost software]# vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://li05jkd4.mirror.aliyuncs.com"]
}
[root@localhost software]# systemctl daemon-reload
[root@localhost software]# systemctl restart docker
3.4. 使用Tomcat镜像
3.4.1. 查询镜像
[root@localhost software]# docker search tomcat
3.4.2. 拉取镜像
[root@localhost software]# docker pull tomcat
3.4.3. 查看所有镜像
[root@localhost software]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 3639174793ba 32 hours ago 463MB
java latest d23bdf5b1b1b 2 years ago 643MB
3.4.4. 启动tomcat镜像
docker run -d -p 8080:8080 tomca
注:前者是外围访问端口:后者是容器内部端口
如下命令可后台启动tomcat
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
–name : 容器名称
如果要出现控制台
docker run –i –t –p 8080:8080 tomca
3.4.5. 部署war
3.4.5.1. 上传war包
[root@localhost software]# ll
total 32680
-rw-r--r--. 1 root root 33458948 Dec 12 20:56 aggregation-server.war
-rw-r--r--. 1 root root 142 May 17 05:08 Dockerfile
3.4.5.2. 创建并编辑Dockerfile
#镜像
from tomcat
#作者
MAINTAINER meiquan_yang@fp-inc.com
#删除webapps下的东西
RUN rm -rf /usr/local/tomcat/webapps/*
#放到tomcat的webapps下
COPY aggregation-server.war /usr/local/tomcat/webapps
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
3.4.5.3. 生成镜像
[root@localhost software]# docker build -t aggregation-server:v1 .
#注意最后一个点
3.4.5.4. 启动新的镜像
[root@localhost software]# docker run -i -t -p 8080:8080 aggregation-server:v
访问,说明部署成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WvndQeRx-1578553195567)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image002.jpg)]
3.5. 查看容器内部
[root@localhost software]# docker exec -it 2daa /bin/bas
#其中2daa是容器id
#退出用 exit
root@1049e6231c4f:/usr# exit
exit
[root@localhost software]#
3.6. 删除镜像
#移除镜像
docker rmi <image id>
有可能会提示
(must be forced) - image is being used by stopped container 2daa084f2574
说明还有该镜像的实例,即使是已经停止的容器,也要删掉才能删除镜像
3.7. 删除容器
杀死所有正在运行中的容器
docker kill $(docker ps -a -q)
删除所有已经停止的容器
docker rm $(docker ps -a -q)
3.8. 终止容器
docker stop $CONTAINER_ID
4. Dockerfile
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s14La51j-1578553195573)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image003.png)]
4.1. From
一般镜像都要基于某个已有的镜像,例如springBoot可以基于java:8。如果不基于任何镜像,则From Scratch.
5. 安装gitlab-runner
5.1. 搜索
[root@localhost meiquan_yang]# docker search gitlab-runner
5.2. 下载
[root@localhost meiquan_yang]# docker pull gitlab/gitlab-runner
5.3. 运行
[root@localhost meiquan_yang]# docker run -d --name gitlab-runner --restart always gitlab/gitlab-runner
–挂载目录
[root@VM_0_16_centos springboot]# docker run -d --net host --name gitlab-runner --restart always -v /root/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner
5.4. 注册
标红加粗的地方在git上的setting/CI/CD/Runners下面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-meWM2Jld-1578553195579)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image004.png)]
[root@localhost meiquan_yang]# docker exec -it gitlab-runner gitlab-ci-multi-runner register
Runtime platform arch=amd64 os=linux pid=20 revision=ac2a293c version=11.11.2
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://git.fpi-inc.site/
Please enter the gitlab-ci token for this runner:
QZM97iNWytZShtp18vfJ
Please enter the gitlab-ci description for this runner:
Please enter the gitlab-ci tags for this runner (comma separated):
Registering runner… succeeded runner=QZM97iNW
Please enter the executor: docker, docker-ssh, parallels, shell, kubernetes, ssh, virtualbox, docker+machine, docker-ssh+machine:
docker
Please enter the default Docker image (e.g. ruby:2.1):
tomcat
Runner registered successfully. Feel free to start it, but if it’s running already the config should be automatically reloaded!
平台显示结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lI8fe1lw-1578553195584)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image005.png)]
可以在etc/gitlab-runner/config.toml生成了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0o8ZJSLr-1578553195592)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image007.png)]
1、 volumes = ["/var/run/docker.sock:/var/run/docker.sock", “/cache”,"/root/m2:/root/.m2"]中增加了/root/m2:/root/.m2,避免maven每次都下载jar包,提高效率。
2、 pull_policy = “if-not-present” 避免docker 镜像每次都pull
6. 编写.gitalb-ci.yml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8FyIs1pa-1578553195595)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image009.png)]
通过提交并合并到master代码,可以看到流水线pipelines几个阶段都执行成功了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DJ6nrt8w-1578553195599)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image011.jpg)]
可以进去看具体情况:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2QVcKdDX-1578553195604)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image013.jpg)]
表明我们的脚本确实是执行成功了。
接下来通过dockerfile来构建镜像并用gitlab-ci.yml来运行docker容器。
7. 腾讯云服务器
7.1. 开通端口
-
https://console.cloud.tencent.com/cvm/securitygroup 新增安全组,配置规则
-
https://console.cloud.tencent.com/cvm/securitygroup/detail/sg-r4kv41xg?rid=4&tab=instances 关联实例
8. 完成Docker自动镜像上传
目前为止已完成了基于gitlab-ci.yml的自动运行打包、测试、及配合Dockerfile生成镜像并上传仓库。
整个步骤跟以前相比做了如下修改
8.1. 修改gitlab-runner
在config.toml中新增了如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A3gQTYAn-1578553195609)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image015.jpg)]
此配置的详细意义还没有来得及了解,但基本上就是为了Docker Daemon守护进程的通信用到的。
完整的gitlab-runner的config.toml配置如下:
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "gitlab-runner-0916"
url = "https://git.fpi-inc.site/"
token = "UwBNDa7ToP1P6qUc98fT"
executor = "docker"
[runners.custom_build_dir]
[runners.docker]
tls_verify = false
image = "java:8"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache","/root/gitlab-runner/.m2:/root/.m2","/var/run/docker.sock:/var/run/docker.sock"]
pull_policy = "if-not-present"
shm_size = 0
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
8.2. 编写gitlab-ci.yml
variables:
# NAMESPACE:用来指明该项目构建的镜像上传到哪个命名空间中
# 使用了命名空间后,项目最终的镜像地址就是 $LOCAL_REPERTORY/$NAMESPACE/$CI_PROJECT_NAME:$TAG
# 使用命名空间的好处是可以将同一个项目的各种镜像放到一起集中管理,并且便于识别
NAMESPACE: ***
# KUBERNETES_NAMESPACE: 应用在kubernetes集群中的命名空间
KUBERNETES_NAMESPACE: ***
# LOCAL_REPERTORY: 本地docker仓库地址,用户名
LOCAL_REPERTORY: "***"
LOCAL_REPERTORY_USERNAME: admin
# REMOTE_REPERTORY:阿里云docker仓库地址
REMOTE_REPERTORY: "***"
REMOTE_REPERTORY_USERNAME: ***
REMOTE_REPERTORY_PASSWORD: ***
# KUBERNETES_MASTER_NODE_IP: kubernetes集群的master ip,用来管理应用服务
# KUBERNETES_MASTER_NODE_IP: 192.168.1.250
# 镜像的name和tag,tag以PIPELINE_ID命名
IMAGE_TAG_PIPELINE_ID: "$NAMESPACE/$CI_PROJECT_NAME:$CI_PIPELINE_ID"
# 镜像的name和tag,tag以COMMIT_SHA命名
IMAGE_TAG_COMMIT_SHA: "$NAMESPACE/$CI_PROJECT_NAME:$CI_COMMIT_SHA"
# 镜像的name和tag,tag以COMMIT_TAG命名
IMAGE_TAG_COMMIT_TAG: "$NAMESPACE/$CI_PROJECT_NAME:$CI_COMMIT_TAG"
# sonarqube token
SONAR_LOGIN_TOKEN: 997bf98bf075a25f7b04f6506f43e7b6787a6e12
TEST_DEV_KUBERNETES_NAMESPACE: ipes-test
stages:
- pre_build
- build
- push
- deploy
build_docker_images:
stage: build
image: docker:stable
before_script: []
script:
- echo "$CI_COMMIT_SHA" > src/main/resources/version #添加版本信息
- sed -i "s/ROOT/$CI_PROJECT_NAME/" Dockerfile
- docker build -t $REMOTE_REPERTORY/$IMAGE_TAG_PIPELINE_ID .
- docker tag $REMOTE_REPERTORY/$IMAGE_TAG_PIPELINE_ID $REMOTE_REPERTORY/$IMAGE_TAG_COMMIT_SHA
only:
- branches #所有分支触发push时都需要构建
except:
- tags #通常是对已经测试通过的镜像打tag,所以不需要再次编译镜像
sonar_preview:
stage: pre_build
image: $REMOTE_REPERTORY/library/maven:3.5.4-local
#before_script: []
script: >
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -U -Dmaven.test.failure.ignore=true
mvn --batch-mode verify sonar:sonar
-Dsonar.host.url=http://sonarqube.fpi-inc.site
-Dsonar.login=$SONAR_LOGIN_TOKEN
-Dsonar.analysis.mode=preview
-Dsonar.gitlab.project_id=$CI_PROJECT_ID
-Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA
-Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME
except:
- tags
sonar_analyze:
stage: pre_build
image: $REMOTE_REPERTORY/library/maven:3.5.4-local
script: >
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dmaven.test.failure.ignore=true
mvn --batch-mode verify sonar:sonar
-Dsonar.host.url=http://sonarqube.fpi-inc.site
-Dsonar.login=$SONAR_LOGIN_TOKEN
-Dsonar.issuesReport.html.enable=true
-Dsonar.preview.excludePlugins=issueassign,scmstats
only:
- master
push_docker_images_to_remote_repertory:
stage: push
image: docker:stable
script:
- docker login -u $REMOTE_REPERTORY_USERNAME -p $REMOTE_REPERTORY_PASSWORD http://$REMOTE_REPERTORY
- docker push $REMOTE_REPERTORY/$IMAGE_TAG_PIPELINE_ID
- docker push $REMOTE_REPERTORY/$IMAGE_TAG_COMMIT_SHA
only:
- master
- /^hotfix-.*$/
env_deploy:
stage: deploy
image: roffe/kubectl:latest
script:
- cp -r .kube /root
- kubectl set image deployment.apps/$CI_PROJECT_NAME $CI_PROJECT_NAME=$REMOTE_REPERTORY/$IMAGE_TAG_PIPELINE_ID -n $KUBERNETES_NAMESPACE
only:
- master
- /^hotfix-.*$/
8.3. Dockerfile
#FROM docker-lh.fpi-inc.site/fpi/maven:3.5.4-local AS BUILD
FROM maven:3-jdk-8 as BUILD
WORKDIR /build/
COPY . /build/
RUN mvn clean install
FROM java:8
COPY --from=BUILD /build/target/ipes-test-server.jar /ipes-test-server.jar
EXPOSE 80
ENTRYPOINT ["java","-jar","/ipes-test-server.jar"]
8.4. 触发pipeline
通过向主干合并代码,触发pipeline执行构建任务。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7HVCUN4C-1578553195615)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image017.jpg)]
通过查看github镜像仓库网站,可以发现,镜像已经制作并上传上去了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mkIZw2Hm-1578553195619)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image019.jpg)]
8.5. 拉取镜像并运行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kY4rAD6n-1578553195624)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image021.jpg)]
直接访问http://49.235.180.166/ipes-test-server/index
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wkxB1ly6-1578553195626)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image023.jpg)]
8.6. 下一步工作
通过gitlab-ci.yml将8.5自动化。
9. 自动化部署
9.1. 拉取、运行
² 如果直接在gitlab-runner宿主机上运行,则直接利用docker命令拉取运行即可。
² 如果不想在gitlab-runner宿主机上运行,则需要通过ssh来指定远程服务器运行。
以下是在gitlab-runner宿主机上运行的情况:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvShp6jT-1578553195630)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\02\clip_image025.png)]
9.2. 关于maven依赖
每次构建镜像的时候都会下载依赖,非常耗时间,可以通过
cache:
paths:
- /root/.m2/repository
来缓存依赖