由于以下几个原因,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. [hadoop] 一些基础概念

    一.云的概念 1.云计算的概念 随时 随地 使用任何设备 获得任何服务 2.趋势 )资料开始回归集中处理(存储大量资料) 随时存取 降低遗失风险 减少传输成本 促进团队协作 )网页变为预设开发平台(网 ...

  2. 并发编程 10—— 任务取消 之 关闭 ExecutorService

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  3. 支持GPS的核心API

    Android为GPS功能支持专门提供了一个LocationManager类,它的作用于TelephonyManager.AudioManager等服务类的作用相似,所有GPS定位相关的服务.对象都将 ...

  4. Android RecyclerView 使用完全解析

    概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用. 据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我 ...

  5. HDU 2955 01背包(思维)

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. hdu 1050 (preinitilization or postcleansing, std::fill) 分类: hdoj 2015-06-18 11:33 34人阅读 评论(0) 收藏

    errors, clauses in place, logical ones, should be avoided. #include <cstdio> #include <cstr ...

  7. 解决 iOS7 通过tag 找不到 UITableViewCell 的子控件

    当iOS7问世,程序的世界就混乱了,以前良好的程序,现在是一塌糊涂,于是只能把问题一个一个攻破. 由于项目当中需要每个cell显示数目不同的图片,于是我在每个cell 赋值之前,通过一下方法把cell ...

  8. 循环打印i值(面试题)

    /* * 下面的代码,为了实现每隔1秒说一句话, * 找出存在的问题,并改正,然后描述一下你的解决方案. * */ var arr = [ '第一句话', '第二句话', '第三句话', '第四句话' ...

  9. 标准IO的简单应用,动静态库,读取系统时间并打印,模拟ls -l功能

    2015.2.27星期五,小雨 标准IO实现的复制功能: #include <stdio.h>#include <errno.h> #define N 64 int main( ...

  10. HDU 5234 DP背包

    题意:给一个n*m的矩阵,每个点是一个蛋糕的的重量,然后小明只能向右,向下走,求在不超过K千克的情况下,小明最终能吃得最大重量的蛋糕. 思路:类似背包DP: 状态转移方程:dp[i][j][k]--- ...