使用Docker Compose管理Docker容器
在我们开始讨论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