Docker Compose教程:了解高级Docker和Docker Compose

作者 : IT 大叔 本文共8148个字,预计阅读时间需要21分钟 发布时间: 2020-09-28

Docker简要复习

Docker是一种开源容器化工具,用于通过使用容器的概念来简化应用程序的创建和部署。容器使我们可以打包应用程序的所有部分,并将其部署为一个实体。该工具使不同的开发人员可以轻松地在同一环境中处理同一项目,而没有任何依赖性或操作系统问题。Docker有点像虚拟机,但是Docker使应用程序能够访问相同的Linux内核。Docker为开发人员和DevOps团队提供了许多优势。码头工人…

  • 大型和小型公司对此都有很高的要求
  • 提供与主系统的隔离
  • 简化配置
  • 通过Docker Hub提供对数千个已配置映像的访问
  • 支持Travis和Jenkins等许多CI工具
  • 允许开发人员仅专注于编写代码
  • 简化运营团队的部署管理

Docker通常与Kubernetes一起使用,Kubernetes是一个功能强大的容器管理工具,可自动部署Docker容器。虽然Docker用于将您的应用程序隔离,打包和运送到容器中,但Kubernetes类似于用于部署和扩展应用程序的容器调度程序。两种技术旨在协同工作,使应用程序部署轻而易举。

Docker基础

在深入研究高级Docker概念(例如Docker Compose)之前,我们要确保刷新整个Docker的基础知识。让我们定义和探索Docker的基础。

Docker架构

Docker体系结构由层组成,我们将在下面讨论。最底层是我们用来托管虚拟机的物理服务器。这与传统的虚拟化体系结构相同。第二层是主机OS,它是基础计算机(即Windows或Linux)。接下来是Docker引擎,我们使用它来运行操作系统。上面是作为Docker容器运行的Apps。这些Docker对象由映像和容器组成。

容器和图片

Docker的基本结构依赖于映像容器。将图像和容器视为同一基础概念的两个不同状态。容器就像一个对象,图像就像它的类。可以将容器视为一个隔离的系统,其中包含运行某个应用程序所需的一切。它是模拟所需环境的图像实例。下面是运行ubuntu Docker容器时的示例命令:

docker run --t ubuntu /bin/bash

另一方面,图像用于启动容器。从运行的容器中,我们可以获取图像,这些图像可以组合在一起以形成与应用程序无关的系统方式。可以预先构建图像,从注册表中检索图像,从现有图像中创建图像,也可以通过公用网络将它们组合在一起。

Dockerfiles

Dockerfile是我们如何对应用程序进行容器化,或者如何从已经预先构建的映像中构建新容器并添加自定义逻辑来启动应用程序。从Dockerfile中,我们使用Docker build命令创建映像。将Dockerfile视为一个文本文档,其中包含我们在命令行上调用的用于构建映像的命令。以下是Dockerfile的示例:

FROM python:3
 
WORKDIR /usr/src/app
 
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
 
COPY . .
 
CMD [ "python", "./your-daemon-or-script.py" ]

层数

Dockerfile可分层工作。这些是Docker的构建块。第一层以开头,FROMkeyword并定义了我们将使用哪个预构建图像来构建图像。然后,我们可以定义用户权限和启动脚本。在Docker中,容器是在只读层之上具有可读层的映像。这些层称为中间映像,它们是在构建阶段在Dockerfile中执行命令时生成的。

Docker集线器

Docker Hub是一个Docker注册表,可提供无限的公共映像存储空间和用于托管私有映像的付费计划。任何人都可以访问公共图像。创建帐户后,即可在Docker Hub上发布和访问图像。您可以使用docker build命令或docker标签执行此操作以生成映像ID。您可以使用以下命令在Docker Hub上发布映像:

docker login
docker push learnbook/webserver

在我们继续介绍高级概念之前,这只是Docker基础知识的概述。请记住,Docker的功能远不止我们上面讨论的内容。

Docker Compose教程:了解高级Docker和Docker Compose插图Docker Compose入门

现在介绍高级内容。Docker Compose是用于定义和运行多容器应用程序的Docker工具。通过Compose,您可以使用YAML文件来配置应用程序的服务,并根据该配置创建所有应用程序的服务。可以将其docker-compose视为自动化的多容器工作流程。Compose是用于开发,测试,CI工作流和登台环境的出色工具。根据Docker文档,Docker Compose最受欢迎的功能是:

  • 单个主机上的多个隔离环境
  • 创建容器时保留卷数据
  • 仅重新创建已更改的容器
  • 变量和环境之间的合成移动
  • 协调多个可以协同工作的容器

