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:

[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正常启动起来了。

给TA打赏
共{{data.count}}人
人已打赏
安全运维

基于spring boot和mongodb打造一套完整的权限架构(一)

2021-12-11 11:36:11

安全运维

Ubuntu上NFS的安装配置

2021-12-19 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索