一、Docker 简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

一个完整的 Docker 有以下几个部分组成:
1、dockerClient 客户端
2、Docker Daemon 守护进程
3、Docker Image 镜像
4、DockerContainer 容器

二、Docker 环境安装
1、docker 安装
在安装 docker 前我们要先判断自己的系统内核版本(centos 系统),docker 要求内核版本高于 3.10,查看该系统版本是否支持 docker。
通过 uname -r 命令查看当前内核版本
这里写图片描述
然后通过命令:yum install -y docker 进行安装
*Ps:如果输入次命令提示 no package docker available
原因是没有找到此安装包,需要更新第三方库

Sudo yum install epel-release*

2、启动 docker 服务
安装好 docker 后,我们就要启动 docker 服务了,输入以下命令来启动 docker 服务:

$sudo service docker start
$docke --version进行验证是否启动服务

这里写图片描述

3、获取镜像
Docker 服务启动后,当前是没有镜像的,我们要需要获取远程仓库提供的镜像,首先我们可以查询下我们要找的镜像,用命令查询:docker search jenkins
然后通过命令:docker pull jenkins 拉取镜像文件
获取到镜像后我们可以用命令查看本地镜像:docker images
这里写图片描述
这个就是我们刚才获取到的镜像。

4、启动 jenkins 容器
有了 docker 镜像后,就可以创建容器了,由于 jenkins 没有数据库,所有数据都是存放在文件中的,首先在本地创建 jenkins 数据目录,用于保存 jenkins 的数据,这个目录需要定时备份,用于容灾(当前 jenkins 容器所在节点由于不可抗因素无法使用时,可以在新机器上使用备份的数据启动新的 jenkins master 节点)
创建 jenkins 目录
Sudo mkdir /var/jenkins

修改 jenkins 目录权限
Sudo chown 1000:1000 /var/jenkins

启动 jenkins 容器
Sudo docker run -p 127.0.0.1:8080:8080 -p 50000:50000 -v /var/jenkins:/var/jenkins_home --name my_jenkins -d jenkins
Ps:参数说明
-d:让容器在后台运行
-p:将容器内部使用的网络端口映射到我们使用的主机上
--name:将容器命名为 my_jenkins

这里启动 jenkins 会出现一个问题
一般启动 jenkins 容器我们是用这个
docker run -p 8080:8080 -p 50000:50000 --name bee_jenkins jenkins
命令查看启动日志
docker logs jenkins

这样是可以正常启动的,但是为了持久化 jenkins 配置数据,我们会把宿主机当前目录下的 jenkins 文件夹挂载到容器中的目录 “/var/jenkins_home” 的时候就会出现问题
我们先把之前创建的容器删除掉
Docker rm -f my_jenkins ----删除之前创建的容器(才能创建相同名字的容器)
Sudo docker run -p 127.0.0.1:8080:8080 -p 50000:50000 -v /var/jenkins:/var/jenkins_home --name my_jenkins -d jenkins
Docker logs jenkins

错误日志如下:
这里写图片描述
遇到这种情况,我们检查一下之前启动方式的"/var/jenkins_home"目录权限,查看 Jenkins 容器的当前用户: 当前用户是"jenkins"而且"/var/jenkins_home"目录是属于 jenkins 用户拥有的

docker@default:~$ docker run -ti --rm --entrypoint="/bin/bash" jenkins -c "whoami && id" jenkins 

uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins) 

docker@default:~$ docker run -ti --rm --entrypoint="/bin/bash" jenkins -c "ls -la /var/jenkins_home" 

total 20 
drwxr-xr-x 2 jenkins jenkins 4096 Jun 5 08:39 .
drwxr-xr-x 28 root root 4096 May 24 16:43 .. 
-rw-r--r-- 1 jenkins jenkins 220 Nov 12 2014 .bash_logout
 -rw-r--r-- 1 jenkins jenkins 3515 Nov 12 2014 .bashrc 
-rw-r--r-- 1 jenkins jenkins 675 Nov 12 2014 .profile