Docker Compose教程:了解高级Docker和Docker Compose插图(2)

如何使用和安装Docker Compose

Compose使用Docker引擎,因此您需要在设备上安装Docker引擎。您可以在Windows,Mac和64位Linux上运行Compose。安装Docker Compose实际上非常容易。在桌面系统(例如Mac和Windows的Docker桌面)上,已经包含Docker Compose。无需其他步骤。在Linux系统上,您需要:

  1. 安装Docker引擎
  2. 运行以下命令以下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -/usr/local/bin/docker-compose
  1. 将权限应用于二进制文件,如下所示:
sudo chmod +/usr/local/bin/docker-compose
  1. 测试安装以检查其是否正常运行
$ docker-compose --version
docker-compose version 1.26.2, build 1110ad01

有关安装Docker和Compose的更多详细信息,请访问官方Docker文档页面

无论选择哪种安装方式,一旦下载并正确运行了Docker Compose,就可以将其与Dockerfiles一起使用。此过程需要三个基本步骤:

  1. 使用Dockerfile定义应用程序的环境。这样,它可以被复制。
  2. docker-compose.yml文件中为您的应用定义服务。这样,它们可以在隔离的环境中运行。
  3. 运行docker-compose以启动您的应用程序。

您可以轻松地将Docker Compose添加到现有项目中。如果您已经有一些Dockerfile,请通过打开命令面板添加Docker Compose文件。使用Docker:将Docker Compose Files导入Workspace命令,并在升级后选择要包含的Dockerfile。

添加Dockerfile时,还可以将Docker Compose文件添加到工作区。同样,打开命令面板并使用Docker:将Docker文件添加到工作区命令。然后将询问您是否要添加任何Docker Compose文件。在这两种情况下,Compose扩展名都将docker-compose.yml文件添加到您的工作区中。

Docker Compose文件结构

现在我们知道了如何下载Docker Compose,我们需要了解Compose文件如何工作。它实际上比看起来简单。简而言之,Docker Compose文件通过应用在单个docker-compose.yml配置文件中声明的多个命令来工作。Docker Compose YAML文件的基本结构如下所示:

version: 'X'

services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: redis

现在,让我们看一下Docker Compose文件的真实示例,并逐步分解该文件以更好地理解所有这些内容。请注意,此示例中的所有子句和关键字都是常用的关键字和行业标准。有了这些,您就可以开始开发工作流程。您可以在生产中使用一些更高级的关键字,但是现在,让我们开始使用必要的子句。

version: '3'
services:
  web:
    # Path to dockerfile.
    # '.' represents the current directory in which
    # docker-compose.yml is present.
    build: .

    # Mapping of container port to host
    
    ports:
      - "5000:5000"
    # Mount volume 
    volumes:
      - "/usercode/:/code"

    # Link database container to app container 
    # for reachability.
    links:
      - "database:backenddb"
    
  database:

    # image to fetch from docker hub
    image: mysql/mysql-server:5.7

    # Environment variables for startup script
    # container will use these variables
    # to start the container with these define variables. 
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
      - "MYSQL_USER=testuser"
      - "MYSQL_PASSWORD=admin123"
      - "MYSQL_DATABASE=backend"
    # Mount init.sql file to automatically run 
    # and create tables for us.
    # everything in docker-entrypoint-initdb.d folder
    # is executed as soon as container is up nd running.
    volumes:
      - "/usercode/db/init.sql:/docker-entrypoint-initdb.d/init.sql"
  • version ‘3’这表示我们正在使用Docker Compose的版本3,并且Docker将提供适当的功能。在撰写本文时,3.7版是Compose的最新版本。
  • services此部分定义了我们将创建的所有不同容器。在我们的示例中,我们有两个服务,即Web和数据库。
  • web这是我们的Flask应用服务的名称。Docker Compose将使用我们提供的名称创建容器。
  • build这指定了Dockerfile的位置,并.表示文件所在的目录docker-compose.yml
  • ports用于将容器的端口映射到主机。
  • volumes这就像-v在Docker中安装磁盘的选项一样。在此示例中,我们将代码文件目录附加到容器的./code目录。这样,如果进行更改,我们将不必重建图像。
  • links这会将一项服务链接到另一项服务。对于桥接网络,我们必须使用链接指定哪个容器应可访问哪个容器。
  • image如果我们没有Dockerfile,并且想要使用预构建的映像运行服务,则可以使用image子句指定映像位置。Compose将从该图像中派生一个容器。
  • environment该子句允许我们在容器中设置环境变量。这与-e运行容器时Docker中的参数相同。

