Docker中使用systemd

2022-07-03 13:56:42 浏览数 (1)

由于以下几个原因,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正常启动起来了。

0 人点赞