而当映射本地数据卷时,/var/jenkins_home 目录的拥有者变成了 root 用户

docker run -ti --rm -v $(pwd)/jenkins:/var/jenkins_home --entrypoint="/bin/bash" jenkins -c "ls -la /var/jenkins_home" 

total 4 
drwxr-sr-x 2 root staff 40 Jun 5 08:32 . 
drwxr-xr-x 28 root root 4096 May 24 16:43 ..

这就解释了为什么当"jenkins"用户的进程访问"/var/jenkins_home"目录时,会出现 Permission denied 的问题,我们再检查一下宿主机上的数据卷目录,当前路径下"jenkins"目录的拥有者是"root",这是因为这个目录是 Docker 进程缺省创建出来的。

ls -la /var/jenkins

total 0 
drwxr-sr-x 2 root staff 40 Jun 5 08:32 ./ 
drwxr-sr-x 5 docker staff 160 Jun 5 08:32 ../

发现问题之后,相应的解决方法也很简单:把当前目录的拥有者赋值给 uid 1000,再启动"jenkins"容器就一切正常了。

#sudo chown -R 1000:1000 /var/jenkins 
#docker start bee_jenkins

然后启动 jenkins 容器时再加上一个参数就好了

#sudo docker run -d -v /var/jenkins:/var/jenkins_home -u 0 -P --name bee_jenkins jenkins

如果按照上面做还是出现 Permission denied 错误,那么可以检查一下 selinux 状态,开启的情况下会导致一些服务安装、使用不成功。
查看 selinux 状态,

[root@localhost ~]# sestatus 
SELinux status: enabled 
SELinuxfs mount: /sys/fs/selinux 
SELinux root directory: /etc/selinux 
Loaded policy name: targeted 
Current mode: enforcing 
Mode from config file: enforcing 
Policy MLS status: enabled 
Policy deny_unknown status: allowed 
Max kernel policy version: 28

临时关闭:

[root@localhost ~]# setenforce 0

永久关闭,可以修改配置文件/etc/selinux/config,将其中 SELINUX 设置为 disabled,如下,

[root@localhost ~]# cat /etc/selinux/config 
# This file controls the state of SELinux on the system. 
# SELINUX= can take one of these three values: 
# enforcing - SELinux security policy is enforced. 
# permissive - SELinux prints warnings instead of enforcing. 
# disabled - No SELinux policy is loaded. 
#SELINUX=enforcing SELINUX=disabled 
# SELINUXTYPE= can take one of three two values: 
# targeted - Targeted processes are protected, 
# minimum - Modification of targeted policy. Only selected processes are protected. 
# mls - Multi Level Security protection. SELINUXTYPE=targeted 

[root@rdo ~]# sestatus 
SELinux status: disabled

如-p 127.0.0.1:8080:8080 就是将容器的 8080 端口映射到我们本地的 8080 端口且绑定 127.0.0.7 本地 IP。
我们可以通过以下命令确认容器是否启动成功:
docker ps 或 docker ps -a
这里写图片描述
说明启动成功,且成功绑定本地 ip 跟端口,这时我们通过浏览器访问:127.0.0.1:8080 即可打开 jenkins 了
这里写图片描述

5、上传自己本地 docker 镜像到 hub 上
·先申请一个 docker hub 帐号,我的帐号是 beedocker2017(58...)
·为本地镜像打标签 tag

docker tag <exitsting-image><hub-user>/<repo-name>[:tag]

比如:

docker tag jenkins beedocker2017/bee_jenkins:1.0

beedocker2017 就是 docker hub 上的账户名称,bee_jenkins 就是远程的仓库名称,1.0 就是 tag 版本
·push 镜像
在本地登录 docker hub 帐号

#docker login --登录后就可以push了
#docker push beedocker2017/bee_jenkins:1.0 

这时我们就可以 pull 自己远程的镜像到自己本地主机了

#docker pull beedocker2017/bee_jenkins:1.0


↙↙↙阅读原文可查看相关链接,并与作者交流