CapRover

Docker Compose

重要:

如果你很关心 Docker Compose 的支持情况,请在 这个 issue 里留言。

什么是 Docker Compose?

对于 Docker 新手来说,你在网上看到的很多示例其实都是 Docker Compose。比如下面是一个用于 WordPress 的简易 Docker Compose:

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: {}

这个例子非常直观:它定义了一个或多个 service(应用)以及对应的配置,比如持久化卷、端口映射、环境变量等。Docker Compose 是一种很容易阅读和维护的方式,用来声明一组需要协同工作的应用。通常运行一个 docker compose 文件,你会执行类似下面的命令:

docker-compose -f my-docker-compose.yml up

与 CapRover 的关系:限制

CapRover 只是对 Docker 的一层轻量封装。它使用 Docker 来构建并运行应用,相关操作都是通过 Docker API 完成的。

虽然 Docker Compose 是 Docker CLI 的一项功能,但 Docker API 并不提供该能力。这意味着 CapRover 无法直接处理 docker compose 文件。

与 CapRover 的关系:可行方案

话虽如此,CapRover 内置了一套系统,可以对 docker-compose 进行(部分)解析,并将其转换为 Docker API 能理解的内容。事实上,这正是一键应用(One-Click Apps)工作的原理:一键应用本质上就是“模板化”的 Docker Compose 文件。例如,下面就是 WordPress 的一键应用定义:

captainVersion: 4
services:
    $$cap_appname-db:
        image: $$cap_db_type:$$cap_database_version
        volumes:
            - $$cap_appname-db-data:/var/lib/mysql
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: $$cap_db_pass
            MYSQL_DATABASE: wordpress
            MYSQL_USER: $$cap_db_user
            MYSQL_PASSWORD: $$cap_db_pass
        caproverExtra:
            notExposeAsWebApp: 'true'
    $$cap_appname-wordpress:
        depends_on:
            - $$cap_appname-db
        image: wordpress:$$cap_wp_version
        volumes:
            - $$cap_appname-wp-data:/var/www/html
        restart: always
        environment:
            WORDPRESS_DB_HOST: srv-captain--$$cap_appname-db:3306
            WORDPRESS_DB_USER: $$cap_db_user
            WORDPRESS_DB_PASSWORD: $$cap_db_pass
caproverOneClickApp:
    variables:
        - id: $$cap_db_user
          label: Database user
          defaultValue: wordpressuser
          validRegex: /^([a-zA-Z0-9])+$/
        - id: $$cap_db_pass
          label: Database password
          description: ''
          validRegex: /.{1,}/
        - id: $$cap_wp_version
          label: WordPress Version
          defaultValue: '4.9'
          description: Check out their Docker page for the valid tags https://hub.docker.com/r/library/wordpress/tags/
          validRegex: /^([^\s^\/])+$/
        - id: $$cap_db_type
          label: Database Type
          defaultValue: mysql
          description: You can either choose mariadb or mysql, you need to change the version according to which DB is selected. It is case sensitive.
          validRegex: /^(mysql|mariadb)$/
        - id: $$cap_database_version
          label: Database Version, default is MySQL
          defaultValue: '5.7'
          description: Check out the Docker pages for the valid tags https://hub.docker.com/r/library/mysql/tags/ or https://hub.docker.com/_/mariadb?tab=tags
          validRegex: /^([^\s^\/])+$/
    instructions:
        start: >-
            WordPress is an online, open source website creation tool written in PHP. But in non-geek speak, it’s probably the easiest and most powerful blogging and website content management system (or CMS) in existence today.
             Enter your WordPress Configuration parameters and click on next. A MySQL (database) and a WordPress container will be created for you.  The process will take about a minute for the process to finish.
        end: >
            Wordpress is deployed and available as $$cap_appname-wordpress . 
             IMPORTANT: It will take up to 2 minutes for WordPress to be ready. Before that, you might see a 502 error page.
    displayName: WordPress
    isOfficial: true
    description: WordPress is a content management system based on PHP and MySQL that is usually used with the MySQL or MariaDB database
    documentation: Taken from https://docs.docker.com/compose/wordpress/. Port mapping removed from WP as it is no longer needed

可以看到,上半部分和 Docker Compose 非常相似!

如何在 CapRover 上运行 Docker Compose

注意:如上所述,内置解析器并不支持 docker compose 的所有字段。具体来说,它只支持:imageenvironmentportsvolumesdepends_onhostname,其他参数目前会被 CapRover 忽略。

如果你的 Docker Compose 没有使用这些不受支持的字段(或者这些字段对你的应用并不关键),你可以这样“运行 Docker Compose”:

  1. 进入 Apps

  2. 点击 One Click Apps/Databases

  3. 滚动到列表最底部,点击最后一个条目 >> TEMPLATE <<

  4. 将下面这段内容复制到输入框中:

captainVersion: 4
caproverOneClickApp:
    instructions:
        start: Just a plain Docker Compose.
        end: Docker Compose is deployed.
########
  1. ######## 之后,粘贴你 Docker Compose 的全部内容。注意:通过 CapRover 部署后,你的 services 会自动加上 srv-captain-- 前缀,所以你可能需要相应调整引用关系。例如,完整的 WordPress docker compose 在 CapRover 里会变成这样:
captainVersion: 4
caproverOneClickApp:
    instructions:
        start: Just a plain Docker Compose.
        end: Docker Compose is deployed.
########
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: srv-captain--db:3306 ## NOTICE it is changed to "srv-captain--db" from "db"
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db-data: {}

带 CAP_ADD 标记的 Service

如果你使用的是像 OpenVPN 这样的容器,它们通常需要特殊的 cap_add Docker 标记。你可以像下面这样添加:

captainVersion: 4
services:
    openvpn:
        caproverExtra:
            containerHttpPort: 943
        image: linuxserver/openvpn-as:2.9.0-5c5bd120-Ubuntu18-ls124
        environment:
            PUID: 1000
            PGID: 1000
            TZ: UTC
            INTERFACE: ""
        volumes:
            - openvpn:/config
        ports:
            - 9443:9443
            - 1194:1194
        cap_add:
            - NET_ADMIN
caproverOneClickApp:
    displayName: OpenVPN Access Server
    isOfficial: false
    description: Full featured secure network tunneling VPN software.
    documentation: https://openvpn.net/index.php/access-server/overview.html
    instructions:
      start: Just a openvpn Docker Compose with cap_add.
      end: Docker Compose is deployed.

替代方案

如果你无法通过一键应用模板跑起来,还有另一种选择:直接下载 compose 文件并运行原生的 docker compose(例如执行 docker compose up)。不过在此之前,你需要在 docker compose 的 web 应用部分加入 captain-overlay-network

  web-app:
    image: .....
    container_name: ......
    networks:
      - captain-overlay-network

networks:
  captain-overlay-network:
    external: true

这样你就不需要再做端口映射(比如 8080:80)。你可以创建一个 CapRover 的 “Nginx Reverse Proxy” 应用,把容器名作为上游(upstream)代理目标,例如 http://web-app,就可以完成访问了。