docker中使用systemd

由于以下几个原因,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:

[[email protected] ~]# 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正常启动起来了。

时间: 2024-11-09 04:47:26

docker中使用systemd的相关文章

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

上一节我们安装和配置了 flannel,本节在 Docker 中使用 flannel. 配置 Docker 连接 flannel 编辑 host1 的 Docker 配置文件 /etc/systemd/system/docker.service,设置 --bip 和 --mtu. 这两个参数的值必须与 /run/flannel/subnet.env 中 FLANNEL_SUBNET 和FLANNEL_MTU 一致. 重启 Docker daemon. systemctl daemon-reloa

[转]Docker中的镜像

引言 这篇文章中我们主要来探讨下Docker镜像,它是用来启动容器的构建基石,本文的所用到的Dcoker版本是17.1,API版本是1.33,Go的版本是1.9.2,OS是基于Arch Linux的Manjaro. Docker镜像的概念 总的来说,Docker镜像是由文件系统叠加而成的. bootfs 最底端是一个引导文件系统,即bootfs,这很像典型的Linux/Unix的引导文件系统.Docker用户几乎永远不会和引导文件系统有什么交互.实际上,当一个容器启动后,它将会被移到内存中,而引

Docker中的Redis容器如何连接上进行操作?

Docker中的Redis容器如何连接上进行操作? 1.登录putty有如下信息: 公用虚拟 IP (VIP)地址42.159.156.115内部 IP 地址10.205.178.22IP address for eth0:    10.205.178.22IP address for docker0: 172.17.42.1 2. 下载 http://download.redis.io/redis-stable/redis.conf修改如下字段 # requirepass foobared去掉

docker中运行ASP.NET Core Web API

在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Core以及docker的基本概念,网上已经有很多文章对其进行介绍了,因此本文不会再详细讲解这些内容.对.NET Core和docker不了解的朋友,建议首先查阅与这些技术相关的文档,然后再阅读本文. 先决条件 要完成本文所介绍的演练任

在docker中运行ASP.NET Core Web API应用程序

本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Core以及docker的基本概念,网上已经有很多文章对其进行介绍了,因此本文不会再详细讲解这些内容.对.NET Core和docker不了解的朋友,建议首先查阅与这些技术相关的文档,然后再阅读本文. 先决条件 要完成本文所介绍的演练任务,需要准备以下环境: Visual Studio 2015,或者Vi

Calico在Docker中的搭建

一,Multi-host网络需求 开始之前推荐两篇文章 http://xelatex.github.io/2015/11/15/Battlefield-Calico-Flannel-Weave-and-Docker-Overlay-Network/ http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=400983139&idx=1&sn=f033e3dca32ca9f0b7c9779528523e7e&scene=1&a

如果在docker中部署tomcat,并且部署java应用程序

1.先说如何在docker中部署tomcat 第一步:root用户登录在系统根目录下创建文件夹tomcat7,命令如:mkdir tomcat7,并且切换到该目录下:cd tomcat7: 第二步:创建Dockerfile,命令如:touch Dockerfile: 第三步:编写Dockerfile,命令如:vim Dockerfile,完成以下命令编写: FROM ubuntu:14.04 MAINTAINER zhaichong <[email protected]> ENV REFRES

如何在Docker中部署DzzOffice

一.一些背景 之前研究Docker很久了,并且在公司内部实际使用起来了,目前分两种场景使用Docker 1.作为PAAS,提供一致,统一的编译/测试环境: 2.作为虚拟机,直接分配给新来的开发人员使用. 使用Docker一段时间之后,准备在公司内部使用Docker + Hadoop(HDFS)组件内部一个私有云,统一管理公司和产品/项目组内部的代码.文档. 我选择先从文档管理开始,在底层架子搭建好之后,需要给内部人员提供一个好的"门面",在没有这个门面之前,我们大量使用SSH+Comm

docker中遇到的问题及解决方法

docker 的深坑 1. 镜像数据问题 由于容器重启后数据会被清空,所以docker中的数据需要通过映射存放到本地磁盘持久化,启动docker镜像的时候加-V diskPath:dockerPath的参数.如: docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /opt/data/mysql:/var/lib/mysql -p 3306:3306 mysql 2. 容器中的时区与语言的问题 在docker容器中默认时间是UTC