docker环境搭建完成后
1、启动docker,获取镜像
docker pull jenkins
感觉下载了好大体积的东西啊!发现最开始的helloword镜像都要一百多m。
大致查了一下思考了一下,开始有点明白docker和虚拟机的区别了:以下描述可能不够严谨。
docker镜像更像是为每一个程序都单独配置程序运行依赖的内容。比如helloworld镜像,这里面可能就涉及到centos系统用来完成echo指令的相关内容。
而虚拟更像是把大部分基础功能的环境集成起来了。
好比:
docker :一个食品加工厂只生产一种食品,那么工厂准备的所有物资人力,都只是为了生产这一种食品。缺少任何内容都会导致食品生产出问题。
虚拟机:一个餐厅,集合了各种各样的食材,初始和做菜工具,这样子的话,当有不同的人要点不同的菜时,可以选择指定食材和厨师进行制作。可以满足不同的生产需要
2、镜像下载完成后。运行jenkins
docker run -d -p 8080:8080 --name myjenkins -v $PWD/jenkins:/var/jenkins_home -t jenkins
-d 表示后台运行
-p 8080:8080:将容器的80端口映射到主机的80端口
-name jenkins :将容器命名为jenkins
-v: $PWD/jenkins:/var/jenkins_home : 将主机中当前目录下的jenkins挂载到容器的/var/jenkins_home
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
docker run的具体参数可以参考菜鸟教程-docker run 命令
运行后却发现没有启动成功,查看输出留后发现:没有权限把本地目录挂载
[root@centos71 ~]# docker logs myjenkins
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
解决方法:参考
谈谈 Docker Volume 之权限管理(一)
用ls -la命令查看了下,发现当前目录下的jenkins的拥有者是root
[root@centos71 ~]# ls -la
drwxr-xr-x. 2 root root 6 3月 11 00:04 jenkins
通过下面命令查看当前jenkins容器的用户:发现容器里的用户是jenkins
[root@centos71 ~]# docker run -ti --rm --entrypoint="/bin/bash" jenkins -c "ls -la /var/jenkins_home"
total 12
drwxr-xr-x. 2 jenkins jenkins 57 Mar 10 16:28 .
drwxr-xr-x. 1 root root 37 Feb 15 17:16 ..
-rw-r--r--. 1 jenkins jenkins 220 May 15 2017 .bash_logout
-rw-r--r--. 1 jenkins jenkins 3526 May 15 2017 .bashrc
-rw-r--r--. 1 jenkins jenkins 675 May 15 2017 .profile
给centos 添加jenkins用户组和用户
[root@centos71 ~]# groupadd jenkins
[root@centos71 ~]# useradd -g jenkins jenkins
用户的uid是: 1000
[root@centos71 ~]# docker run -ti --rm --entrypoint="/bin/bash" jenkins -c "whoami && id"
jenkins
uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)
参考文章:使用Docker运行jenkins
解决方法:把当前目录下的jenkins的拥有者和组别都改成jenkins
[root@centos71 ~]# chown -R jenkins jenkins/
[root@centos71 ~]# chgrp -R jenkins jenkins/
3、再次启动jenkins ,发现由于前面的操作,myjenkins这个容器名称已经被占用了。通过docker ps -a 可以看出当前有哪些容器以及被定义。
[root@centos71 ~]# docker run -d -p 8080:8080 --name myjenkins -v $PWD/jenkins:/var/jenkins_home -t jenkins
/usr/bin/docker-current: Error response from daemon: Conflict. The container name "/myjenkins" is already in use by container 06ecf6381b6b76354d9e8ed077b5067baed09462fceba46e5840c849352ad048. You have to remove (or rename) that container to be able to reuse that name..
See '/usr/bin/docker-current run --help'.
解决方法:把指定终止状态的容器删除 ,加上-f可以强制删除运行中的容器
[root@centos71 ~]# docker container rm myjenkins
要清除所有终止的容器的话,可以使用下面命令
[root@centos71 ~]# docker container prune
现在再次运行启动jenkins的命令
docker run -d -p 8080:8080 --name myjenkins -v $PWD/jenkins:/var/jenkins_home -t jenkins
还是报上面的错误。再查了下资料,有以下说法:
问题原因及解决办法 原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题:1.在运行容器的时候,给容器加特权,及加上 --privileged=true 参数: 2.临时关闭selinux: setenforce 0 3.添加selinux规则,改变要挂载的目录的安全性文本 |
用了第一种方法,失败
第二种方法,成功!终于好了!