Docker容器运行在宿主机上,为了保证容器承载服务的稳定,需要利用一些服务管理器来管理Docker容器的运行状态。Systemd作为一个系统守护进程,通过独立单元的形式管理系统上的服务,比如进程,脚本执行,挂载服务等等,同样可以直接管理容器的启动和关闭。
1. 管理单一容器
下面是一个启动管理配置文件,用于管理一个nginx容器的启动和删除。
[Unit]
Description=Simple Web Server
After=docker.service
Requires=docker.service
[Service]
Restart=always
ExecStartPre=/bin/bash -c '/usr/bin/docker rm -f web-service || /bin/true'
ExecStartPre=/usr/bin/docker pull nginx
ExecStart=/usr/bin/docker run --name web-service -p 80:80 nginx
ExecStop=/usr/bin/docker rm -f web-service
[Install]
WantedBy=multi-user.target
文件创建在/etc/systemd/system
文件夹下,使用下面的命令进行管理即可:
sudo systemctl enable /etc/systemd/system/web.service
sudo systemctl start web.service
sudo systemctl stop web.service
如果修改了配置的话需要重新执行载入命令来加载新的配置项目
sudo systemctl daemon-reload
配置文件中的路径必须是绝对路径
2. 管理多个容器
通过docker-compose可以管理多个容器的运行和启动,同时可以利用systemd来管理docker-compose启动和管理. 以下是一个针对docker compose的配置文件docker-compose.service
:
[Unit]
Description=Docker Compose container starter
After=docker.service network-online.target
Requires=docker.service network-online.target
[Service]
WorkingDirectory=/etc/compose
Type=oneshot
RemainAfterExit=yes
ExecStartPre=-/usr/local/bin/docker-compose pull --quiet
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
ExecReload=/usr/local/bin/docker-compose pull --quiet
ExecReload=/usr/local/bin/docker-compose up -d
[Install]
WantedBy=multi-user.target
这里配置的类型Type=oneshot
和缺省的simple类型像是,但是期待执行的任务会在运行后退出,配合RemainAfterExit=yes
定义在启动程序成功退出的时候依然认为任务是活跃的,缺省是no.
同时可以配合两个额外的脚本实现重载和定时任务.
docker-compose-reload.service
[Unit]
Description=Refresh images and update containers
[Service]
Type=oneshot
ExecStart=/bin/systemctl reload-or-restart docker-compose.service
docker-compose-reload.timer, 设置每隔15分钟执行一次重载,调用docker-compose-reload服务。
[Unit]
Description=Refresh images and update containers
Requires=docker-compose.service
After=docker-compose.service
[Timer]
OnCalendar=*:0/15
[Install]
WantedBy=timers.target
定时任务添加的时候可以使用类似于服务相同的命令添加:
# systemctl enable docker-compose-reload.timer
# systemctl start docker-compose-reload.timer
# systemctl is-active docker-compose-reload.timer
active
任何时候想要直接执行都可以直接调用下面的命令来运行一次重载
# systemctl start docker-compose-reload
检查当前系统中的所有已配置的timer
# systemctl list-timers
附 Docker进程的systemd管理
每个宿主机上都包含有docker进程,这些进程如果需要使用systemd控制和管理的话,可以利用下面的配置,环境变量保存在sysconf文件夹下的docker文件中,具体的配置可以按照自身需求进行修改。
DOCKER_OPTS=""
systemd配置单元文件如下面所示:
[Unit]
Description=Docker Application
After=network.target
Wants=network-online.target
[Service]
Type=notify
EnviromentFile=/etc/sysconfig/docker
ExecStart=/usr/bin/dockerd -H unix://
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target