本文将介绍Docker Compose并展示如何根据您的需求进行操作。我们将安装它,编写一个简单的Compose文件并启动容器。
然后,我们将看到如何启动多个容器。然后,我们将看到如何构建映像以及最近如何使用多个Compose文件在不同的环境(例如开发和生产)中启动容器。
在本教程中,您将学习:
- 如何安装Docker Compose
- 如何编写一个简单的撰写文件
- 如何执行docker-compose命令以启动和停止容器
- 如何启动多个容器
- 如何使用Docker Compose构建映像
- 如何使用多个Docker Compose文件覆盖
使用的软件要求和约定
类别 | 要求,约定或使用的软件版本 |
---|---|
系统 | Ubuntu 18.04 |
软件 | Docker撰写 |
其他 | 以root身份或通过root特权访问Linux系统sudo 命令。 |
约定 | #-要求给出linux命令可以直接以root用户身份或通过使用root特权以root特权执行sudo 命令$-要求给出linux命令以普通非特权用户身份执行 |
介绍
到目前为止,我们已经看到了Docker在管理映像和启动容器方面的优势。但是经常的应用程序要求不同的容器启动并相互通信。通过网络连接它们,使它们共享磁盘卷,传递环境变量很容易变成一系列命令,这些命令难以记录和维护。进入Docker Compose。让我们开始安装它,然后编写Compose文件。
安装Docker Compose
在Ubuntu 18.04中,安装Docker Composer非常简单:
# apt install docker-compose
要测试其是否已安装,可以检查其版本:
$ docker-compose -v
docker-compose version 1.17.1, build unknown
Docker Engine和Docker Compose版本很重要,因为它们的发布频繁,并且添加和删除了功能。上面显示的版本(1.17.1)于2017年11月发布。如果需要更新的版本,则可以启用Ubuntu的Universe存储库并获取更新的软件包,甚至可以直接从Docker Compose网站下载并安装最新版本:
# curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# sudo chmod +x /usr/local/bin/docker-compose
Docker Compose文件
Docker Compose读取一个YAML文件,该文件通常命名为docker-compose.yml
。
version: "3"
services:
apache:
image: php:7.3-apache
container_name: 'apache'
ports:
- "80:80"
volumes:
- ./www:/var/www/html
开头的语法版本为3。接下来,在services部分中,仅指定了一个容器(apache),并且标记image
,container_name
,ports
和volumes
用于描述应如何执行。
现在创建一个名为www
放下index.html
文件里面。
<html>
<body>
Hello
</body>
</html>
接下来,要测试PHP是否正常运行,只需将此文件放入其中www
。
<?php
phpinfo();
?>
Docker撰写命令
的up
该命令将处理所有事情:从Docker Hub下载图像(如果它们仍不存在于本地缓存中),构建自定义图像(不是这种情况;我们将在下一部分中介绍)并启动容器。
$ docker-compose up -d
的-d
switch指示Docker Compose在后台运行容器。如果使用另一个文件名,而不是docker-compose.yml
,可以通过-f
。
请注意,启动命令比它简单得多docker
运行对方。它还有两个优点:无论Compose文件的内容如何,它都不会改变;如果Compose文件指定了多个容器,则将全部启动。只是为了比较,docker run命令将是:
$ docker run -d --name='apache-alone' -p 80:80 -v $PWD/www:/var/www/html php:7.3-apache
因为Compose文件的语法是YAML,所以缩进很重要。如果遇到语法错误,请使用在线解析器检查YAML语法,例如这个。
您可以检查容器是否正在运行。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3937d997e029 php:7.3-apache "docker-php-entrypoi…" 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp apache
现在访问http://localhost
在您喜欢的浏览器中,然后http://localhost/phpinfo.php
。
启动多个容器
现在,让我们看一个更复杂的Compose文件。假设我们要设置一个本地环境来开发LAMP应用程序。我们需要一个带有Apache和PHP的容器,另一个带有MySQL的容器,可能还需要一个PHPMyAdmin容器才能与MySQL交互。的docker-compose.yml
将会:
version: "3"
services:
apache:
image: php:7.3-apache
container_name: 'apache'
restart: 'always'
ports:
- "80:80"
- "443:443"
volumes:
- ./www:/var/www/html
- ./php/php.ini:/usr/local/etc/php/php.ini
- ./sites-enabled:/etc/apache2/sites-enabled
- apache-logs:/var/log/apache2
mysql:
image: mariadb:10.4
container_name: 'mysql'
restart: 'always'
volumes:
- mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somepassword
MYSQL_DATABASE: db_site
MYSQL_USER: user
MYSQL_PASSWORD: password
phpmyadmin:
image: phpmyadmin/phpmyadmin:4.8
container_name: 'phpmyadmin'
environment:
PMA_HOST: mysql
PMA_PORT: 3306
ports:
- '8080:80'
volumes:
apache-logs:
mysql-data:
此Compose文件正在启动三个容器,每个容器在“服务”下都有一个小节。注意我们在下面定义了一些环境变量environment
。的restart: always
定义是指示Docker在启动Docker服务时自动启动容器(例如,在重新启动的情况下)。
启动三个容器的命令与前面的简单示例相同。容易记住,对不对?
$ docker-compose up -d
检查容器是否已创建。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f76ece3508fe phpmyadmin/phpmyadmin:4.8 "/run.sh supervisord…" 20 seconds ago Up 4 seconds 9000/tcp, 0.0.0.0:8080->80/tcp phpmyadmin
69b1b5054f3d mariadb:10.4 "docker-entrypoint.s…" 20 seconds ago Up 6 seconds 3306/tcp mysql
6747d7580dac php:7.3-apache "docker-php-entrypoi…" 2 days ago Up 14 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp apache
有趣的是,这些容器可以通过其名称进行通信并访问彼此的端口,而无需将其端口暴露给主机。例如,我们没有公开MySQL服务的端口3306(如上面的输出所示),但是PHPMyAdmin可以访问此端口。要访问PHPMyAdmin,请转到http://localhost:8080
并使用MySQL服务中定义的用户名和密码(用户名/密码)登录。
使用Docker Compose构建映像
如果您需要构建映像,而不是使用现有映像,只需添加一个build
标签。在下面的示例中,我们告诉Docker Compose查看Dockerfile的当前目录。图片标签将用于命名新图片。
version: "3"
services:
apache:
build: .
image: my-image-name
container_name: 'apache'
restart: 'always'
ports:
- "80:80"
使用多个Docker Compose文件覆盖
Docker Compose可轻松自定义针对不同环境的容器的启动。您只需要创建调用的覆盖文件并启动指定它们的容器即可。它们将覆盖在基本Compose文件中所做的先前定义。
例如,让我们创建一个名为docker-compose-prod.yml
并为MySQL定义其他密码。
version: "3"
services:
mysql:
environment:
MYSQL_ROOT_PASSWORD: somepassword_other
MYSQL_DATABASE: db_site_other
MYSQL_USER: user_other
MYSQL_PASSWORD: password_other
您可以使用其他主机来启动容器。如果您使用的是同一台主机,则需要删除mysql容器及其关联的卷。否则,将使用具有旧凭据的现有容器。
$ docker stop mysql
$ docker rm mysql
$ docker volume ls
$ docker volume rm directory_mysql-data
然后,您可以执行以下命令。保持文件顺序很重要。可以使用多个文件。在我们的示例中,只有environment
的部分mysql
服务将被覆盖。
$ docker-compose -f docker-compose.yml -f docker-compose-prod.yml up -d
检查容器是否正在运行之后,请尝试使用新凭据访问PHPMyAdmin。
结论
本文介绍了Docker Compose,这是一种用于协调在同一主机中启动多个容器的便捷工具。有很多可能性,强烈建议阅读Docker Compose手册。在下一篇文章中,我们将探索在多个主机之间协调Docker容器的方法。