内容目录

compose基本概述

为何需要compose

使用docker命令来部署像wordpress这样的多容器应用会比较繁琐。
因为需要手动指定存储、环境变量等多个参数,这种方法效率较低。

docker pull wordpress
docker pull mysql:8.0
docker run -d --name mysql \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=wordpress \
mysql:8.0

docker run -d --link mysql \
-e WORDPRESS_DB_HOST=mysql:3306 \
-p 8080:80 \
wordpress

如果一个应用 比较复杂,需要维护多个镜像,并且还要创建及管理多个容器,同时容器与容器之间还存在依赖关系,该如何解决?

什么是compose

docker compose是一个单机容器编排工具,它通过YAML文件的方式来定义一组相关联的容器
然后通过docker compose up读取YAML文件,最终完成对应服务容器的创建和启动。

file

docker compose简化了docker应用程序部署的复杂性。主要功能和优点如下:

  • 1.使用YAML文件定义整个应用程序,所需要的服务;
  • 2.一个命令就可以启动和停止整个应用;
  • 3.简化docker应用的部署

compose核心概念

services

services(服务):表示一个容器实例,可以定义容器使用的镜像,容器的网络、以及容器的存储等。
如下示例定义了两个services
db services

  • 1.运行mysql数据库,使用的镜像是mysql:8.0
  • 2.使用environment环境变量的方式来设置数据库的基本信息,如密码和初始数据库

wordpress services

  • 1.运行一个wordpress的容器,使用的镜像是wordpress:6.2.2
  • 2.通过depen_don定义依赖关系,确保在mysql服务启动后才启动wordpress服务
  • 3.使用environment环境变量方式来定义wordpress连接mysql的相关信息
  • 4.使用ports配置项来指定对外开放的端口。
[root@docker-node1 wordpress]# cat docker-compose.yml
services:
  mysql: # 定义服务名称
    image: mysql:8.0 # 定义容器镜像
    restart: always # 定义容器重启策略,always表示容器退出时总是重启
    environment: # 定义mysql容器的系统的环境变量
      MYSQL_ROOT_PASSWORD: oldxu
      MYSQL_DATABASE: wordpress
      MYSQL_USER: app
      MYSQL_PASSWORD: app.oldxu.net

  wordpress: # 定义服务名称
    depends_on:
      - mysql # 定义依赖关系
    image: wordpress:6.2.2 # 定义容器镜像
    environment: # 定义Wordpress容器的系统环境变量
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: app
      WORDPRESS_DB_PASSWORD: app.oldxu.net
    ports: # 定义容器对外的端⼝ 宿主机端⼝:容器端⼝
      - 80:80

network

为了确保wordpressmysql服务可以通过服务名称互相访问,我们需要在docker compose配置中自定义网络。
这样它们就可以通过服务名称进行互联。

  • 1.添加自定义网络:在docker-compose.yaml中定义一个自定义网络的名称和类型,以及地址段范围。
  • 2.指定服务加入的网络:在wordpressmysql服务定义中明确指定加入到自定义网络

通过这种方式,一旦将两个服务加入到同一网络中,wordpressmysql就可以通过定义的服务名称直接访问到彼此。

[root@docker-node1 wordpress]# cat docker-compose.yml
services:
  mysql:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: oldxu
      MYSQL_DATABASE: wordpress
      MYSQL_USER: app
      MYSQL_PASSWORD: app.oldxu.net
    networks: # 定义mysql容器加⼊⾄哪个⽹络名称中
      - blog_net

  wordpress:
    depends_on:
      - mysql # 定义依赖关系
    image: wordpress:6.2.2
    environment:
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: app
      WORDPRESS_DB_PASSWORD: app.oldxu.net
    ports:
      - 80:80
    networks: # 定义wordpress容器加⼊⾄哪个⽹络名称中
      - blog_net

# ⾃定义⽹络名称为blog_net、驱动类型为bridge、地址段范围为172.26.0.0/24。
networks:
  blog_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.26.0.0/24

volumes

除了网络以外,我们还需要考虑数据持久化的问题,因此我们需要为每个服务定义和配置数据卷。
猪样可以确保数据不会在容器删除后丢失。
mysql

  • 1.定义数据卷名称:例如 mysql_data,用于存储mysql的数据。
  • 2.配置mysqlservices使用数据卷:将mysql容器内的/var/lib/mysql目录的数据持久化到mysql_data数据卷中。

wordpress

  • 1.wordpress就不采用数据卷的管理方式,而是采用bindmounting方式来实现;
  • 2.使用volumes将宿主机的某个目录与wordpress容器/var/www/html建立映射,将容器数据持久化到宿主机目录中。
[root@docker-node1 wordpress]# cat docker-compose.yml
services:
  mysql:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: oldxu
      MYSQL_DATABASE: wordpress
      MYSQL_USER: app
      MYSQL_PASSWORD: app.oldxu.net
    networks:
      - blog_net
    volumes: # 使⽤mysql_data卷持久化容器的/var/lib/mysql数据⽬录
      - mysql_data:/var/lib/mysql

  wordpress:
    depends_on:
      - mysql # 定义依赖关系
    image: wordpress:6.2.2
    environment:
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: app
      WORDPRESS_DB_PASSWORD: app.oldxu.net
    ports:
      - 80:80
    networks:
      - blog_net
    volumes: # 将宿主机⽬录与容器⽬录进⾏绑定
      - /data/wordpress:/var/www/html

networks:
  blog_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.26.0.0/24

volumes: # 由于容器需要使⽤mysql_data数据卷进⾏持久化,所以需要使⽤volumes创建该卷
  mysql_data:

compose实战案例-1

wordpress部署

  1. 准备wordpress的完整compose清单文件
[root@docker-node01 wordpresscompose]# cat docker-compose.yml
services:
  mysql:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: 123456
    networks:
      - blog_net
    volumes:
      - mysql_wordpress:/var/lib/mysql

  wordpress:
    depends_on:
      - mysql
    image: wordpress
    environment:
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: 123456
    ports:
      - 80:80
    networks:
      - blog_net
    volumes:
      - /data/wordpress:/var/www/html

networks:
  blog_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.26.0.0/24

volumes:
  mysql_wordpress:
  1. 创建并启动docker-compose中指定的wordpressmysql容器,然后通过-d在后台运行;
# 启动wordpress项目:先启动数据库服务,再启动wordpress服务
docker compose up -d
[+] Running 4/4
 ✔ Network wordpresscompose_blog_net          Created                     0.1s
 ✔ Volume "wordpresscompose_mysql_wordpress"  Created                     0.0s
 ✔ Container wordpresscompose-mysql-1         Started                     0.4s
 ✔ Container wordpresscompose-wordpress-1     Started                     0.6s

# 停止wordpress项目:先停止wordpress服务,然后停止数据库
[root@docker-node01 wordpresscompose]# docker compose stop
[+] Stopping 2/2
 ✔ Container wordpresscompose-wordpress-1  Stopped
 ✔ Container wordpresscompose-mysql-1      Stopped
  1. 查看docker-compose运行的容器
docker compose ps
NAME                           IMAGE       COMMAND                   SERVICE     CREATED         STATUS         PORTS
wordpresscompose-mysql-1       mysql       "docker-entrypoint.s…"   mysql       5 minutes ago   Up 5 minutes   3306/tcp, 33060/tcp
wordpresscompose-wordpress-1   wordpress   "docker-entrypoint.s…"   wordpress   5 minutes ago   Up 5 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp

wordpress验证

  1. 通过浏览器访问宿主机ip,就可以正常访问wordpress

file

  1. 发布文章进行测试
最后修改日期: 2024年9月17日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。