本文最后更新于 2024-02-17,文章内容可能已经过时。

什么是docker-compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
参考 https://www.runoob.com/docker/docker-compose.html

简单来说就一个应用,分好几个容器,比如一个web应用除了web容器本身还有数据库容器,一共需要两个容器,就需要打包成一个配置文件统一管理和启动,好部署

详细配置例子

这个例子将nginx容器、halo容器、nextcoud容器、mysql容器、redis容器、wordpress容器打包到一起统一进行管理;其中nginx可以反向代理halo、nextcloud、wordpress容器,其中又有其他容器相互依赖使用的例子,比如nextcloud需要mysql

version: '2.0'
services:
  nginx:
    image: nginx:1.23.1
    restart: always
    ports:
      - "80:80"
      - "443:443"
    expose:
      - "18-190"
      - "210-220"
    #links:
      #- seafile
    container_name: nginx
    privileged: true
    volumes:
      #- /nextcloud/nginx/conf:/etc/nginx- 
      - /nextcloud/nginx/ssl:/ssl
      - /nextcloud/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /nextcloud/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
      - /nextcloud/nginx/conf.d/halo.quinntian.com.conf:/etc/nginx/conf.d/halo.quinntian.com.conf
      - /nextcloud/nginx/conf.d/cloud.quinntian.com.conf:/etc/nginx/conf.d/cloud.quinntian.com.conf
      #- /opt/nginx/html:/usr/share/nginx/html
      #- /opt/nginx/logs:/var/log/nginx
      # - /opt/nginx/proxy.conf:/etc/nginx/proxy.conf
    networks:
      - nginx-net 
    links:
      - nextcloud
      # - halo
      
  
  halo:
    image: halohub/halo:1.5.4
    container_name: halo
    restart:  unless-stopped
    ports: 
      - "8090:8090"  
    volumes:
      - /nextcloud/halo:/root/.halo
    command:
      - halohub/halo:1.5.4
    networks:
      - nginx-net   
  nextcloud:
    image: nextcloud
    container_name: nextcloud
    restart: always
    ports: 
      - "9090:80"
    volumes:
      - /nextcloud/nextcloud-data/var/www/html:/var/www/html
    networks:
      - nginx-net
    links:
      - mysql
      - redis
     
  mysql:
    image: mysql
    container_name: mysql
    restart: always
    ports: 
      - "9091:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=yourpassword  # Requested, set the root's password of MySQL service.
      - MYSQL_LOG_CONSOLE=true
      # - MYSQL_USER=wordpress   
      # - MYSQL_PASSWORD=yourpassword
    volumes:
      - /nextcloud/mysql/usr/local/mysql/conf:/etc/mysql/conf.d 
      - /nextcloud/mysql/usr/local/mysql/logs:/logs 
      - /nextcloud/mysql/usr/local/mysql/data:/var/lib/mysql
    networks:
      - nginx-net
    
  redis:
    image: redis
    container_name: redis
    restart: always
    ports: 
      - "9092:6379"
    volumes:
      - /nextcloud/redis/data:/data
      - /nextcloud/redis/conf/redis.conf:/etc/redis/redis.conf
    networks:
      - nginx-net  
    command:
      # 以配置文件的方式启动 redis.conf
      redis-server /etc/redis/redis.conf
  wordpress:
    image: wordpress:latest
    container_name: wordpress
    depends_on:
      - mysql
    ports:
      - 9093:80
    restart: always
    networks:
      - nginx-net
    links:
      - mysql
    environment:
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: yourpassword
    volumes:
      - /nextcloud/wordpress/wp-content:/var/www/html/wp-content 
      - /nextcloud/wordpress/php-conf/php.ini:/usr/local/etc/php/php.ini     
networks:
  nginx-net: 
    driver: bridge

具体标签解释说明

  • service 该标签底下设置一个服务底下的一个个容器,比如web容器,数据库容器
    • 节点名,比如nginx,代表nginx这个服务,格式是 - 节点名
    • image 表示拉取的docker镜像,一般的格式是 路径名:版本号
    • restart 表示重启的时机
    • ports 指定暴露给宿主机的端口号,一般格式是 -[绑定宿主机的端口号:容器内的端口号]
    • exports 暴露给其他容器内的端口号 -一般格式是 -端口号
    • links 用于指向其他服务
      该节点用于指定多个容器构成的服务的内网,比如容器1,指定一个名字,那么其他服务访问这个容器时候就不需要用IP地址,直接用这个名字即可;需要与networks标签配合使用,即要指定一个所属网络,格式是 -名称
    • networks 用于配置该容器属于哪个网络,格式是-所属网络
    • container_name 容器名
    • volumes 映射宿主机和容器的路径
      • 格式是 宿主机路径:容器内路径
    • environment 设置环境变量,即容器内的服务可以读取相关配置的环境变量
    • command 设置相关命令,比如启动容器附带执行的命令
  • network 标签,用于配置整个大的服务的网络
    • 底下的第一个标签用于配置网络名
      • driver 表示该网络的网络模式