博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker中使用systemd
阅读量:6262 次
发布时间:2019-06-22

本文共 4217 字,大约阅读时间需要 14 分钟。

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

 本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/p/4045805.html,如需转载请自行联系原作者

你可能感兴趣的文章
修改weblogic部署的应用名称
查看>>
aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【基本地图的操作】
查看>>
Java Nio 多线程网络下载
查看>>
C++不让程序一闪而过
查看>>
C# 中的枚举类型 enum (属于值类型)
查看>>
[Debug] Use Snippets to Store Behaviors in Chrome DevTools
查看>>
【Java面试题】3 Java的"=="和equals方法究竟有什么区别?简单解释,很清楚
查看>>
通用性好的win2003序列号: (推荐先用这个里面的)
查看>>
Chromium Embedded Framework中文文档 (升级到最新的Chrome)
查看>>
WPF Command CanExecute 的执行逻辑
查看>>
更为快捷的Excel操作方式 快捷键 Alt使用技巧动画图解
查看>>
程序员们最易犯的10种错误
查看>>
面试必考题!你知道CSS实现水平垂直居中的第10种方式吗?
查看>>
超多惊喜!苹果 iPhone8 最新渲染图曝光
查看>>
你想要不想要?OPPO R11将搭配前后2000万像素镜头!
查看>>
Payara基金会发布全面支持MicroProfile 2.0的5.183版
查看>>
360金融宣布采用新会计准则 2018年前三季度净利11亿
查看>>
非洲小哥见到马云 竟然提了这样的要求?
查看>>
收购大战:高通承诺将年收入增长率提至8%
查看>>
宁夏:科技创新激活高质量发展动能
查看>>