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 的所有字段。具体来说,它只支持:image、environment、ports、volumes、depends_on、hostname,其他参数目前会被 CapRover 忽略。
如果你的 Docker Compose 没有使用这些不受支持的字段(或者这些字段对你的应用并不关键),你可以这样“运行 Docker Compose”:
-
进入
Apps -
点击
One Click Apps/Databases -
滚动到列表最底部,点击最后一个条目
>> TEMPLATE << -
将下面这段内容复制到输入框中:
captainVersion: 4
caproverOneClickApp:
instructions:
start: Just a plain Docker Compose.
end: Docker Compose is deployed.
########- 在
########之后,粘贴你 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,就可以完成访问了。