Docker 入门docker compose请看这篇文章

简介


Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. 

Compose works in all environments: production, staging, development, testing, as well as CI workflows. 

Using Compose is basically a three-step process:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.

  2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.

  3. Run docker-compose up and Compose starts and runs your entire app.

 Docker是一个很棒的工具,但要真正充分发挥其潜力,最好是应用程序的每个组件都在自己的容器中运行。对于具有大量组件的复杂应用程序,编排所有容器以一起启动和关闭(更不用说彼此交谈)可能很快变得难以处理。

Docker社区提出了一个名为Fig的流行解决方案,它允许您使用单个YAML文件来编排所有Docker容器和配置。这变得如此受欢迎,以至于Docker团队最终决定基于Fig源制作他们自己的版本。他们称之为Docker Compose。简而言之,它使得处理Docker容器的编排过程(例如启动,关闭和设置容器内链接和卷)非常容易。

在本文结束时,您将安装Docker和Docker Compose,并对Docker Compose的工作原理有基本的了解。

 

Docker和Docker撰写概念


使用Docker Compose需要将一堆不同的Docker概念合二为一,所以在我们开始之前,让我们花一点时间来回顾一下所涉及的各种概念。如果您已经熟悉Docker概念,如卷,链接和端口转发,那么您可能希望继续前进到下一部分。

 

Docker镜像


每个Docker容器都是Docker镜像的本地实例。您可以将Docker镜像视为完整的Linux安装。通常,最小安装仅包含运行映像所需的最少包。这些映像使用主机系统的内核,但由于它们在Docker容器内运行并且只能看到自己的文件系统,因此完全可以在Ubuntu主机上运行像CentOS这样的分发(反之亦然)。

大多数Docker镜像都是通过Docker Hub分发的,Docker Hub由Docker团队维护。大多数流行的开源项目都有相应的镜像上传到Docker Registry,您可以使用它来部署软件。在可能的情况下,最好抓住“官方”镜像,因为Docker团队保证他们遵循Docker最佳实践。

 

Docker镜像之间的通信


Preserve volume data when containers are created🔗

Compose preserves all volumes used by your services. When docker-compose up runs, if it finds any containers from previous runs, it copies the volumes from the old container to the new container. This process ensures that any data you’ve created in volumes isn’t lost.

默认情况下,Docker容器与主机隔离,这意味着默认情况下主机无法访问Docker容器内的文件系统,也无法通过网络与其通信。毋庸置疑,这使得默认情况下配置和处理在Docker容器内运行的映像很困难。

Docker有三种主要方法可以解决这个问题。第一个也是最常见的是让Docker指定将在Docker容器中设置的环境变量。然后,在Docker容器内运行的代码将在启动时检查这些环境变量的值,并使用它们来正确配置自身。

另一种常用的方法是Docker数据卷。Docker卷有两种形式 - 内部和共享。

指定内部卷只意味着对于为特定Docker容器指定的文件夹,数据将在删除容器时保留。例如,如果您想确保挂起的日志文件可能指定了内部/var/log卷。

共享卷将Docker容器内的文件夹映射到主机上的文件夹。这使您可以轻松地在Docker容器和主机之间共享文件。

与Docker容器通信的第三种方式是通过网络。Docker允许通过links端口转发在不同的Docker容器之间进行通信,允许您将Docker容器内的端口转发到主机服务器上的端口。例如,您可以创建一个链接,以允许您的WordPress和MariaDB Docker容器相互通信并进行端口转发,以便将WordPress暴露给外部世界,以便用户可以连接到它。

 

Dockercompose安装


docker容器编排工具,实现对docker多容器的控制

  • 重要概念

    • 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
    • 项目 ( project ):由一组关联的应用容器组成的一个完整业务单元,在 dockercompose.yml 文件中定义
  • 使用步骤

    • Dockerfile 定义应用的运行环境
    • docker-compose.yml 定义组成应用的各服务
    • docker-compose up 启动整个应用

Dockercompose安装

  • 二进制包安装安装
curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

 

使用Docker Compose运行容器


Common use cases🔗

Compose can be used in many different ways. Some common use cases are outlined below.

Development environments

When you’re developing software, the ability to run an application in an isolated environment and interact with it is crucial. The Compose command line tool can be used to create the environment and interact with it.

