当前位置: 首页>>技术教程>>正文


如何使用Docker Compose启动容器

, ,

本文将介绍Docker Compose并展示如何根据您的需求进行操作。我们将安装它,编写一个简单的Compose文件并启动容器。

然后,我们将看到如何启动多个容器。然后,我们将看到如何构建映像以及最近如何使用多个Compose文件在不同的环境(例如开发和生产)中启动容器。

在本教程中,您将学习:

  • 如何安装Docker Compose
  • 如何编写一个简单的撰写文件
  • 如何执行docker-compose命令以启动和停止容器
  • 如何启动多个容器
  • 如何使用Docker Compose构建映像
  • 如何使用多个Docker Compose文件覆盖
PHPMyAdmin

PHPMyAdmin。

使用的软件要求和约定

软件要求和Linux命令行约定
类别 要求,约定或使用的软件版本
系统 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),并且标记imagecontainer_nameportsvolumes用于描述应如何执行。

现在创建一个名为www放下index.html文件里面。


<html>
        <body>
                Hello       
        </body> 
</html>  

接下来,要测试PHP是否正常运行,只需将此文件放入其中www


<?php
        phpinfo();
?>


Docker撰写命令

up该命令将处理所有事情:从Docker Hub下载图像(如果它们仍不存在于本地缓存中),构建自定义图像(不是这种情况;我们将在下一部分中介绍)并启动容器。


$ docker-compose up -d

-dswitch指示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容器的方法。

本Docker文章系列中的更多内容

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/9385.html,未经允许,请勿转载。