kubernetes/Docker-MD/Docker-compose.md

9.0 KiB
Raw Blame History

Docker-compose

作者:行癫(盗版必究)


Docker-compose概述

Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose您可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,您可以从您的配置中创建并启动所有服务

Compose 适用于所有环境:生产、登台、开发、测试以及 CI 工作流程

使用 Compose 基本上是一个三步过程:

使用定义您的应用程序的环境,Dockerfile以便可以在任何地方复制它

定义构成您的应用程序的服务,docker-compose.yml 以便它们可以在隔离环境中一起运行

运行docker compose upDocker compose 命令启动并运行您的整个应用程序

举例:

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Docker-compose安装

1.下载

[root@xingdian ~]# curl -SL https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

2.创建软连接

[root@xingdian ~]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

3.添加执行权限

[root@xingdian ~]# chmod a+x /usr/bin/docker-compose

4.验证版本

[root@xingdian ~]# docker-compose --version
Docker Compose version v2.6.0

Docker-compose入门

1.设置

定义应用程序依赖项:

1.为项目创建一个目录:

[root@xingdian ~]# mkdir composetest
[root@xingdian ~]# cd composetest

2.在项目目录中创建一个名为的文件app.py并将其粘贴到:

[root@xingdian composetest]# cat app.py
import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

注意:

在此示例中,redis是应用程序网络上的 redis 容器的主机名。我们使用 Redis 的默认端口,6379

3.在您的项目目录中创建另一个名为的文件requirements.txt并将其粘贴到

flask
redis

2.创建 Dockerfile

编写一个构建 Docker 映像的 Dockerfile。该映像包含 Python 应用程序所需的所有依赖项,包括 Python 本身

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

注意:

从 Python 3.7 映像开始构建映像

将工作目录设置为/code

设置命令使用的环境变量flask

安装 gcc 和其他依赖项

复制requirements.txt并安装 Python 依赖项

向镜像添加元数据以描述容器正在侦听端口 5000

将项目中的当前目录复制.到镜像中的workdir .

将容器的默认命令设置为flask run

3.Compose 文件中定义服务

在项目目录中创建一个名为的文件docker-compose.yml并粘贴以下内容:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

这个 Compose 文件定义了两个服务:webredis

注意:

该服务使用从当前目录中web构建的图像。Dockerfile然后它将容器和主机绑定到暴露的端口,8000. 此示例服务使用 Flask Web 服务器的默认端口,5000

redis服务使用 从 Docker Hub 注册表中提取的公共Redis映像

4.使用 Compose 构建并运行您的应用程序

[root@xingdian composetest]# docker-compose up
[+] Building 95.0s (6/10)
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 291B                                                        0.0s
[+] Building 481.8s (6/10)
 => [internal] load build definition from Dockerfile                                        0.0s
 => => transferring dockerfile: 291B                                                        0.0s
 => [internal] load .dockerignore                                                           0.0s
 => => transferring context: 2B                                                             0.0s
 => [internal] load metadata for docker.io/library/python:3.7-alpine                        4.3s
 => [1/6] FROM docker.io/library/python:3.7-alpine@sha256:a03bd8ebf621e25cc51ee80cb82d04ca  0.0s
 => [internal] load build context                                                           0.0s
 => => transferring context: 1.06kB                                                         0.0s
 => CACHED [2/6] WORKDIR /code                                                              0.0s
 => [3/6] RUN apk add --no-cache gcc musl-dev linux-headers                               477.5s
 => => # ERROR: libgomp-11.2.1_git20220219-r2: temporary error (try again later)
 => => # (5/12) Installing libatomic (11.2.1_git20220219-r2)
 .............
 composetest-web-1    |    Use a production WSGI server instead.
composetest-web-1    |  * Debug mode: off
composetest-web-1    |  * Running on all addresses (0.0.0.0)
composetest-web-1    |    WARNING: This is a development server. Do not use it in a production deployment.
composetest-web-1    |  * Running on http://127.0.0.1:5000
composetest-web-1    |  * Running on http://172.19.0.2:5000 (Press CTRL+C to quit)

5.测试访问

在浏览器中输入 http://localhost:8000/ 以查看正在运行的应用程序

image-20220621164601764

6.查看docker镜像

[root@xingdian composetest]# docker images 

image-20220621171235416

注意:

停止应用程序,方法是docker-compose down 在第二个终端的项目目录中运行,或者在启动应用程序的原始终端中按 CTRL+C

7.编辑 Compose 文件以添加绑定挂载

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"

新volumes密钥将主机上的项目目录当前目录挂载到/code容器内允许您即时修改代码而无需重建映像。environment键设置 FLASK_ENV环境变量它告诉flask run在开发模式下运行并在更改时重新加载代码。这种模式应该只在开发中使用

8.更新应用程序

由于应用程序代码现在使用卷安装到容器中,因此您可以对其代码进行更改并立即查看更改,而无需重建映像

更改问候语app.py并保存。例如将Hello World! 消息更改为Hello from Docker!

image-20220621172737014

9.在浏览器中刷新应用程序

image-20220621173011640

10.其他命令

[root@xingdian composetest]# docker-compose up -d    //后台运行
[root@xingdian composetest]# docker-compose ps      //列出容器
[root@xingdian composetest]# docker-compose  pause    //暂停服务
[root@xingdian composetest]# docker-compose unpause //取消暂停服务
[root@xingdian composetest]# docker-compose down     //停止并移除容器、网络
[root@xingdian composetest]# docker-compose logs    //查看容器的输出
[root@xingdian composetest]# docker-compose start    //启动服务
[root@xingdian composetest]# docker-compose stop     //停止服务
[root@xingdian composetest]# docker-compose stop [SERVICE...]
[root@xingdian composetest]# docker-compose cp    //在服务容器和本地文件系统之间复制文件/文件夹
[root@xingdian composetest]# docker-compose cp [OPTIONS] SRC_PATH|- SERVICE:DEST_PATH
[root@xingdian composetest]# docker-compose run web env  //为您的服务运行一次性命令,查看 web服务可以使用哪些环境变量