Docker搭建与使用(结合gitlab-ci)

前言

这两天对Docker进行从零部署,就是为了能够玩一玩devOps,现在将部署的过程既遇到的一些问题进行记录。

PS: 纯为自己兴趣而学,在公司会被认为不务正业。

服务器安装Docker

服务器安装docker

1
2
yum -y install docker-io
service docker start

 

我这边的服务器是Centos系统,执行以上命令就会把docker安装并启动,至于测试docker是否安装成功,可以参考链接里提供的方法,运行hello-world镜像测试即可。

Docker跟随服务器自启动

1
systemctl enable docker

Docker私服搭建

1
docker run -d -e SETTINGS_FLAVOR=dev -e STORAGE_PATH=/tmp/registry -v /opt/data/registry:/tmp/registry  -p 5000:5000 registry

这个搭建方式,其实就是通过docker私服的镜像进行搭建的,端口映射为5000

但是这个搭建好,是有一个问题的,想要给这个docker私服推送镜像的话,默认是需要https方式的,可在内网环境中,一方面配置ssl不方便,另外内网也不需要用到http方式的。所以需要做如下改造

1
vi /etc/sysconfig/docker

 

把如下内容加入配置参数中

1
OPTIONS='--insecure-registry 192.191.0.86:5000'

 

最终这个文件是下面这个样子的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry 192.191.0.86:5000'
if [ -z "${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi

# Do not add registries in this file anymore. Use /etc/containers/registries.conf
# from the atomic-registries package.
#

# On an SELinux system, if you remove the --selinux-enabled option, you
# also need to turn on the docker_transition_unconfined boolean.
# setsebool -P docker_transition_unconfined 1

# Location used for temporary files, such as those created by
# docker load and build operations. Default is /var/lib/docker/tmp
# Can be overriden by setting the following environment variable.
# DOCKER_TMPDIR=/var/tmp

# Controls the /etc/cron.daily/docker-logrotate cron job status.
# To disable, uncomment the line below.
# LOGROTATE=false

# docker-latest daemon can be used by starting the docker-latest unitfile.
# To use docker-latest client, uncomment below lines
#DOCKERBINARY=/usr/bin/docker-latest
#DOCKERDBINARY=/usr/bin/dockerd-latest
#DOCKER_CONTAINERD_BINARY=/usr/bin/docker-containerd-latest
#DOCKER_CONTAINERD_SHIM_BINARY=/usr/bin/docker-containerd-shim-latest

 

gitlab-ci.yml文件变更

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
image: maven:3-jdk-8

variables:
# docker仓库
DOCKER_REPOSITORY_URL: 192.191.0.86:5000

cache:
paths:
- $CI_PROJECT_DIR/hsjry-credit-deploy/target/*.war

stages:
- maven_build
- docker_build

# maven打包
maven打包:
stage: maven_build
script:
- "find -name \"application-dev.xml\" | sed 's/-dev.xml$//g' | xargs -i -t mv {}-dev.xml {}.xml"
- "find -name \"credit-dev.properties\" | sed 's/-dev.properties$//g' | xargs -i -t mv {}-dev.properties {}.properties"
- "mvn clean install -U -Dmaven.test.skip=true"
only:
- dev
- master
- merge-requests
- docker

# 通过Dockerfile安装war包
docker打包:
image: docker
stage: docker_build
script:
- "docker build -t $DOCKER_REPOSITORY_URL/jetty-$CI_PROJECT_NAME-$CI_COMMIT_REF_SLUG:latest ."
- "docker push $DOCKER_REPOSITORY_URL/jetty-$CI_PROJECT_NAME-$CI_COMMIT_REF_SLUG:latest"

这个配置有一个前置要求,需要修改gitlab runner相关的配置

1
vi /etc/gitlab-runner/config.toml

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
concurrent = 1
check_interval = 0

[[runners]]
name = "CommonRunner"
url = "http://gitlab.hyxfjr.com/ci"
token = "401d25b2b0e03f3d20569cccf31f8e"
executor = "docker"
[runners.docker]
tls_verify = false
image = "maven:3-jdk-8"
privileged = false
disable_cache = false
volumes = ["/cache","/home/gitlab-runner/.m2:/root/.m2","/var/run/docker.sock:/var/run/docker.sock"]
shm_size = 0
extra_hosts = ["gitlab.hyxfjr.com:192.168.0.12"]
[runners.cache]

在对应volumes中,需要增加一个"/var/run/docker.sock:/var/run/docker.sock",这个是为了能在docker镜像中还是能够使用docker命令

下面介绍一下这个gitlab-ci.yml文件如此配置的原因

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 基础docker镜像使用maven:3-jdk-8,该镜像已经集成了maven和jdk8
image: maven:3-jdk-8

# 自定义的参数,定义了docker仓库的地址
variables:
# docker仓库
DOCKER_REPOSITORY_URL: 192.191.0.86:5000

# 各个job之间可以用来传输的信息,主要用来传输war包,用于打包docker镜像的
cache:
paths:
- $CI_PROJECT_DIR/hsjry-credit-deploy/target/*.war

# 定义这个CI都有哪些job,这里只有2个job,一个用于maven编译,一个用于打包docker奖项
stages:
- maven_build
- docker_build

# maven打包
maven打包:
# 定义这个job的id
stage: maven_build
# 这个job要执行的命令
script:
# 前两个命令,是用于不同环境,定义不同的配置,类似于springboot的用法。可以看下gitlab仓库,在deploy的src/main/resources下,定义了credit-dev.properties\credit-test.properties\credit-master.properties,下面的命令,就是把credit-dev.properties改名成credit.properties的
- "find -name \"application-dev.xml\" | sed 's/-dev.xml$//g' | xargs -i -t mv {}-dev.xml {}.xml"
- "find -name \"credit-dev.properties\" | sed 's/-dev.properties$//g' | xargs -i -t mv {}-dev.properties {}.properties"
# maven打包命令
- "mvn clean install -U -Dmaven.test.skip=true"
# 定义这个job在哪些情况下才进行打包
only:
- dev
- master
- merge-requests
- docker

# 通过Dockerfile安装war包
docker打包:
# 这个job需要依赖docker环境,可仅配置一个docker的image是不够的,还需要配置上面一步所说的内容
image: docker
stage: docker_build
script:
# docker打包命令
- "docker build -t $DOCKER_REPOSITORY_URL/jetty-$CI_PROJECT_NAME-$CI_COMMIT_REF_SLUG:latest ."
# docker发布到私服命令
- "docker push $DOCKER_REPOSITORY_URL/jetty-$CI_PROJECT_NAME-$CI_COMMIT_REF_SLUG:latest"

 

Dockerfile文件配置

1
2
3
4
5
# 2.1 拉取jetty镜像
FROM jetty

# 2.2 把war包放在jetty镜像中webapp目录下
COPY ./hsjry-credit-deploy/target/hsjry-credit-deploy.war ${JETTY_BASE}/webapps/

上一步在做docker build操作时,其实就是执行这个Dockerfile文件。这个文件在工程根目录下

posted @ 2019-07-31 15:59  qxwang  阅读(66)  评论(0)    收藏  举报