The Compose file provides a way to document and configure all of the application’s service dependencies (databases, queues, caches, web service APIs, etc). Using the Compose command line tool you can create and start one or more containers for each dependency with a single command (docker-compose up).

Together, these features provide a convenient way for developers to get started on a project. Compose can reduce a multi-page “developer getting started guide” to a single machine readable Compose file and a few commands.

Automated testing environments

An important part of any Continuous Deployment or Continuous Integration process is the automated test suite. Automated end-to-end testing requires an environment in which to run tests. Compose provides a convenient way to create and destroy isolated testing environments for your test suite. By defining the full environment in a Compose file, you can create and destroy these environments in just a few commands:

$ docker-compose up -d
$ ./run_tests
$ docker-compose down

 

现在我们已经安装了Docker Compose,让我们用这个非常简单的例子来测试它。首先,为我们的YAML文件创建一个目录:

[root@www ~]# mkdir  -p /docker/compose/nginx

 编写docker-compose.yml

version: '2.0'
services:
    nginx:
     image: nginx:latest
     network_mode: "bridge"
     ports:
      - "8080:80"
      - "9090:80"
     volumes:
      - "/data:/data"
    
    tomcat:
     image: tomcat:latest 
     network_mode: "bridge"
     ports:
      - "8888:8080"
     volumes:
      - "/data:/data"


#将当前宿主机目录/data目录挂载到web容器内/data/
#nginx容器内的80端口映射到主机的8080端口和9090端口

docker-compose命令基于每个目录工作。您可以在一台计算机上运行多组Docker容器 - 只需为每个容器创建一个目录,为其目录中的每个容器创建一个docker-compose.yml文件。

到目前为止,我们一直在运行docker-compose up并使用CTRL-C它来关闭它。这允许调试消息显示在终端窗口中。但这并不理想,在生产中运行时,您会希望docker-compose更像是服务。一种简单的方法是在会话-d时添加选项up

运行

[root@www compose]# docker-compose up -d
Creating compose_nginx_1
Creating compose_tomcat_1

docker-compose 现在将分叉到后台。要显示您的Docker容器组(已停止且当前正在运行),请使用以下命令:

[root@www compose]# docker-compose ps
      Name                    Command               State           Ports          
----------------------------------------------------------------------------------
compose_nginx_1    /docker-entrypoint.sh ngin ...   Up      0.0.0.0:9090->80/tcp   
compose_tomcat_1   catalina.sh run                  Up      0.0.0.0:8888->8080/tcp


[root@www ~]# ls /data/
registry  www
[root@www nginx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
06a1205034f4        nginx               "/docker-entrypoint.??   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp   nginx_nginx_1

#该-t选项打开一个终端,该-i选项使其具有交互性。这些/bin/bash选项为正在运行的容器打开一个bash shell。请务必使用容器的ID。
[root@www compose]# docker exec -it 06a12 /bin/bash
root@06a1205034f4:/# ls /data
registry  www 

要停止应用程序组的所有正在运行的Docker容器,请在用于启动Docker组的与docker-compose.yml文件相同的目录中发出以下命令:

[root@www nginx]# docker-compose stop
Stopping nginx_nginx_1 ... done
[root@www nginx]# docker-compose ps
    Name                   Command               State    Ports 
---------------------------------------------------------------
nginx_nginx_1   /docker-entrypoint.sh ngin ...   Exit 0 

注意: 如果您需要更有力地关闭东西,也可以使用docker-compose kill

在某些情况下,Docker容器会将其旧信息存储在内部卷中。如果要从头开始,可以使用该rm命令完全删除构成容器组的所有容器:

[root@www nginx]# docker-compose rm
Going to remove nginx_nginx_1
Are you sure? [yN] y
Removing nginx_nginx_1 ... done
[root@www nginx]# docker ps -aq
[root@www nginx]# 

如果您从包含Docker容器和.yml文件的目录以外的目录中尝试这些命令中的任何一个,它将会抱怨并且不会显示您的容器:

Can't find a suitable configuration file in this directory or any parent. Are you in the right directory?

Supported filenames: docker-compose.yml, docker-compose.yaml, fig.yml, fig.yaml

 

©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页