一、什么是docker?
Docker 是一个开源的应用容器引擎。
简单讲就是一个相对独立的运行环境区域。
重要的三个概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
简单讲:
镜像-- Java中的类,
容器--类创建的实例对象
仓库--gitlab仓库
还听不懂?
上图:
二、为什么要用docker?
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
简单讲就是把自己的工程打一个包,然后丢到任何支持docker部署的服务器上都可以运行。
三、怎么用docker?
首先来讲我的需求,我想把gitlab 上的项目通过Jenkins部署在服务器,使用docker 容器化方式部署。
1.安装docker
略
2.docker安装Jenkins
安装
docker pull jenkins[:版本]
这里我安装的版本是:Jenkins 2.249.2 版本很多可以再官网查看docker安装版本(试过错,才知道他的好)
查看
docker images
看到有Jenkins 说明镜像包已经导入成功
配置
首先介绍两个目录
- 所有服务的docker-compose必须存储在: /home/deploy/service
- 应用数据全部存储在: /data
方便数据持久化,原因:当容器启动或停止时,容器内对象会全部销毁。因此需要数据持久化。将容器下的文件目录挂在到/data 下对应的文件中去。
- 创建Jenkins数据文件夹/data/jenkins_home
- 创建jenkins 镜像配置文件/home/deploy/service/jenkins/docker-compose.yml
- 将镜像文件数据挂在到/data/jenkins_home
docker-compose.yml 文件配置如下
version: '3'
services:
jenkins:
image: jenkins/jenkins:2.249.2
restart: always
container_name: jenkins
ports:
- '8080:8080'
- '50000:50000'
volumes:
- /data/jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock # 默认配置
- /usr/bin/docker:/usr/bin/docker # 默认配置
- /etc/localtime:/etc/localtime:ro # 默认配置
配置解读
- image:我们的镜像文件版本,启动时会先从本地查找,如果没有会从远程仓库拉取指定版本镜像
- container_name:我们启动镜像后容器的名称
- ports:指定容器端口号为8080
- volumes: 文件挂在配置“:”前为本地(容器外服务器上)真实挂在的卷轴地址,之后为容器虚拟环境文件数据地址。
启动容器
docker启动:如果没有配置docker-compose.yml 时
docker run --name jenkins --user=root -p 8080:8080 -p 50000:50000 -v /data/jenkins_home:/var/jenkins_home -d jenkins/jenkins:2.249.2
docker-compose 启动:
进入Jenkins配置文件根目录cd /home/deploy/service/jenkins/
执行命令:
启动容器 docker-compose up [-d]
-d 后台运行
停止容器 docker-compose down
测试
查看容器是否正常启动:docker ps -a 查看最近启动的容器信息
那就代表容器启动成功了,那么接下来测试下是否可以正常访问
ifconfig 查看服务器对外公网地址,也就是你登录服务器的ip 地址
正常情况下就可以了,但是我们仅支持80和443端口对外访问,所以要说那个Nginx代理转发我们的服务地址通过域名方式访问。
3.Nginx代理配置
安装
docker pull nginx
配置
- 同样的方法,我们需要创建数据存放文件/data/nginx以及子目录
- 配置文件/home/deploy/service/nginx/ docker-compose.yml
- 修改文件权限 chmod 777 /data/nginx
- 在/data/nginx/conf.d中创建文件mynginx.conf 名字随便起,但要.conf的后缀,
为什么呢,去看看/data/nginx/conf/nginx.conf 中有这么一段
include /etc/nginx/conf.d/*.conf;
意思是去该文件下找*.conf文件并加载它
- vim docker-compose.yml
version: '3.1'
services:
nginx:
restart: always
image: nginx
container_name: nginx
ports:
- 80:80
- 443:443
volumes:
- /data/nginx/nginx.conf:/data/nginx/nginx.conf
- /data/nginx/conf.d:/etc/nginx/conf.d
- /data/nginx/log:/data/log/nginx
- /data/nginx/wwwroot:/data/nginx/wwwroot
- /data/nginx/html:/usr/share/nginx/html
配置解读
/home/deploy/service/nginx/ docker-compose.yml
主要还是要注意volumes: 中要将容器中的配置数据文件挂载到容器外我们制定的文件中去。
/data/nginx/conf.d/mynginx.conf
upstream jenkins {
keepalive 32; # keepalive connections
server [你的服务器本地地址]:8080; # jenkins ip and port
}
# Required for Jenkins websocket agents
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80; # Listen on port 80 for IPv4 requests
server_name [你的域名地址]; #访问域名
# this is the jenkins web root directory
# (mentioned in the /etc/default/jenkins file)
root /usr/share/nginx/html;
# pass through headers from Jenkins that Nginx considers invalid
ignore_invalid_headers off;
location / {
sendfile off;
proxy_pass http://jenkins;#根路径访问域名跳转到Jenkins指定的IP地址服务上
proxy_redirect default;
proxy_http_version 1.1;
# Required for Jenkins websocket agents
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_max_temp_file_size 0;
#this is the maximum upload size
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffering off;
proxy_request_buffering off; # Required for HTTP CLI commands
proxy_set_header Connection ""; # Clear for keepalive
}
}
启动容器
同上还是两种方式,因为我们配置了docker-compose.yml 使用docker-compose 启动
cd /home/deploy/service/nginx/ docker-compose up
测试
docker ps -a
可以看到我们已经成功启动了nginx 容器并成功监听了80 和443端口。前面的0.0.0.0:80/443 指的是所有通过该端口ip监听
Jenkins本地服务地址 server [本地地址]:8080;
用户通过域名:qaman.ixm5.cn 访问,当nginx 监听到有80/443访问会跳转到本地location 指定的服务Jenkins 上,upstream jenkins 用来做负载均衡,如果允许我们可以如下配置
upstream backend {
server 127.0.0.1:8888;
server 127.0.0.3:8888;
server 127.0.0.2:8888;
}
至此我们已经完成了docker服务部署并完成了Nginx代理转发!
四、过程中的坑点???
1.有关Jenkins的问题
我想通过Jenkins在服务器执行shell 命令,但发现说权限不对!
细看报错,说我的私钥不对,这里说明下,我们的服务器登录使用的是rsa 私钥解密方式,公钥放在服务器。
但是我的git 已经同样的方法获取到了gitlab 的代码呀,咳咳,去百度了一把,
提示说:Jenkins版本在2.2之后版本使用的rsa私钥不合法,不能用openssh格式的,如下示例:
错误:
-----BEGIN OPENSSH PRIVATE KEY----- **************************************... -----END OPENSSH PRIVATE KEY-----
正确:
-----BEGIN RSA PRIVATE KEY----- ******************************... -----END RSA PRIVATE KEY-----