Systemd的@提示符

事出一个朋友问题:通过Docker混合部署了MySQL和Nginx,但每次重启之后,都需要手工docker start命令通过容器启动服务。自然的就是通过systemd来自动启动容器,可每一个服务都写一个systemd脚本岂不是要累死?更何况很多服务之间还有依赖关系。

其实systemd自带了很多“高级方法” ,只是很多人不知道而已。这里就随便分享个“@”提示符的实现方式。

到systemd的配置目录下添加一个文件”@.service”,这里就叫/etc/systemd/system/containers@.service. 这个“@”千万不要忘记!

[Unit]
Description=Service %I in container
After=docker.service # container 肯定要在docker service 之后起
Requires=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a %i
ExecStop=/usr/bin/docker stop %i
TimeoutStopSec=1m

[Install]
WantedBy=default.target

相比其他的.service文件,这个文件赫然有很多“%i” 参数。特别是在[service]部分的入参,如果你熟悉docker的话,应该明白这就是一个container的启动和结束命令。

别急,这才刚刚开始。。。

假设如我的环境这样,有过一个mysql 的container要通过systemd管理,那就尝试使用如下命令启动:

~# systemctl start container@mysql.service
~# # systemctl status contaner@mysql.service
● docker-contaner@mysql.service - Docker container mysql
 Loaded: loaded (/etc/systemd/system/contaner@.service; enabled; vendor preset: enabled)
 Active: active (running) since Thu 2017-04-27 03:07:52 CST; 1 day 18h ago
 Process: 27002 ExecStop=/usr/bin/docker stop %i (code=exited, status=0/SUCCESS)
 Main PID: 27070 (docker)
 CGroup: /system.slice/system-docker\x2dcontaner.slice/contaner@mysql.service
 └─27070 /usr/bin/docker start -a mysql

Apr 27 03:07:53 cce-agile-tools docker[27070]: 2017-04-26T19:07:53.885955Z 0 [Warning] System table 'time_zone' is expected to be transactional.
Apr 27 03:07:53 cce-agile-tools docker[27070]: 2017-04-26T19:07:53.885957Z 0 [Warning] System table 'time_zone_transition_type' is expected to be transactional.
Apr 27 03:07:53 cce-agile-tools docker[27070]: 2017-04-26T19:07:53.885958Z 0 [Warning] System table 'time_zone_transition' is expected to be transactional.
Apr 27 03:07:53 cce-agile-tools docker[27070]: 2017-04-26T19:07:53.886418Z 0 [Warning] System table 'servers' is expected to be transactional.
Apr 27 03:07:53 cce-agile-tools docker[27070]: 2017-04-26T19:07:53.891327Z 0 [ERROR] Incorrect definition of table mysql.db: expected column 'User' at position 2 to have type char(32), found type char(16).
Apr 27 03:07:53 cce-agile-tools docker[27070]: 2017-04-26T19:07:53.891345Z 0 [ERROR] mysql.user has no `Event_priv` column at position 28
Apr 27 03:07:53 cce-agile-tools docker[27070]: 2017-04-26T19:07:53.891482Z 0 [ERROR] Incorrect definition of table mysql.event: expected column 'sql_mode' at position 14 to have type set('REAL_AS_FLOAT','PI
Apr 27 03:07:53 cce-agile-tools docker[27070]: 2017-04-26T19:07:53.891494Z 0 [ERROR] Event Scheduler: An error occurred when initializing system tables. Disabling the Event Scheduler.
Apr 27 03:07:53 cce-agile-tools docker[27070]: 2017-04-26T19:07:53.891805Z 0 [Note] mysqld: ready for connections.
Apr 27 03:07:53 cce-agile-tools docker[27070]: Version: '5.7.13' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)

这说明container已经被systemd管理起来了。如果要设置启动时自动加载的话,继续用systemctl的命令:

~#systemctl enable contaner@mysql.service

用这种方式,对于很多服务来说就可以直接简化到一个配置批量搞定,大大提升效率。

推荐阅读:
自从Centos7/Redha
之前我们通过几个概念简单的介绍
自打从硬件方向研究性能优化起,
首先列出本站之前相关的几篇帖子

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据