在 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
这是最常用的启动命令。它会创建并启动所有在 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 up 不同,docker-compose start 不会创建新的容器,只启动已经存在的容器。
例如:
root@hxstrive:~# docker-compose start Starting mysql ... done Starting nginx ... done
上面启动了两个容器。
这个命令会停止并删除由 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 命令。
这个命令会发送一个 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 文件中使用卷来持久化数据。