使用Docker Compose管理Docker容器

时间:2020-02-23 14:31:47  来源:igfitidea点击:

在我们开始讨论docker-compose之前,请确保已安装Docker和Docker Compose。

如果项目/应用程序使用多个容器,则尝试单独运行各个容器然后链接它们是不合理的。这是可能的,但很累,带来了扩展的复杂性,而不是DevOps建议之一。因此,docker-com来进行救援。 Docker-compose可运行多个容器,链接它们并在一个文件中定义各种容器属性。该文件称为docker-compose.yml。

Docker组成文件

该文件包含所有已定义的容器属性及其要在指定项目/应用程序中使用的图像。多年来,它已从版本1更改为版本3. 因此,需要在每个docker-compose.yml文件的开头指定要使用的版本。 Docker-compose文件以YAML格式编写,并且格式为docker-compose.yml。一个典型的docker-compose文件如下所示:

version: "3"
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: zuri
      POSTGRES_DB: zuri
      POSTGRES_PASS: zuri1234
    volumes:
      - pgdata:/var/lib/posgresql/data
  zuri:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./zuri:/zuri
    command: python manage.py runserver 0.0.0.0:8000
    depends_on:
      - db
volumes:
  pgdata:

docker-compose文件由各种组件组成。我不会谈论所有这些,但是我会谈一些重要的。本质上,撰写文件定义了控制容器的服务。从上面的示例中,我们可以看到我有两个服务,即db和zuri。 db服务是我的数据库容器,而zuri服务是我的项目。两者通过属性depends_on进行通信。这告诉docker-compose在运行zuri服务时不应该创建该服务。

在每项服务下,我们都可以定义许多属性,例如要公开的端口,要使用的卷,网络等。当然,每个容器都使用一个镜像,因此我们可以在docker-compose文件中直接定义该镜像或者指定要使用的Dockerfile。在此示例中,我们可以看到在zuri服务中,我已经使用定义了构建上下文。这告诉docker-compose在同一目录中查找docker文件以为服务构建镜像。但是数据库服务具有直接定义的Postgres图像。

这是zuri服务dockerfile:

#base image
FROM python:3

#maintainer
LABEL Author="CodeGenes"

# The enviroment variable ensures that the python output is set straight
# to the terminal with out buffering it first
ENV PYTHONBUFFERED 1

#directory to store app source code
RUN mkdir /zuri

#switch to /app directory so that everything runs from here
WORKDIR /zuri

#copy the app code to image working directory
COPY ./zuri /zuri

#let pip install required packages
RUN pip install -r requirements.txt

Docker容器生命周期

Docker容器是短暂的,也就是说,当我们删除容器时,它们会被删除。它们的状态取决于它们托管的应用程序的状态。各种状态包括:

1.创建容器$docker create name <container-name> <image-name>

2.运行容器$docker run -it -d name <容器名称> <图像名称>

3.暂停容器$docker pause <container-id/name>

4.取消暂停容器$docker取消暂停<container-id/name>

5.启动容器$docker start <container-id/name>

6.停止容器$docker stop <container-id/name>

7.重新启动容器$docker restart <container-id/name>

8.杀死容器$docker kill <container-id/name>

9.删除/删除容器$docker rm <container-id/name>

Docker-compose命令

当然,它由容器管理组成,它还包含各种容器命令来管理整个容器生命周期。其中一些命令包括启动,停止,构建视图等

要查看这些命令及其作用,请在终端上运行以下命令:

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

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name (default: directory name)
  --verbose                   Show more output
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the name specified
                              in the client certificate (for example if your docker host
                              is an IP address)
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

Docker-compose运行,启动,执行有什么区别?

好吧,当我开始使用docker时,我会注意到这些教程经常使用docker-compose up,docker-compose run和docker-compose exec而不加解释。我知道我们可以简单地阅读help命令行文档中的区别,但是有时通过更深入地了解区别可以很有帮助。

那么,我们应该使用哪一个呢?我将使用GitHub上的Django Docker项目来说明这些差异。

Docker撰写

当我们要启动或者启动docker-compose.yml文件中的所有服务时,使用此命令。 Docker-compose.yml文件定义了服务,其属性,变量和依赖项。

$docker-compose up

要查看正在运行的容器:

$docker-compose ps

我们还可以告诉docker-compose仅运行一项服务,例如

$docker-compose up zuri

Docker Compose运行

此命令将启动一个新容器供我们使用。它通常在我们需要新容器或者容器未运行时使用,并且是一个一次性的过程,可避免与docker-compose.yml中可能正在运行的其他服务发生冲突。

$docker-compose run zuri python manage.py migrate

Docker Compose Exec

当我们想与已经运行的容器进行交互时,使用此命令。因此,它需要与命令参数一起运行。执行之前,容器必须处于运行状态!

$docker-compose exec zuri bash