由于以下几个原因,docker的官方centos镜像中没有提供systemd服务:
 
  • systemd requires the CAP_SYS_ADMIN capability. This means running docker with --privileged. Not good for a base image.
  • systemd requires access to the cgroups filesystem.
  • systemd has a number of unit files that don’t matter in a container, and they cause errors if they’re not removed
 
但在可控环境下,我们还是希望使用systemd来管理我们的服务,如何开启systemd呢?
 
首先创建一个Dockerfile用来创建systemd的base image:
 
FROM centos:latest
MAINTAINER feisky
RUN yum -y install systemd systemd-libs
#RUN yum -y update
RUN 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"]
 
执行 docker build --rm -t centos:systemd .来创建一个systemd base image:
[root@fei ~]# docker build --rm -t centos:systemd . 
Sending build context to Docker daemon 490 MB 
Sending build context to Docker daemon 
Step 0 : FROM centos:latest 
---> b157b77b1a65 
Step 1 : MAINTAINER feisky 
---> Using cache 
---> 4add1a12ff67 
Step 2 : RUN yum -y install systemd systemd-libs 
---> Using cache 
---> 2bc5274f7dd2 
Step 3 : RUN 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/*; 
---> Running in d132481218d7 
Loaded plugins: fastestmirror 
Cleaning repos: base extras updates 
Cleaning up everything 
Cleaning up list of fastest mirrors 
---> 7a9492819396 
Removing intermediate container d132481218d7 
Step 4 : VOLUME /sys/fs/cgroup 
---> Running in d5a93c8ee296 
---> 10b06676ea4d 
Removing intermediate container d5a93c8ee296 
Step 5 : CMD /usr/sbin/init 
---> Running in 6ab276a1974b 
---> b519e838367f 
Removing intermediate container 6ab276a1974b 
Successfully built b519e838367f
 
下面就可以基于该镜像来创建http服务的镜像了,当然这儿就需要另外一个Dockerfile:
 
FROM centos:systemd
MAINTAINER feisky
RUN yum -y install httpd; systemctl enable httpd.service
RUN yum -y install mariadb-server mariadb; systemctl enable mariadb.service
RUN yum clean all
EXPOSE 80
CMD ["/usr/sbin/init"]
 
执行docker build -t http_server .来创建http镜像。
 
镜像创建好后可以通过下面的命令来启动http docker(注意需要--privileged):
 

docker run --privileged -d -v /sys/fs/cgroup:/sys/fs/cgroup:ro -h server.http.local -p 8081:80 -t http_server 

 

通过下面的命令可以进入docker的shell(其中3df7d8c59f1e为容器ID):

 
nsenter --mount --uts --ipc --net --pid --target $(docker inspect --format "{{.State.Pid}}" "605bae76456d")
 
或者可以通过下面的命令来在容器内执行命令:
 
# docker exec 605bae76456d ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:33 ? 00:00:00 /usr/sbin/init
root 15 1 0 07:33 ? 00:00:00 /usr/lib/systemd/systemd-journald
root 16 1 0 07:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 18 16 0 07:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 19 16 0 07:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 20 16 0 07:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 21 16 0 07:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 22 16 0 07:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
dbus 187 1 0 07:41 ? 00:00:00 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
mysql 248 1 0 07:41 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql 404 248 1 07:41 ? 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root 458 0 0 07:41 ? 00:00:00 ps -ef
访问服务器的8081端口发现Apache正常启动起来了。

docker中使用systemd的更多相关文章

  1. 如何在一个Docker中同时运行多个程序进程?

    我们都知道Docker容器的哲学是一个Docker容器只运行一个进程,但是有时候我们就是需要在一个Docker容器中运行多个进程 那么基本思路是在Dockerfile 的CMD 或者 ENTRYPOI ...

  2. Docker中的Cgroup Driver:Cgroupfs 与 Systemd

    在安装kubernetes的过程中,会出现 failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgrou ...

  3. Docker中部署Kubernetes

    Kubernetes为Google开源的容器管理框架,提供了Docker容器的夸主机.集群管理.容器部署.高可用.弹性伸缩等一系列功能:Kubernetes的设计目标包括使容器集群任意时刻都处于用户期 ...

  4. 在 Docker 中使用 flannel - 每天5分钟玩转 Docker 容器技术(60)

    上一节我们安装和配置了 flannel,本节在 Docker 中使用 flannel. 配置 Docker 连接 flannel 编辑 host1 的 Docker 配置文件 /etc/systemd ...

  5. 将自己的SpringBoot应用打包发布到Linux下Docker中

    目录 将自己的SpringBoot应用打包发布到Linux下Docker中 1. 环境介绍 2. 开始前的准备 2.1 开启docker远程连接 2.2 新建SpringBoot项目 3. 开始构建我 ...

  6. 060、在docker中使用flannel(2019-03-29 周五)

    参考https://www.cnblogs.com/CloudMan6/p/7441188.html   配置docker 连接flannel   编辑host1的docker配置文件/etc/sys ...

  7. [转]Docker中的镜像

    引言 这篇文章中我们主要来探讨下Docker镜像,它是用来启动容器的构建基石,本文的所用到的Dcoker版本是17.1,API版本是1.33,Go的版本是1.9.2,OS是基于Arch Linux的M ...

  8. 第 8 章 容器网络 - 060 - 在 Docker 中使用 flannel

    在 Docker 中使用 flannel 编辑 host1 的 Docker 配置文件 /etc/systemd/system/docker.service.d/10-machine.conf 设置 ...

  9. 【kubeadm初始化报错】failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

    复现场景 环境 系统:Centos7 kubernetes:1.18.5 docker:19.03.9 复现步骤 1.通过 yum 或 rpm 安装 kubelet kubectl kubeadm,并 ...

随机推荐

  1. jQuery经典面试题及答案精选(转)

    jQuery是一款非常流行的Javascript框架,如果你想要从事Web前端开发这个岗位,那么jQuery是你必须掌握而且能够熟练应用的一门技术.本文整理了一些关于jQuery的经典面试题及答案,分 ...

  2. freemarker if elseif

    FreeMarker模板 if, else, elseif 指令 : if, else, elseif 语法 <#if condition> ... <#elseif conditi ...

  3. 14072202(带IK的Recoil)

    [目标] 带IK的Recoil [思路] 1 继承于USkelControlLimb和UGameSkelCtrl_Recoil 2 效果对比  以这个骨骼为例 Recoil Limb 可见,Recoi ...

  4. @HTML.checkboxFor()用法

    <%=Html.CheckBox("chk1",true) %> <%=Html.CheckBox("chk1", new { @class= ...

  5. c#调用存储过程

    存储过程(Stored Procedure)即用来存储数据表操作的一个过程,是把对数据表操作的方法存储到一起的一个对象,是存储在数据库中. 优点:1.降低网络传输数据量:通过存储过程的名称和参数传递即 ...

  6. 关于DButils的简单介绍

    android中的orm框架,一行代码就可以进行增删改查:支持事务,默认关闭:可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名)等等 ...

  7. mybatis进阶

    1.mybatis一对一映射 Student--Card <?xml version="1.0" encoding="utf-8" ?> <! ...

  8. SQL 解决in的参数烦恼(经典,简洁,高效)

    原SQL是不能执行的:select * from 表A where 字段A in (select 逗号分隔的字段B from 表B where 条件) 解决方案:select b.* from (se ...

  9. 《大象-Think In UML》读书笔记3

    建模,是指通过对客观事物建立一种抽象的方法用以表征事物并过得对事物本身的理解,同时把这种理解概念化,将这些逻辑概念组织起来,构成一种对所观察的对象的内部结构和工作原理的便于理解的表达. 建模包含两个问 ...

  10. C#实现右下角弹出窗口效果

    /// <summary> /// 窗体动画函数 注意:要引用System.Runtime.InteropServices; /// </summary> /// <pa ...