Docker Compose · CapRover
Mục Lục
What is Docker Compose?
For Docker newbies, lots of examples that you find on the internet are Docker Compose. For example, this is a simple Docker Compose for WordPress:
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:
{}
It is pretty self-explanatory. It defines one or multiple services (apps) and their configurations such as persistent volumes, mapped ports, environment variable and etc. Docker compose is a really easy and readable way to define a set of apps that need to be working together. Usually to run a docker compose file, you need to run something like:
docker-compose -f my
-docker-compose.yml up
Relationship to CapRover – Bad
CapRover is just a thin layer around Docker. It uses docker to build and run your applications. It does all of these through Docker API.
Although Docker Compose a feature in Docker CLI, it is NOT available in Docker API. This means CapRover cannot handle docker compose files.
Relationship to CapRover – Good
Having said that, CapRover has a built in system to parse out docker-compose (partially) and converts it to pieces that Docker API understands. In fact, this is exactly how CapRover one click apps work. One click apps, are just templatized variant of Docker Compose files. For example, this is the one click app for 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
As you can see, the top part is very similar a Docker Compose!
How to Run Docker Compose on CapRover
Note that, as mentioned above, the built-in parser does not support all fields that are available in docker compose. Specifically, it only supports: image
, environment
, ports
, volumes
, depends_on
, and hostname
, other parameters are currently being ignored by CapRover.
Assuming that your Docker Compose doesn’t have any of these parameters, or they are not crucial for your application, you can simply run Docker Compose by
-
Navigate to Apps
-
Click on “One Click Apps/Databases”
-
Navigate to the very bottom of the list, and click on the last item, called
>> TEMPLATE <<
-
Copy the following section to the box:
captainVersion:
4
caproverOneClickApp:
instructions:
start:
Just
a
plain
Docker
Compose.
end:
Docker
Compose
is
deployed.
- After
########
, copy the entire content of your Docker Compose. Keep in mind that your services will get prefixed withsrv-captain--
when deployed via CapRover. Hence make changes if needed. For example, the complete wordpress docker compose will look like this in 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
WORDPRESS_DB_USER:
wordpress
WORDPRESS_DB_PASSWORD:
wordpress
WORDPRESS_DB_NAME:
wordpress
volumes:
db-data:
{}
Alternative Approach
If you can’t make it work with a one click app template, there is another option! You can simply run pure docker compose by download the compose file and run docker compose up
. But before that just add captain-overlay-network
to your web application section of your docker compose yaml file:
web-app:
image:
.....
container_name:
......
networks:
-
captain-overlay-network
networks:
captain-overlay-network:
external:
true
Now instead of potential port mapping that you might have, like 8080:80
, you can just create a CapRover “Nginx Reverse Proxy” app and use your container name as the upstream proxy, like http://web-app
and done!