需求分析
- 云服务器有两个 docker 容器,由于服务器会停机,需要在开机的时候能够自动启动;
- 服务器停机,可能导致公网 ip 改变,其中一个容器是源码部署,需要配置连接宿主机即服务器上的 MySQL 服务,所以配置文件中 MySQL 的 ip 的值需要填入每次开机后的实际公网 ip;
- 停机或重启前,执行停机服务,优雅地停止 docker,最后再停机。
解决方案
- 针对需求 a、c,需要注册两个 service 服务,创建 systemd 服务单元文件,放入到
/etc/systemd/system/
,分别为start.service
、stop-docker.service
,这个两个服务分别在服务器启动后、停机前自动执行; - 上述两个服务,执行特定的脚本,
start.service
执行的是start.sh
,stop-docker.service
执行stop.sh
; - 在
start.sh
中,首先获取当前服务器的公网 ip,然后替换掉配置文件中的变量HOST_IP
,最后启动两个容器 - 在
stop.sh
中,停止所有正在运行的容器。
具体执行
列出比较关键的两步,获取公网 ip,以及替换变量
代码语言:bash复制# 获取宿主机公网IP地址
IP=$(curl -s http://100.100.100.200/latest/meta-data/eipv4)
# 替换配置文件中 IP 为宿主机公网 IP 地址
sed -i "s/{{HOST_IP}}/$IP/g" $CONFIG_FILE
创建 systemd 服务单元文件,格式如下,主要分为三个部分 [Unit]、[Service]、[Install]
代码语言:vim复制# start.service
[Unit]
Description=Java Application
After=network.target
[Service]
Type=simple
ExecStart=/yourpath/to/start.sh
Restart=on-failure
User=YOURUSER
WorkingDirectory=/yourpath/to
[Install]
WantedBy=multi-user.target
# stop-docker.service
[Unit]
Description=Stop Docker Containers
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
[Service]
Type=oneshot
ExecStart=/opt/dataease2.0/stop.sh
[Install]
WantedBy=halt.target reboot.target shutdown.target
收获
- 第一次接触到自动化脚本工具,并使用其解决需求;
- 需要进一步熟悉 Linux 命令行,以及思考命令行背后的逻辑,对 systemctl 命令控制的那些服务都不熟悉;