部署Centos7容器应用
镜像下载:
# docker pull daocloud.io/library/centos:latest
包管理:
默认情况下,为了减小镜像的尺寸,在构建Centos镜像时用了yum的nodocs选项。如果您安装一个包后发现文件缺失,请在/etc/yum.conf中注释tsflogs=nodocs并重新安装您的包。
systemd整合:
因为systemd要求CAPSYSADMIN权限,从而得到了读取到宿主机cgroup的能力,Centos7中已经用fakesystemd代替了systemd来解决依赖问题。如果仍然希望使用systemd,可用参考下面的dockerfile:
# vim Dockerfile
FROM daocloud.io/library/centos:7
MAINTAINER "tiger" tiger@aliyun.com
ENV container docker
RUN yum -y swap -- remove fakesystemd -- install systemd systemd-libs
RUN yum -y update; yum clean all; \
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*; \
rm -f /etc/systemd/system/*.wants/*; \
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*; \
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init" ]
这个Dockerfile删除了fakesystemd并安装了systemd。然后再构建基础镜像:
# docker build --rm -t local/c7-systemd .
一个包含systemd的应用容器实例
为了使用像上面那样包含systemd的容器,需要创建一个类似下面的Dockerfiles:
# vin Dockerfile
FROM 192.168.160.15:5000/c7-systemd
RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
EXPOSE 80
CMD [ "/usr/sbin/init" ]
构建镜像:
# docker build --rm -t local/c7-systemd-httpd .
运行包含 systemd 的应用容器:
为了运行一个包含 systemd 的容器,需要使用–privileged选项,并且挂载主机的cgroups文件夹,下面是运行包含systemd的httpd容器的示例命令:
# docker run --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/c7-systemd-httpd
注意:上面命令不能添加/bin/bash,添加了会导致服务不可用,而且有些服务可能会发现之前提到的权限不够的问题,但是如果不加会运行在前台(没有用-d),可以用ctrl+p+q放到后台去
测试可用:
# elinks --dump http://docker //下面为apache默认页面
Testing 123..
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Apache HTTP Server Test Page powered by CentOS</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- Bootstrap -->
<link href="/noindex/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="noindex/css/open-sans.css" type="text/css" />
BUG整理
基于centos7的docker容器出现的一个bug
centos7下部署的docker容器中启动服务,报错如下:
[root@19302b5d0734 /]# systemctl restart sshd.service
Failed to get D-Bus connection: Operation not permitted
这是centos7容器里面出现的一个bug
即centos7镜像创建的容器里面安装服务后,不能用systemctl/service启动服务,centos6的容器里没有这个坑!
可以通过使用其他的方式或者换用centos6的镜像来避免这个错误.
解决方案如下:
原因是dbus-daemon没能启动,其实systemctl并不是不可以使用,可以将你的CMD设置为/usr/sbin/init即可.
这样就会自动将dbus等服务启动起来。即采用/usr/sbin/init自动启动dbus daemon
即把之前的容器关闭并删除(docker stop container-id),然后重启启动容器,注意:
启动时一定要加上参数–privileged和/sbin/init,如下:
[root@docker ~]# docker run --privileger -it daocloud.io/library/centos:7 /sbin/init
上面的容器启动后,会一直在卡着的状态中,先不用管,打开另一个终端窗口,查看容器这里注意,宿主机可能会出现注销当前登陆账户的情况
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19302b5d0734 daocloud.io/library/centos:7 "/sbin/init" 15 minutes ago Up 14 minutes nauseous_shirley
然后按照容器的ID进去,这个时候再根据/bin/bash进入容器(前面加exec -it参数),接着重启ssh服务就ok了
[root@docker ~]# docker exec -it 19302b5d0734 /bin/bash
[root@19302b5d0734 ~]# systemctl restart sshd.service
docker: Error response from daemon: Cannot start container
b8ajkj123498skjjruyt78pkhasdj981kjsd83lksbhsad72: [9] System error: SELinux policy denies access..
如上出现上面的报错,这是由于selinux造成的!需要关闭selinux,如下:
[root@docker ~]# setenforce 0
[root@docker ~]# getenforce
Permissive
docker: Error response from daemon: failed to create endpoint mosredis on network bridge:
iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d
172.17.0.6 -j ACCEPT: iptables: No chain/target/match by that name.
(exit status 1).
解决办法:
一般来说,重启docker服务,即可解决这个问题
[root@docker ~]# systemctl restart docker
[root@docker ~]#
------------
如果重启docker服务解决不了,那么如下操作:
[root@docker ~]# pkill docker
[root@docker ~]# iptables -t nat -F
[root@docker ~]# ifconfig docker0 down
[root@docker ~]# brctl delbr docker0
评论区