Docker容器不会以systemctl开头

我刚刚开始检查coreos

我已经尝试设置redis和mysql docker实例,但没有多大成功。

我最初希望所有的东西都可以开箱即用,但似乎并非如此。

所以基于这个关于 coreos网站systemd的文档 ,我决定尝试这个来启动我的docker instace

cd /etc/systemd/system sudo systemctl enable redis.service $ sudo systemctl start redis.service 

这没有奏效。

我使用docker事件来跟踪它的初始化

 docker event & 

我不知道我可能错过了什么..

这是我的云configuration文件

 #cloud-config hostname: user1 # include one or more SSH public keys ssh_authorized_keys: - ssh-rsa.... users: - name: user2 passwd: temp123 groups: - sudo - docker ssh-authorized-keys: - ssh-rsa.... coreos: etcd2: #generate a new token for each unique cluster from https://discovery.etcd.io/new?size=#{number_instances} discovery: https://discovery.etcd.io/fdadfadjskd546887878kfksdjfds # multi-region and multi-cloud deployments need to use 1.1.1.1 advertise-client-urls: http://1.1.1.1:2379 initial-advertise-peer-urls: http://2.2.2.2:2380 # listen on both the official ports and the legacy ports # legacy ports can be omitted if your application doesn't depend on them listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001 listen-peer-urls: http://2.2.2.2:2380,http://2.2.2.2:7001 fleet: public-ip: 1.1.1.1 flannel: interface: 3.3.3.51/23 units: - name: systemd-networkd command: stop - name: 00-static.network runtime: true content: "[Match]\n\ Name=ens19\n\ [Network]\n\ Address=3.3.3.3/23\n\ Gateway=3.3.3.255\n\ DNS=8.8.8.8\n\ DNS=8.8.4.4 \n" - name: systemd-networkd command: start - name: etcd2.service command: start - name: fleet.service command: start - name: redis.service command: start enable: true content: "[Unit]\n\ Description=Redis Server Docker Container\n\ After=docker.service\n\ Requires=docker.service\n\ [Service]\n\ TimeoutStartSec=0 \n\ EnvironmentFile=/etc/environment\n\ ExecStartPre=-/usr/bin/docker kill %p\n\ ExecStartPre=-/usr/bin/docker rm %p\n\ ExecStartPre=/usr/bin/docker pull redis:latest \n\ ExecStart=/usr/bin/docker run --name=redis --detach=true --publish=6379:6379 redis \n\ ExecStop=/usr/bin/docker stop redis \n\ [Install] \n\ WantedBy=multi-user.target \n" - name: mysql.service command: start enable: true content: "[Unit]\n\ Description=MySQL Server Docker Container\n\ After=docker.service\n\ Requires=docker.service\n\ [Service]\n\ TimeoutStartSec=0 \n\ EnvironmentFile=/etc/environment\n\ ExecStartPre=-/usr/bin/docker kill %p\n\ ExecStartPre=-/usr/bin/docker rm %p\n\ ExecStartPre=/usr/bin/docker pull mysql:latest \n\ ExecStart=/usr/bin/docker run --name=mysql --env MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} --env MYSQL_USER=${MYSQL_USER} --env MYSQL_PASSWORD=${MYSQL_PASSWORD} --env MYSQL_DATABASE=${MYSQL_DATABASE} --detach --publish 3306:3306 --volume=/path/to/dumps/:/dumps/ mysql\n\ ExecStop=/usr/bin/docker stop mysql\n\ [Install] \n\ WantedBy=multi-user.target \n" write_files: - path: /etc/environment permissions: 0644 content: "\nMYSQL_USER='user1'\n\ MYSQL_DATABASE='db1'\n\ MYSQL_CONTAINER_NAME='mysql'\n\ MYSQL_ROOT_PASSWORD=$(cat /dev/urandom | LC_CTYPE=C tr -dc 'a-zA-Z0-9' | fold -w 32 | sed 1q) \n" 

您需要查看(或发布)该服务的systemd日志。 如果redis启动不正确,它将显示在日志中:

journalctl -u redis.service

另外,分享docker事件信息。

你正在分离模式下运行redis容器,所以docker实用程序启动容器,然后退出。 从systemd的angular度来看,这看起来像受控进程退出,所以systemd执行ExecStop脚本,在你的情况下停止redis容器。

您需要保持进程运行,以便systemd不会尝试停止或重新启动您的容器。 达到这个目的的一个方法就是去掉--detach标志。 你也可以使用KillMode=none这样systemd不会发送SIGTERM到ExecStop工具,而只会执行ExecStop

 [Unit] Requires=docker.service After=docker.service [Service] TimeoutStartSec=0 KillMode=none Restart=always RestartSec=5s ExecStartPre=-/usr/bin/docker kill %p ExecStartPre=-/usr/bin/docker rm -v %p ExecStart=/usr/bin/docker --name=redis --publish=6379:6379 redis ExecStop=/usr/bin/docker stop %p ExecStopPost=-/usr/bin/docker stop %p