Docker Compose 启动和停止应用

在 Docker Compose 中,可以使用以下命令来启动和停止由 Docker Compose 文件定义的应用程序。

假如我们存在如下 docker-compose.yml 文件:

version: '3'

services:
  mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: 12345678
      MYSQL_DATABASE: demo_db
    volumes:
      - /var/data/mysql:/var/lib/mysql
    networks:
      - mynetwork

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - mysql
    volumes:
      - /var/data/nginx_config:/etc/nginx/conf.d
    networks:
      - mynetwork

networks:
  mynetwork:
    driver: bridge

启动应用

使用 docker-compose up

这是最常用的启动命令。它会创建并启动所有在 Compose 文件中定义的服务。如果容器已经存在,它会重新启动这些容器。

例如:docker-compose up 将启动 Compose 文件中定义的所有服务,并在终端中显示容器的日志输出。

root@hxstrive:~# docker-compose up
Creating network "root_mynetwork" with driver "bridge"
Creating root_mysql_1 ... done
Creating root_nginx_1 ... done
Attaching to root_mysql_1, root_nginx_1
mysql_1  | 2024-09-09 02:17:48+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.0.1-1.el9 started.
nginx_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
...
nginx_1  | 2024/09/09 02:17:48 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
nginx_1  | 2024/09/09 02:17:48 [notice] 1#1: start worker processes
nginx_1  | 2024/09/09 02:17:48 [notice] 1#1: start worker process 20
mysql_1  | 2024-09-09 02:17:49+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql_1  | 2024-09-09 02:17:49+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.0.1-1.el9 started.
...
mysql_1  | 2024-09-09T02:18:02.730724Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql_1  | 2024-09-09T02:18:02.761664Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
mysql_1  | 2024-09-09T02:18:02.762332Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '9.0.1'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
^CGracefully stopping... (press Ctrl+C again to force) 停止容器
Stopping root_nginx_1 ... done
Stopping root_mysql_1 ... done

上面命令启动了两个容器,分别是 nginx 和 mysql 容器。但是,当我们按 Ctrl + C 组合键时,将停止容器,如下:

root@hxstrive:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS                                       NAMES
23e6a5a08971   nginx:latest   "/docker-entrypoint.…"   36 seconds ago   Exited (0) 11 seconds ago                                               root_nginx_1
8576ecc48905   mysql:latest   "docker-entrypoint.s…"   37 seconds ago   Exited (0) 10 seconds ago                                               root_mysql_1
e379d15ddb35   demo_war       "catalina.sh run"        5 days ago       Up 5 days                   0.0.0.0:8081->8080/tcp, :::8081->8080/tcp   demo_war_dev

注意,可以使用 -d 选项在后台运行容器,即 “分离模式”。例如:docker-compose up -d 将启动容器并在后台运行,不会在终端中显示容器的日志输出。

使用 docker-compose start

如果容器已经存在但处于停止状态,可以使用 docker-compose start 命令来启动这些容器。

与 docker-compose up 不同,docker-compose start 不会创建新的容器,只启动已经存在的容器。

例如:

root@hxstrive:~# docker-compose start
Starting mysql ... done
Starting nginx ... done

上面启动了两个容器。

停止应用

使用 docker-compose down

这个命令会停止并删除由 Compose 文件定义的容器、网络和卷。

例如:docker-compose down 将停止并删除所有在 Compose 文件中定义的容器、网络和卷。

root@hxstrive:~# docker-compose down
Stopping root_nginx_1 ... done
Stopping root_mysql_1 ... done
Removing root_nginx_1 ... done
Removing root_mysql_1 ... done
Removing network root_mynetwork

root@hxstrive:~# docker ps -a
CONTAINER ID   IMAGE      COMMAND             CREATED      STATUS      PORTS                                       NAMES
e379d15ddb35   demo_war   "catalina.sh run"   5 days ago   Up 5 days   0.0.0.0:8081->8080/tcp, :::8081->8080/tcp   demo_war_dev
2cbc3c69773f   demo_war   "catalina.sh run"   5 days ago   Up 5 days   0.0.0.0:8082->8080/tcp, :::8082->8080/tcp   demo_war_test
4191738b8d19   demo_war   "catalina.sh run"   5 days ago   Up 5 days   0.0.0.0:8083->8080/tcp, :::8083->8080/tcp   demo_war_prod

注意:我们可以使用 --volumes 选项来删除与容器关联的卷,例如:docker-compose down --volumes 将删除容器和卷。

使用 docker-compose stop

如果只想停止容器而不删除它们,可以使用 docker-compose stop 命令。

这个命令会发送一个 SIGTERM 信号给容器,让容器有机会进行优雅的关闭。如果容器在一段时间内没有停止,它会发送一个 SIGKILL 信号强制停止容器。

root@hxstrive:~# docker-compose stop
Stopping root_nginx_1 ... done
Stopping root_mysql_1 ... done

root@hxstrive:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                     PORTS                                       NAMES
23e6a5a08971   nginx:latest   "/docker-entrypoint.…"   9 minutes ago   Exited (0) 8 seconds ago                                               root_nginx_1
8576ecc48905   mysql:latest   "docker-entrypoint.s…"   9 minutes ago   Exited (0) 7 seconds ago                                               root_mysql_1
e379d15ddb35   demo_war       "catalina.sh run"        5 days ago      Up 5 days                  0.0.0.0:8081->8080/tcp, :::8081->8080/tcp   demo_war_dev

注意事项

在启动和停止 Compose 应用时,需要注意以下几点:

(1) 确保在正确的目录下运行命令,该目录中应该包含 Compose 文件(通常是 docker-compose.yml)。

(2)如果在启动应用时遇到问题,可以查看容器的日志输出以获取更多信息。可以使用 docker-compose logs 命令来查看容器的日志。

(3)在停止应用时,确保已经保存了重要的数据,因为停止应用可能会导致数据丢失。如果需要保留数据,可以在 Compose 文件中使用卷来持久化数据。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号