恭喜!现在,您对Docker Compose和开始工作流程所需的必要部分有所了解。

Docker Compose命令

现在我们知道了如何创建docker-compose文件,让我们看一下可以与文件一起使用的最常见的Docker Compose命令。请记住,我们将只讨论最常用的命令。

docker-compose每个Compose命令都以该命令开头。您还可以使用docker-compose <command> --help提供有关参数和实现详细信息的其他信息。

$ docker-compose --help
Define and run multi-container applications with Docker.

docker-compose build此命令在docker-compose.yml文件中生成图像。该build命令的工作是使映像准备好创建容器,因此,如果服务正在使用预构建的映像,它将跳过此服务。

$ docker-compose build
database uses an image, skipping
Building web
Step 1/11 : FROM python:3.9-rc-buster
 ---> 2e0edf7d3a8a
Step 2/11 : RUN apt-get update && apt-get install -y docker.io

docker-compose images此命令将列出您使用当前docker-compose文件构建的图像。

$ docker-compose images
          Container                  Repository        Tag       Image Id       Size  
--------------------------------------------------------------------------------------
7001788f31a9_docker_database_1   mysql/mysql-server   5.7      2a6c84ecfcb2   333.9 MB
docker_database_1                mysql/mysql-server   5.7      2a6c84ecfcb2   333.9 MB
docker_web_1                     <none>               <none>   d986d824dae4   953 MB

docker-compose stop此命令停止正在运行的指定服务的容器。

$ docker-compose stop
Stopping docker_web_1      ... done
Stopping docker_database_1 ... done

docker-compose run这类似于docker run命令。它将根据为compose文件中提到的服务构建的映像创建容器。

$ docker-compose run web
Starting 7001788f31a9_docker_database_1 ... done
 * Serving Flask app "app.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 116-917-688

docker-compose up此命令完成docker-compose buildand docker-compose run命令的工作。如果图像不在本地,它将生成图像并启动容器。如果已经构建了映像,它将直接分叉容器。

$ docker-compose up
Creating docker_database_1 ... done
Creating docker_web_1      ... done
Attaching to docker_database_1, docker_web_1

docker-compose ps此命令列出当前docker-compose文件中的所有容器。然后它们可以正在运行或停止。

$ docker-compose ps
      Name                 Command             State               Ports         
---------------------------------------------------------------------------------
docker_database_1   /entrypoint.sh mysqld   Up (healthy)   3306/tcp, 33060/tcp   
docker_web_1        flask run               Up             0.0.0.0:5000->5000/tcp
 
$ docker-compose ps
      Name                 Command          State    Ports
----------------------------------------------------------
docker_database_1   /entrypoint.sh mysqld   Exit 0        
docker_web_1        flask run               Exit 0    

docker-compose down此命令类似于该docker system prune命令。但是,在Compose中,它将停止所有服务并清理容器,网络和映像。

$ docker-compose down
Removing docker_web_1      ... done
Removing docker_database_1 ... done
Removing network docker_default
(django-tuts) Venkateshs-MacBook-Air:Docker venkateshachintalwar$ docker-compose images
Container   Repository   Tag   Image Id   Size
----------------------------------------------
(django-tuts) Venkateshs-MacBook-Air:Docker venkateshachintalwar$ docker-compose ps
Name   Command   State   Ports
------------------------------

恭喜!您现在已经了解了Docker Compose的大多数基本命令。为什么停在那里?查阅其他命令的文档并继续学习!

接下来要学什么

我希望这使您熟悉Docker Compose及其提供的所有功能。成为真正的Docker Compose大师还有很多探索和学习。轻松制作docker-compose文件并使用必要的命令后,您可以继续进行以下改进:

  • 在Compose中使用多个Dockerfile(微服务常见)
  • Docker Compose环境变量(.env文件)
  • Docker Swarm(用于扩展和监视集群
  • Docker Stack的自动化部署
  • 和更多

Educative的高级Docker课程“使用容器:Docker和Docker Compose”是学习这些概念及其他内容的理想场所。您不仅可以重温Docker的基础知识,还可以学习高级概念,例如连接到数据库容器和Docker Compose的动手实践。最后,您甚至还将学习如何使用Swarm监视集群和扩展Docker服务。开启您的职业生涯,并成为需求量很大的Docker开发人员!

免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » Docker Compose教程:了解高级Docker和Docker Compose

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论