【问题标题】:Launch docker automatically when starting ec2 server启动 ec2 服务器时自动启动 docker
【发布时间】:2020-11-28 17:37:20
【问题描述】:

每次我重新启动我的 ec2 服务器时,我都必须这样做: sudo systemctl start docker 然后docker-compose up -d 启动我所有的容器。
有没有办法在实例开始时自动运行这两个命令? 我已阅读此answer,我认为理想情况下我想知道如何做到这一点:

创建一个 systemd 服务并启用它。所有启用的系统 服务将在通电时启动。

你知道如何创建这样的 systemd 服务吗?

[编辑 1]:根据 Chris William 的评论,我做了以下工作:

感谢 Chris,所以我创建了一个 docker_boot.service,其内容如下:

[Unit]
Description=docker boot
After=docker.service

[Service]
Type=simple
Restart=always
RestartSec=1
User=ec2-user
ExecStart=/usr/bin/docker-compose -f docker-compose.yml up

[Install]
WantedBy=multi-user.target

我在/etc/systemd/system 文件夹中创建了它

然后我做了:

sudo systemctl enable docker
sudo systemctl enable docker_boot

当我打开服务器时,唯一正在运行的 Docker 映像是 certbot/certbottelethonkids/shinyproxy
请在下面找到我的docker-compose.yml 文件的内容。
您是否看到缺少什么以使所有映像都启动并运行?

version: "3.5"
services:
  rstudio:
    environment:
      - USER=username
      - PASSWORD=password
    image: "rocker/tidyverse:latest"
    build:
     context: ./Docker_RStudio
     dockerfile: Dockerfile
    volumes:
      - /home/ec2-user/R_and_Jupyter_scripts:/home/maxence/R_and_Jupyter_scripts
    working_dir: /home/ec2-user/R_and_Jupyter_scripts
    container_name: rstudio
    ports:
      - 8787:8787

  jupyter:
    image: 'jupyter/datascience-notebook:latest'
    ports:
      - 8888:8888
    volumes:
     - /home/ec2-user/R_and_Jupyter_scripts:/home/joyvan/R_and_Jupyter_scripts
    working_dir: /home/joyvan/R_and_Jupyter_scripts
    container_name: jupyter

  shiny:
    image: "rocker/shiny:latest"
    build:
     context: ./Docker_Shiny
     dockerfile: Dockerfile
    container_name: shiny
    ports:
     - 3838:3838

  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: on-failure
    networks:
     - net
    volumes:
     - ./nginx.conf:/etc/nginx/nginx.conf
     - ./data/certbot/conf:/etc/letsencrypt
     - ./data/certbot/www:/var/www/certbot
    ports:
     - 80:80
     - 443:443
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
    depends_on:
     - shinyproxy

  certbot:
    image: certbot/certbot
    container_name: certbot
    restart: on-failure
    volumes:
     - ./data/certbot/conf:/etc/letsencrypt
     - ./data/certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

  shinyproxy:
      image: telethonkids/shinyproxy
      container_name: shinyproxy
      restart: on-failure
      networks:
       - net
      volumes:
       - ./application.yml:/opt/shinyproxy/application.yml
       - /var/run/docker.sock:/var/run/docker.sock
      expose:
        - 8080

  cron:
   build:
     context: ./cron
     dockerfile: Dockerfile
   container_name: cron
   volumes:
     - ./Docker_Shiny/app:/home
   networks:
     - net

networks:
 net:
   name: net

【问题讨论】:

  • 是 Amazon Linux 2 实例吗?
  • 是 Amazon Linux 2 AMI
  • 你检查过日志吗,docker-compose -f docker-compose.yml logs?也许他们有一些关于为什么失败的信息?

标签: amazon-web-services docker amazon-ec2 docker-compose systemd


【解决方案1】:

使用 Amazon Linux 2 我尝试复制该问题。显然,我没有运行您确切的docker-compose.yml 的所有依赖项,因此我使用来自heredocker-compose.yml 进行验证。文件设置wordpressmysql

我采取的步骤如下(在主文件夹中以ec2-user 执行):

1。安装docker

sudo yum update -y  
sudo yum install -y docker
sudo systemctl enable docker
sudo systemctl start docker

2。安装 docker-compose

sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/bin/docker-compose

sudo chmod +x /usr/bin/docker-compose

3。创建docker-compose.yml

mkdir myapp 

创建文件./myapp/docker-compose.yml:

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

4。创建docker_boot.service

该文件与您的文件不同,因为您的文件中几乎没有潜在问题:

  • 不使用绝对路径
  • ec2-user 可能没有运行 docker 的权限

创建文件./myapp/docker_boot.service:

[Unit]
Description=docker boot
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/ec2-user/myapp
ExecStart=/usr/bin/docker-compose -f /home/ec2-user/myapp/docker-compose.yml up -d --remove-orphans

[Install]
WantedBy=multi-user.target

5。将docker_boot.service复制到systemd

sudo cp -v ./myapp/docker_boot.service /etc/systemd/system

6。启用并启动docker_boot.service

sudo systemctl enable docker_boot.service
sudo systemctl start docker_boot.service

注意:首先start 可能需要一些时间,因为它会拉取所有需要的 docker 镜像。或者先手动启动 docker-compose 以避免这种情况。

7。检查docker_boot.service 的状态

sudo systemctl status docker_boot.service

8。检查 wordpress 是否启动

curl -L localhost:8000

9。重启

通过登录实例并使用sudo systemctl status docker_boot.service 和/或curl -L localhost:8000,检查docker_boot.service 在实例重启后是否正在运行。

【讨论】:

  • 惊人的马尔辛!我已经适应了它,它就像一个魅力!你知道在关闭实例时我应该添加哪些行吗docker-compose down?再次感谢!
  • @ML_Enthousiast 没问题。很高兴它成功了 :-) 我想你可以在[Service] 中尝试ExecStop=/usr/bin/docker-compose -f /home/ec2-user/myapp/docker-compose.yml down。但我还没有验证,所以我不确定。
  • 您可以在 docker-compose 文件中添加“restart: always”。然后你就不需要创建任何 docker_boot.service 文件了。如果 docker 机器开启,容器会自动重启。
【解决方案2】:

要在启动时启动服务,您将运行以下命令 sudo systemctl enable docker

要让它启动你的docker compose up -d 命令,你需要为你的特定操作创建一个新服务,然后使用类似于下面的内容启用它。

[Unit]
After=docker.service
Description=Docker compose

[Service]
ExecStart=docker-compose up -d

[Install]
WantedBy=multi-user.target

更多信息请访问this post

【讨论】:

  • 谢谢克里斯,我在您的评论后添加了更多信息
  • 您能在任何日志中看到任何内容吗?也许是 docker 或 syslog?
  • 我可以为特定容器做docker container_id logs,但这并没有给我真正有用的信息
  • 不,我尝试修改 docker_boot.service 但没有改变。我实际上不知道ExecStart=/usr/local/bin/docker-compose up -dExecStart=/usr/bin/docker-compose up -dExecStart=docker-compose up -d之间哪个命令是正确的