侧边栏壁纸
博主头像
zyixin

当你觉得为时已晚的时候,恰恰是最早的时候

  • 累计撰写 64 篇文章
  • 累计创建 0 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

部署Centos7容器

zyixin
2022-04-07 / 0 评论 / 0 点赞 / 2,026 阅读 / 3,936 字
温馨提示:
本文最后更新于 2022-04-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

部署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
0

评论区