【Docker】进阶之路:(十二)Docker Composer

【Docker】进阶之路:(十二)Docker Composer

  • Docker Compose 简介
  • 安装 Docker Compose
  • 模板文件语法
    • docker-compose.yml 语法说明
      • image
      • command
      • links
      • external_links
      • ports
      • expose
      • volumes
      • volunes_from
      • environment
      • env_file
      • extends
      • net
      • pid
      • dns
      • cap_add,cap_drop
      • dns_search
      • healthcheck
      • depends_on
      • deploy
      • 完整docker-compose.yml 示例如下:
    • YAML文件格式及编写注意事项
    • Docker Compose 常用命令
      • docker-compose
      • docker-compose up
      • docker-compose ps
      • docker-compose stop
      • docker-compose -h
      • docker-compose down
      • docker-compose logs
      • docker-compose build
      • docker-compose pull
      • docker-compose restart
      • docker-compose rm
      • docker-compose start
      • docker-compose run
      • docker-compose scale
      • docker-compose pause
      • docker-compose kill
      • docker-compose config
      • docker-compose create
      • docker-compose exec
      • docker-compose port
      • docker-compose push
      • docker-compose unpause
      • docker-compose version
    • Docker Compose常用命令汇总清单
  • 使用Docker Compose构建Web应用
    • 1).定义 Python 应用
      • 1.准备项目:
      • 2.创建app.py文件
      • 3.创建Python需求文件composetest/src/requirements.txt
    • 2).创建容器的Dockerfile文件
    • 3).定义docker-compose脚本
    • 4).使用Compose构建并运行应用程序
      • 5).访问我们的网站看看

Docker Compose是一个用来定义和运行复杂应用的 Docker工具。一个使用 Docker 容器的应用 通常由多个容器组成,使用 Docker Compose 则不再需要使用 shell 脚本来启动容器。
Compose通过一个配置文件来管理多个 Docker容器,在配置文件中,所有的容器通过 services 来定义,然后使用 docker-compose 脚本来启动、停止和重启应用,并管理应用中的服务以及所有依 赖服务的容器,非常适合组合使用多个容器进行开发的场景。

Docker Compose 简介

  • Docker Compose 是 Docker 官方的开源项目,负责实现对 Docker容器集群的快速编排。
  • Docker Compose 使用 Python编写,调用 Docker服务提供的 API来对容 器进行管理 。 因此 , 只要所操作的平台支持 Docker API,就可以在其上利用Compose 来进行编排管理。
  • Docker Compose 是一个用来定义和运行复杂应用的 Docker工具。 一个使用Docker 容器的应用, 通常由多个容器组成。Compose 是用于定义和运行多容器 Docker应用程序的工具。通过Compose, 可以使 用YML 文件来配置应用程序需要的所有服务,不再需要使用 shell 脚本来启动容器,使用一个命令就可以从 YML 文件配置中创建并启动所有服务。
  • Compose允许用户通过一个 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的 应用容器为一个项目(project), 即通过配置文件来管理多个 Docker 容器。在配置文件中,所有的 容 器 通 过 services 定义,使用docker-compose 脚本来启动、停止、重启应用,并管理应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
  • YAML的配置文件后缀为.yml, 如 docker-compose.yml。YAML是“YAML Aint a Markup Language” 的 缩 写YAML的语法和其他高级语言类似,可以简单表达清单、散列表、标量等数据形态。 YAML使用空白符号缩进和分行来分隔数据,特别适合用来表达或编辑数据结构、各种配置 文件、调试内容、文件大纲。

Compose使用的3个步骤如下:

  1. 使用 Dockerfile定义应用程序的环境。
  2. 使用docker-compose.yml 定义构成应用程序的服务.这样它们可以在隔离环境中一起运行。
  3. 执行docker-compose up 命令来启动并运行整个应用程序。

Compose模板文件是一个定义服务、网络和数据卷的 YAML 文件。Compose模板文件默认路 径是当前目录下的 docker-compose.yml,可以使用.yml 或.yaml作为文件扩展名。Docker Compose标准模板文件应该包含 version 、services 、networks三大部分,最关键的是services和networks两个部分。docker-compose.yml 的配置示例如下:

#YAML 配置实例
version:·3'
services:
  web:
    build:
    ports:
    - “5000:5000”
    volumes:
    - .:/code
      -1ogvolume01:/var/1og
    links:
    -redis
    redis:
      image:redis
volumes:
    1oqvolume01:

安装 Docker Compose

  • MacOS的 Docker桌面版和 Docker Toolbox已经包括Compose和其他 Docker 应用程序,因此 Mac 用户不需要单独安装 Compose 。
  • Windows的Docker 桌面版和Docker Toolbox已经包括Compose和其他 Docker 应用程序,因此Windows 用户也不需要单独安装 Compose。Docker的安装可以参阅【Docker】进阶之路:(三)Docker 安装。
  • Linux上安装Docker Compose,可以从 GitHub 上下载对应的二进制包来使用。
    官方github版本地址:https://github.com/docker/compose/releases

在这里插入图片描述

运行以下命令以下载Docker Compose的当前稳定版本:

curl -L “https://github.com/docker/compose/releases/download/v2.23.3/docker-compose- ( u n a m e − s ) − (uname -s)- (unames)(uname -m)” -o /usr/local/bin/docker-compose

Docker Compose 存放在GitHub上时下载不太稳定、不方便,因此,也可以通过执行下面的命 令快速安装Docker Compose。

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.23.3/docker-compose-uname -s-uname-m > /usr/local/bin/docker-compose

  • 要安装其他版本的Compose, 请替换中间的版本号(黄色部分)。

看出是否下载成功:

[root@docker ~]# ll /usr/local/bin/
总用量 58304
-rwxr-xr-x. 1 root root 59699273 1210 13:38 docker-compose
[root@docker ~]# 

将可执行权限应用于二进制文件

[root@docker ~]# chmod +x /usr/local/bin/docker-compose
[root@docker ~]# ll /usr/local/bin/
总用量 58304
-rwxr-xr-x. 1 root root 59699273 1210 13:38 docker-compose
[root@docker ~]# 

测试是否安装成功:

[root@docker ~]# docker-compose -v
Docker Compose version v2.23.3
[root@docker ~]# 
  • 注意:对于 alpine, 需要以下依赖包:py-pip 、python-dev 、libffi-dev 、openssl-dev libc-dev 和 make。

模板文件语法

默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过image指令来指定镜 像,也可以通过build指令(需要Dockerfile)来自动构建。

docker-compose.yml 语法说明

image

指定为镜像名称或镜像ID。如果镜像不存在,Compose 将尝试从网络拉取该镜像,例如:

  • image:ubuntu
  • image:orchardup/postgresql
  • image:a4bc65fd
    指定服务的镜像名,若本地不存在,则 Compose 会去仓库拉取这个镜像:
services:
  web:
    image:nginx
build

指定 Dockerfile 所在文件夹的路径:

build:
  ./dir

Compose 将会利用这个路径自动构建镜像,然后使用该镜像。

command

覆盖容器启动后默认执行的命令:

command:bundle exec thin -p 3000 

links

链接到其他服务容器,使用服务名称(同时作为别名)或服务别名(SERVICE:ALIAS) 都可以:

links:
  -db
  -db:database
  -redis

注意: 使用别名时会自动在服务器中的/etc/hosts里创建,比如172.17.2.186 db, 相应的环 境变量也会被创建。

external_links

链接到 docker-compose.yml 外部的容器,甚至不是Compose管理的容器。参数格式和links
似。external_links 文件内容如下:

-redis_1
  -project_db_1:mysql
  -pr oject_db_2:sqlserver

ports

ports 用于暴露端口信息。格式如下:

宿主机器端口:容器端口(HOST:CONTAINER)

或者仅仅指定容器的端口(宿主机将会随机分配端口)也可以:

ports:
  - "3306"        #指定容器端口
  - "8080:80" #宿主机端口:容器端口
  - "127.0.0.1:8090:8001"

注 意:当使用HOST:CONTAINER 格式来映射端口时,如果使用的容器端口小于60,则可 能会得到错误的结果,因为YAML 将会解析xx:yy这种数字格式为六十进制,所以建议采用字符串格式。

expose

暴露端口,与posts 不同的是expose 只能暴露端口而不能映射到主机,只供外部服务连接使用;
仅可以指定内部端口为参数。

expose:
  - "8000"

volumes

设置数据卷挂载的路径。格式为:

宿主机路径:容器路径(host:container)

还可以加上访问模式(host;container:ro), 其中ro 就是 readonly 的意思,表示只读模式。

volumes:
  - /var/lib/mysql:/var/lib/mysql
  - /configs/mysql:/etc/configs/:ro

volunes_from

挂载另一个服务或容器的所有数据卷。

volunes_from:
  - services_name
  - container_name

environment

设置环境变量,可以是数组或字典两种格式。
如果只给定变量的名称,则会自动加载它在Compose主机上的值,可以用来防止泄露不必要的数据 。

environment:
  - RACK_ENV=development
  - SESSION_SECRET

env_file

从文件中获取环境变量,可以为单独的文件路径或列表。如果通过docker-compose-f FILE指定了模板文件,则env_file中路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,以后者为准。

env_file:.env 
env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

环境变量文件中每一行都必须有注释,支持#开头的注释行:

#common.env:Set       Rails/Rack       environment
RACK_ENV=development

extends

基于已有的服务进行服务扩展。比如,已经有了一个webapp服务,模板文件为common.yml:

#common.yml
webapp:
build: ./webapp
environment:
  - DEBUG=false
  - SEND_EMAILS=false

编写一个新的 development.yml文件,使用common.yml 中的webapp 服务进行扩展。
development.yml 文件内容如下:

web:
extends:
file: common.yml
service:
  webapp:
    ports:
      - "8080:80"
    links:
      - db
    envelopment:
      - DEBUG=true
  db:
    image: mysql:5.7

后者会自动继承 common.yml 中 的webapp 服务及相关的环境变量。

net

设置网络模式,使用和docker client 命令的–net 参数一样的值。

#容器默认链接的网络,是所有 Docker  安装时都默认安装的docker0  网络
net:"bridge"
#容器定制的网格栈
net:"none"
#使用另一个容器的网络配置
net:"container:[name or id]"
#在宿主机网络栈上添加一个容器,容器中的网络配置会与宿主机的一样
net:"host"

Docker 会为每个节点自动创建三个网络:
● bridge:容器默认连接的网络,是所有Docker安装时都默认安装的docker0网 络 。
● none:容器定制的网络栈。
● host:在宿主机网络栈上添加一个容器,容器中的网络配置会与宿主机的一样。

pid

和宿主机系统共享进程命名空间,打开该选项的容器可以通过进程id 来相互访问和操作。

pid: "host"

dns

配置 DNS 服务器,可以是一个值,也可以是一个列表。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 114.114.114.114

cap_add,cap_drop

添加或放弃容器的Linux 能力(Capability)。

cap_add:
  - ALL
cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

dns_search

配置 DNS 搜索域,可以是一个值也可以是一个列表。

dns_search: example.com
dns_search:
  - domain1.example,com
  \ - domain2.example.com
      working_dir,entrypoint,user,hostname,domainname,mem_limit,privileged,restart,stdin_open,tty,cpu_shares

这些都和 docker run命令支持的选项类似。

cpu_shares: 73
working_dir: /code
entrypoint: /code/entrypoint,sh
user: postgresql
hostname: foo
domainname: foo.com
mem_limit:1000000000
privileged: true
stdin_open: true
tty: true

healthcheck

健康检查,这是非常有必要的,等服务准备好以后再上线,避免更新过程中出现短暂的无法访 问的问题。

healthcheck:
  test: ["CMD","curl","-f","http://localhost/alive"]
  interval: 5s
  timeout: 3s

其实大多数情况下健康检查的规则都会写在 Dockerfile 中:

FROM nginx
RUN apt-get update 6k apt-get install -y curl sk rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/alive || exit 1

depends_on

依赖的服务,优先启动,示例如下:

depends_on:
  - redis

deploy

都在这个节点下部署相关的配置,示例如下:

deploy:
  mode:  replicated 
  replicas: 2
  restart_policy:
    condition: on-failure
    max_attempts: 3
  update_config:
    delay: 5s
    order: start-first #默认为 stop-first,推荐设置先启动新服务再终止旧的
  resources:
    limits:
      cpus: "0.50"
      memory: 1g
deploy:
  mode: global # 不推荐全局模式(仅个人意见)
  placement:
    constraints: [node.role == manager]

若非特殊服务,以上各节点的配置就能够满足大部分部署场景了。

完整docker-compose.yml 示例如下:

version: '3.5'
services:
 nacos1:
  restart: always
  image: nacos/nacos-server:$(NACOS_VERSION)
  container_name: nacos1
  privileged: true
  ports:
  - "8001:8001"
  - "8011:9555"
  deploy:
   resources:
    limits:
     cpus: '0.50'
     memory: 1024M
    env_file:
     - ./nacos.env
    environment:
     NACOS_SERVER_IP: $(NACOS_SERVER_IP_ 1)
     NACOS_APPLICATION_PORT: 8001
     NACOS_SERVERS: $(NACOS_SERVERS)
    volumes:
     - ./logs_01/:/home/nacos/logs/
     - ./data_01/:/home/nacos/data/
     - ./config/:/home/nacos/config/
    networks:
     - ha-network-overlay
 nacos2:
  restart: always
  image: nacos/nacos-server:$(NACOS_VERSION)
  container_name: nacos2
  privileged: true
  ports:
   - "8002:8002"
   - "8012:9555"
  deploy:
   resources:
   limits:
    cpus: '0.50'
    memory: 1024M
   env_file:
    - ./nacos.env
   environment:
    NACOS_SERVER_IP: $(NACOS_SERVER_IP_2)
    NACOS_APPLICATION_PORT: 8002
    NACOS_SERVERS: $(NACOS_SERVERS)
   volumes:
    - ./1ogs_02/:/home/nacos/1ogs/
    - ./data_02/:/home/nacos/data/
    - ./config/:/home/nacos/config/
   networks:
    - ha-network-overlay
  nacos3:
   restart: always
   image: nacos/nacos-server:$(NACOS_VERSION)
   container_name: nacos3
   privileged: true
   ports:
    - "8003:8003"
    - "8012:9555"
   deploy:
    resources:
    limits:
     cpus: '0.50'
     memory: 1024M
    env_file:
     - ./nacos.env
    environment:
     NACOS_SERVER_IP: $(NACOS_SERVER_IP_3)
     NACOS_APPLICATION_PORT: 8003
     NACOS_SERVERS: $(NACOS_SERVERS)
    volumes:
     - ./1ogs_03/:/home/nacos/1ogs/
     - ./data_03/:/home/nacos/data/
     - ./config/:/home/nacos/config/
    networks:
     ha-network-overlay:
      external: true

YAML文件格式及编写注意事项

使用 Compose 对 Docker 容器进行编排管理时,需要编写 docker-compose.yml文件,初次编写时容易遇到一些比较低级的问题,导致执行 docker-compose up 时出现解析 YAML 文件错误。

比较常见的原因是YAML对缩进的严格要求。YAML文件换行后的缩进不允许使用tab键字符, 只能使用空格,而空格的数量也有要求。经过实际测试,发现每一行增加一个空格用于缩进是正常的。

YAML是一种标记语言,它可以很直观地展示数据序列化格式,可读性高。YAML类似于XML数据描述语言,但语法比XML简单得多。YAML数据结构通过缩进来表示,连续的项目通过减号 来表示,键值对用英文冒号分隔,数组用方括号([])括起来hash用花括号({})括起来。

使用 YAML时需要注意以下事项:

  • 使用缩进表示层级关系时,不支持tab键缩进,只能使用空格键缩进。
  • 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。
  • 通常开头缩进2个空格。
  • 字符后缩进1个空格,如冒号(:)空格、逗号(,)空格、横杠(-)空格、文本之间 的空格。
  • 用#号注释。
  • 如果包含特殊字符用单引号(!')引起来,
  • 布尔值必须用双引号(”“)引起来,
  • 区分大小写。
  • 字符串可以不用引号标注。

Docker Compose 常用命令

docker-compose

命令格式为:

docker-compose [-f<arg?…] [options] [COMMAND] [ARGS…]

选项包括:

  • -f;–file FILE:指定Compose 模板文件,默认为 docker-compose.yml, 可以多次指定。
  • -p,–project-name NAME: 指定项目名称,默认使用所在目录名称作为项目名。
  • -x-network-driver:使用Docker 的可拔插网络后端特性(需要Docker1.9+版 本 ) 。
  • -x-network-driver DRIVER:指定网络后端的驱动,默认为bridge(需要 Docker1.9+ 版 本 ) 。
  • -verbose:输出更多调试信息。
  • -v,–version:打印版本并退出。

docker-compose up

命令格式为:

docker-compose up  [options][-scale  SERVICE=NUM…][SERVICE…]

选项包括:

  • -d:在后台运行服务容器。
  • –no-color: 不使用颜色来区分不同的服务的控制输出。
  • –no-deps: 不启动服务所链接的容器。
  • –force-recreate: 强制重新创建容器,不能与–no-recreate 同时使用。
  • –no-recreate: 如果容器已经存在,则不重新创建,不能与-force-recreate 同时使用。
  • –no-build: 不自动构建缺失的服务镜像。
  • –build: 在启动容器前构建服务镜像。
  • -abort-on-container-exit: 如果任何一个容器被停止,那么就停止所有容器,不能与-d 同时使用。
  • -t,–timeout TIMEOUT: 停止容器时的超时时间(默认为10s)。
  • –remove-orphans: 删除服务中没有在Compose 文件中定义的容器。
  • -scale SERVICE=NUM:设置服务运行容器的个数,将覆盖在 Compose 中通过scale指定的参数,见下文scale命令的讲解。

docker-compose up 启动所有服务。这个命令一定要记住,每次启动都要用到。
docker-compose up -d 在后台启动所有服务。-f 指定使用的Compose模板文件,默认为docker-compose.yml, 可以多次指定。

docker-compose -f docker-compose.yml up -d

docker-compose ps

命令格式为:

docker-compose ps [options][SERVICE…]

docker-compose ps 命令可以列出项目中目前的所有容器。

docker-compose stop

命令格式为:

docker-compose stop [options][SERVICE…]

选项包括:

  • -t,–timeout TIMEOUT: 停止容器时的超时时间(默认为10s)。
    docker-compose stop 命令用于停止正在运行的容器,可以通过 docker-compose start 命令再次启动。

docker-compose -h

命令格式为:

docker-compose -h 

命令用于查看帮助。

docker-compose down

用于停止和删除容器、网络、数据卷、镜像。
命令格式为:

docker-compose down [options]

选项包括:

  • –rmi type:删除镜像,类型必须是:1. all, 删除Compose文件中定义的所有镜像;2. local, 删除镜像名为空的镜像。
  • -v,–volumes:删除已经在 Compose 文件中定义的和匿名的附在容器上的数据卷。
  • –remove-orphans:删除组合文件中未定义的服务的容器。
  • -t,–timeout TIMEOUT:以秒为单位指定关机超时时间,默认值为10s。

docker-compose logs

命令格式为:

docker-compose logs [options][SERVICE…]

默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过–no-color
选项来关闭颜色。
选项包括:

docker-compose build

用于构建(重新构建)项目中的服务容器。
命令格式为:

docker-compose build [options] [-build-arg key=val…] [SERVICE…] 

选项包括:

  • –compress:通过 gzip 压缩构建上下文环境。
  • –force-rm:删除构建过程中的临时容器。
  • –no-cache:构建镜像过程中不使用缓存。
  • –pull:始终尝试通过拉取操作来获取更新版本的镜像。
  • -m,–memory MEM: 为构建的容器设置内存大小。
    ,–build-argkey=val:为服务设置build-time 变量。

服务容器一旦构建,就会带上一个标记名。可以随时在项目目录下运行 docker-compose build 来重新构建服务。

docker-compose pull

用于拉取服务依赖的镜像。
命令格式为:

docker-compose pull [options][SERVICE…]

选项包括:

  • –ignore-pull-failures:忽略拉取镜像过程中的错误。
  • –parallel:多个镜像同时拉取。
  • –quiet:拉取镜像过程中不打印进度信息。

docker-compose restart

用于重启项目中的服务。
命令格式为:

docker-compose restart [options][SERVICE…]

选项包括:

  • -t,–timeout TIMEOUT: 指定重启前停止容器的超时时间(默认为10s)。

docker-compose rm

用于删除所有(停止状态的)服务容器。
命令格式为:

docker-compose rm [options][SERVICE…]

选项包括:

  • -f,–force: 强制直接删除,包括非停止状态的容器。
  • -s,–stop : 在删除容器前先停止容器。
  • -v,–volumes: 删除容器所挂载的数据卷。
    使用此命令时,推荐先执行 docker-compose stop 命令来停止容器。

docker-compose start

用于启动已经存在的服务容器。
命令格式为:

docker-compose start [SERVICE…]

docker-compose run

用于在指定服务上执行一个命令。
命令格式为:

docker-compose run [options] [-v VOLUME…] [-p PORT…] [-e KEY=VAL…] [SERVICE] [COMMAND][ARGS…]

例如在指定容器上执行一个 ping 命令:

docker-compose run ubuntu ping www.baidu.com

docker-compose scale

用于删除所有(停止状态的)服务容器。
命令格式为:

docker compose scale [options] [SERVICE=NUM…]

通过 service=num的参数设置指定服务运行容器的个数,例如设置指定服务 web 、db 运行的容 器个数;

docker-compose scale web=3 db=2

选项包括:

  • -t,–timeout TIMEOUT:关闭超时时间,默认为10s。

提示:官方提示不推荐使用此命令。请使用带有-scale选项的up 命令。但需要注意,up 与-scale 选项一起使用时,与scale 命令有一些细微的差异,因为它包含了up 命令的行为。例如:

docker-compose up -scale web=2 db=3

docker-compose pause

用于暂停一个服务容器。
命令格式为:

docker-compose pause [SERVICE…]

docker-compose kill

用于通过发送 SIGKILL信号来强制停止服务容器。支持通过-s 参数来指定发送的信号,例如通 过如下指令发送SIGINT 信号:

docker-compose  kill -s SIGINT

命令格式为:

docker-compose kill [options][SERVICE…]

docker-compose config

用于验证并查看 Compose 文件配置。
命令格式为:

docker-compose config [options]

选项包括:

  • –resolve-image-digests:将镜像标签标记为摘要。
  • -q,quiet:只验证配置,不输出。当文件配置正确时,不输出任何内容;当文件配置 错误时,输出错误信息。
  • –services:打印服务名, 一行一个。
  • –volumes:打印数据卷名, 一行一个。

docker-compose create

用于为服务创建容器。
命令格式为:

docker-compose create [options][SERVICE…]

选项包括:

  • -force-recreate: 重新创建容器,即使配置和镜像没有改变。不兼容-no-recreate 参数。
  • –no-recreate:如果容器已经存在,则不需要重新创建。不兼容-force-recreate 参数。
  • –no-build:不创建镜像,即使缺失。
  • –build:创建容器前,生成镜像。

docker-compose exec

命令格式为:

docker-compose exec [options]SERVICE COMMAND [ARGS…]

选项包括:

  • -d:分离模式,后台运行命令。
  • –privileged:获取特权。
  • –user USER: 指定运行的用户。
  • -T: 禁用分配 TTY, 默认docker-compose exec分配 TTY。
  • –index=index: 当一个服务拥有多个容器时,可通过该参数登录该服务下的任何服务,例如:docker-compose exec --index=1 web /bin/bash ,Web 服务中包含多个容器。

docker-compose port

用于显示某个容器端口所映射的公共端口。
命令格式为:

docker-compose port [options] SERVICE PRIVATE PORT

选项包括:

  • –protocol-proto:指定端口协议,TCP ( 默认值 ) 或者UDP。
  • –index=index:如果同意服务存在多个容器,那么指定命令对象容器的序号(默认为1)

docker-compose push

用于推送服务依赖的镜像。
命令格式为:

docker-compose push [options][SERVICE…]

选项包括:

  • –ignore-push-failures: 忽略推送镜像过程中的错误。

docker-compose unpause

用于恢复处于暂停状态中的服务。
命令格式为:

docker-compose unpause [SERVICE…]

docker-compose version

用于打印版本信息。
命令格式为:

docker-compose version

Docker Compose常用命令汇总清单

  • docker-compose COMMAND --help:获得一个命令的帮助。o docker-compose up-d nginx:构建并启动nignx容器。
  • docker-compose exec nginx bash:登录到nginx容器中。
  • docker-compose down:此命令将会停止up命令所启动的容器,并移除网络。
  • docker-compose ps:列出项目中目前的所有容器。o docker-compose restart nginx:重新启动nginx容器。
  • docker-compose build nginx:构建镜像。
  • docker-compose build --no-cache nginx:不带缓存构建镜像。
  • docker-compose top:查看各个服务容器内运行的进程。
  • docker-compose logs-fnginx:查看nginx的实时日志。
  • docker-compose images:列出Compose文件包含的镜像。
  • docker-compose config:验证文件配置,当文件配置正确时,不输出任何内容配置错误时,输出错误信息。
  • docker-compose events–json nginx:以JSON的形式输出nginx容器的Docker日
  • docker-compose pause nginx:暂停nignx容器。
  • docker-compose unpause nginx:恢复ningx容器。
  • docker-compose rm nginx:删除容器(删除前必须关闭容器,执行stop)。
  • docker-compose stop nginx:停止nignx容器。
  • docker-compose start nginx:启动nignx容器。
  • docker-compose restart nginx:重启项目中的nignx容器。
  • docker-compose run-no-deps -rm php-fpm php-v:在php-fpm中不启动关联容器,并当容器执行完成php-v后删除容器。

使用Docker Compose构建Web应用

通过docker-compose命令构建一个在Docker中运行的基于Python Flask框架的Web应用。
Docker 镜像提供了Python或Redis, 不需要重复安装。

1).定义 Python 应用

1.准备项目:

创建目录如下:

[root@docker ~]# mkdir -p composetest
[root@docker ~]# mkdir -p composetest/src
[root@docker ~]# mkdir -p composetest/docker

目录结构如下:

[root@docker ~]# tree composetest
composetest
├── docker
│   └── docker-compose.yml
├── Dockerfile
└── src
    ├── app.py
    └── requirements.txt

2 directories, 4 files
[root@docker ~]# 

2.创建app.py文件

在文件最下放添加

[root@docker ~]# vi composetest/src/app.py 
[root@docker ~]# cat composetest/src/app.py 
from flask import Flask
from redis import Redis

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

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

if __name__  == "__main__":
  app.run(host="0.0.0.0",debug=True)
[root@docker ~]# 

3.创建Python需求文件composetest/src/requirements.txt

[root@docker ~]# vi composetest/src/requirements.txt 
[root@docker ~]# cat composetest/src/requirements.txt 
flask
redis
[root@docker ~]# 

2).创建容器的Dockerfile文件

上面已经介绍了示例项目的目录结构,现在可在 composetest/目录中创建 Dockerfile 文件:若不使用默认的 docker-compose.yml 文件名:S docker-compose -f server.yml up -d然后在浏览器中输入 http://0.0.0.0:5000/ 查看运行的应用程序。

[root@docker ~]# vi composetest/Dockerfile 
[root@docker ~]# cat composetest/Dockerfile 
FROM python:3.7
COPY src /opt/src
WORKDIR /opt/src
RUN pip install -r requirements.txt

CMD ["python", "app.py"]
[root@docker ~]# 

Dockerfile文件描述了如下信息:

  • 从Python 3.7的镜像开始构建一个容器镜像。
  • 复制src(即compose_test/src)目录到容器中的/opt/src目录。
  • 将容器的工作目录设置为/opt/src(通过docker exec -it your docker_container_id bash进入容器后的默认目录)。
  • 安装Python依赖关系。
  • 将容器的默认命令设置为python app.py。

3).定义docker-compose脚本

在composetest/docker/目录下创建docker-compose.yml文件,并在里面定义服务,内容如下:

[root@docker ~]# vi composetest/docker/docker-compose.yml 
[root@docker ~]# cat composetest/docker/docker-compose.yml 
version: "3"
services:
  web:
    build: ../
    ports:
      - "5000:5000"
    volumes:
      - ../src:/opt/src
  redis:
    image: "redis:3.0.7"
[root@docker ~]# 

该Compose文件定义了两个服务,即定义了web和redis两个容器。

  1. web容器
    使用当前docker-compose.yml文件所在目录的上级目录(compose_test/Dockerfile)中的Dockerfile构建镜像。将容器上的暴露端口5000映射到主机上的端口5000。这里我们使用Flask Web服务器的默认端口5000。
  2. redis容器
    redis服务使用从Docker Hub提取的官方redis镜像3.0.7版本。

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

在composetest/docker/目录下执行docker-compose.yml文件:

[root@docker docker]# docker-compose up
[+] Running 2/0
 ✔ Container docker-redis-1  Created                                                                                                                                                                                                                                                                                                   0.0s 
 ✔ Container docker-web-1    Created                                                                                                                                                                                                                                                                                                   0.0s 
Attaching to redis-1, web-1
redis-1  | 1:C 10 Dec 08:18:14.652 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis-1  |                 _._                                                  
redis-1  |            _.-``__ ''-._                                             
redis-1  |       _.-``    `.  `_.  ''-._           Redis 3.0.7 (00000000/0) 64 bit
redis-1  |   .-`` .-```.  ```\/    _.,_ ''-._                                   
redis-1  |  (    '      ,       .-`  | `,    )     Running in standalone mode
redis-1  |  |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
redis-1  |  |    `-._   `._    /     _.-'    |     PID: 1
redis-1  |   `-._    `-._  `-./  _.-'    _.-'                                   
redis-1  |  |`-._`-._    `-.__.-'    _.-'_.-'|                                  
redis-1  |  |    `-._`-._        _.-'_.-'    |           http://redis.io        
redis-1  |   `-._    `-._`-.__.-'_.-'    _.-'                                   
redis-1  |  |`-._`-._    `-.__.-'    _.-'_.-'|                                  
redis-1  |  |    `-._`-._        _.-'_.-'    |                                  
redis-1  |   `-._    `-._`-.__.-'_.-'    _.-'                                   
redis-1  |       `-._    `-.__.-'    _.-'                                       
redis-1  |           `-._        _.-'                                           
redis-1  |               `-.__.-'                                               
redis-1  | 
redis-1  | 1:M 10 Dec 08:18:14.653 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis-1  | 1:M 10 Dec 08:18:14.653 # Server started, Redis version 3.0.7
redis-1  | 1:M 10 Dec 08:18:14.653 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis-1  | 1:M 10 Dec 08:18:14.653 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis-1  | 1:M 10 Dec 08:18:14.653 * DB loaded from disk: 0.000 seconds
redis-1  | 1:M 10 Dec 08:18:14.653 * The server is now ready to accept connections on port 6379
web-1    |  * Serving Flask app 'app'
web-1    |  * Debug mode: on
web-1    | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
web-1    |  * Running on all addresses (0.0.0.0)
web-1    |  * Running on http://127.0.0.1:5000
web-1    |  * Running on http://172.18.0.3:5000
web-1    | Press CTRL+C to quit
web-1    |  * Restarting with stat
web-1    |  * Debugger is active!
web-1    |  * Debugger PIN: 692-582-753
web-1    | 192.168.40.1 - - [10/Dec/2023 08:18:18] "GET / HTTP/1.1" 200 -
web-1    | 192.168.40.1 - - [10/Dec/2023 08:18:18] "GET /favicon.ico HTTP/1.1" 404 -
web-1    | 192.168.40.1 - - [10/Dec/2023 08:18:22] "GET / HTTP/1.1" 200 -

若是要后台运行:s docker-compose up -d
若不使用默认的 docker-compose.yml 文件名:S docker-compose -f server.ym up -d
黄色部分是文件名
使用更新的 Compose 文件构建应用程序,运行以下命令:

docker-compose  up  -d

使用 docker-compose ps 来查看当前正在运行的内容:

[root@docker docker]# docker-compose up -d
[+] Running 2/2
 ✔ Container docker-redis-1  Started                                                                                                                                                                                                                                                                                                   0.0s 
 ✔ Container docker-web-1    Started                                                                                                                                                                                                                                                                                                   0.0s 
[root@docker docker]# docker-compose  ps
NAME             IMAGE         COMMAND                   SERVICE   CREATED         STATUS         PORTS
docker-redis-1   redis:3.0.7   "docker-entrypoint.s…"   redis     8 minutes ago   Up 6 seconds   6379/tcp
docker-web-1     docker-web    "python app.py"           web       8 minutes ago   Up 6 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp
[root@docker docker]# 

停止docker-compoer

[root@docker docker]# docker-compose down 
[+] Running 3/3
 ✔ Container docker-redis-1  Removed                                                                                                                                                                                                                                                                                                   0.2s 
 ✔ Container docker-web-1    Removed                                                                                                                                                                                                                                                                                                   0.3s 
 ✔ Network docker_default    Removed                                                                                                                                                                                                                                                                                                   0.2s 
[root@docker docker]# 

5).访问我们的网站看看

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/237575.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android---Kotlin 学习002

声明变量 在 Kotlin 中定义一个变量&#xff0c;通过关键字 var 开始。然后是变量名&#xff0c;在“:”后紧跟变量类型。 示例1&#xff1a;声明一个 int 类型的变量 var num:Int 1 示例2&#xff1a;声明一个 String 类型的变量 var str:String "Hello world&quo…

SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案

Maven项目的Jar包打包问题-没有主清单属性&&ClassNotFoundException 与 NoClassDefFoundError 文章目录 Maven项目的Jar包打包问题-没有主清单属性&&ClassNotFoundException 与 NoClassDefFoundError1、问题出现1.1、Jar包运行&#xff1a;没有主清单属性解决方…

2023年华为HCIA认证H12-811题库讲解

在VRP平台上&#xff0c;可以通过下面哪种方式返回到上一条历史命令&#xff1f;&#xff08; &#xff09; A、Ctr1U B、Ctr1P C、左光标 D、上光标 试题答案&#xff1a;BD 试题解析&#xff1a;在VRP系统中&#xff0c;ctrlU为自定义快捷键&#xff0c;ct…

Python - 搭建 Flask 服务实现图像、视频修复需求

目录 一.引言 二.服务构建 1.主函数 upload_gif 2.文件接收 3.专属目录 4.图像修复 5.gif2mp4 6.mp42gif 7.图像返回 三.服务测试 1.服务启动 2.服务调用 四.总结 一.引言 前面我们介绍了如何使用 Real-ESRGAN 进行图像增强并在原始格式 jpeg、jpg、mp4 的基础上…

MAC配置环境变量

1、配置 JAVA JDK 1.1、查看 JDK 安装目录 &#xff08;1&#xff09;可以在Android Studio中查看&#xff0c;复制该路径 &#xff08;2&#xff09;也可以在官网下载 Java JDK下载地址 mac中的安装地址是"资源库->Java->JavaVirtualMachines"中 1.2、…

【Nacos】在Windows环境下搭建Nacos服务与Python开发示例

在Windows环境下搭建Nacos服务与Python开发示例 Nacos是一个开源的动态服务发现、配置和服务管理平台。本文将介绍在Windows环境下搭建Nacos服务&#xff0c;并提供一个简单的Python示例&#xff0c;演示如何通过Nacos实现服务注册与发现。 官方提示&#xff1a;Nacos定义为一…

nodejs+vue+微信小程序+python+PHP的外卖数据分析-计算机毕业设计推荐django

构建一种完全可实现、可操作的开放源代码信息收集系统&#xff0c;帮助记者完成工作任务。采编人员仅需输入所收集到的网址及题目即可迅速启动收集工作并进行信息归类。 2.根据新的数据收集要求&#xff0c;采用云计算技术实现新的收集器的迅速部署。对于资料采集点的改版&…

IoTDB控制台工具Workbench

文章目录 概述环境要求安装下载启动服务 登录用户界面主界面 连接 概述 Workbench是一个可创建多个连接的图形化数据库管理工具&#xff0c;用于管理IoTDB&#xff0c;提供元数据的可视化与管理、数据的增删改查以及权限控制等功能。Workbench不仅满足专业开发人员的所有需求&…

读程序员的README笔记08_依赖管理

1. 行为准则 2. 依赖管理 2.1. 在现有的代码上增加一个依赖似乎是一个简单的决定 2.2. 不要重复自己”(Don’t repeat yourself&#xff0c;DRY)是一个通常被教导的原则 2.3. 依赖关系带来了风险 2.3.1. 不兼容的变化 2.3.2. 循环依赖 2.3.3. 版本冲突 2.3.4. 缺乏控制 …

<url-pattern>/</url-pattern>与<url-pattern>/*</url-pattern>的区别

<url-pattern>/</url-pattern> servlet的url-pattern设置为/时&#xff0c; 它仅替换servlet容器的默认内置servlet&#xff0c;用于处理所有与其他注册的servlet不匹配的请求。直白点说就是&#xff0c;所有静态资源&#xff08;js&#xff0c;css&#xff0c;ima…

nodejs+vue+微信小程序+python+PHP基于spark的酒店管理系统-计算机毕业设计推荐

通过管理系统进行全面的线上管理。管理者可以通过基于spark的酒店管理系统&#xff0c;全面掌握酒店客房的各项状态&#xff0c;会员通过系统查询酒店客房信息&#xff0c;在线预定。 酒店作为旅游过程必须的设施&#xff0c;也逐渐需需要进行信息化管理&#xff0c;把酒店类型…

【PyTorch】现代卷积神经网络

文章目录 1. 理论介绍1.1. 深度卷积神经网络&#xff08;AlexNet&#xff09;1.1.1. 概述1.1.2. 模型设计 1.2. 使用块的网络&#xff08;VGG&#xff09;1.3. 网络中的网络&#xff08;NiN&#xff09;1.4. 含并行连结的网络&#xff08;GoogLeNet&#xff09; 2. 实例解析2.1…

连连看游戏

连通块记忆性递归的综合运用 这里x&#xff0c;y的设置反我平常的习惯&#xff0c;搞得我有点晕 实际上可以一输入就交换x&#xff0c;y的数据的 如果设置y1为全局变量的话会warning&#xff1a; warning: built-in function y1 declared as non-function 所以我改成p和q了…

Python---综合案例

一、系统需求分析 1、需求分析 使用面向对象编程思想完成学员管理系统的开发&#xff0c;具体如下&#xff1a; ① 系统要求&#xff1a;学员数据存储在文件中 ② 系统功能&#xff1a;添加学员、删除学员、修改学员信息、查询学员信息、显示所有学员信息、保存学员信息及退…

Kotlin基础——基础内容

文章目录 1 函数和变量1.1 基本程序1.2 函数1.3 变量1.3.1 变量的类型推导1.3.2 可变变量和不可变量1.3.3 变量使用规则 1.4 字符串模板 2 类和属性2.1 属性2.2 自定义访问器2.3 目录和包2.3.1 同包访问2.3.2 不同包导入2.3.3 包名类名定义规则 3 枚举和“when”3.1 声明枚举类…

软件测试之压力测试详解

一、什么是压力测试 软件测试中&#xff1a;压力测试&#xff08;Stress Test&#xff09;&#xff0c;也称为强度测试、负载测试。压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷&#xff0c;长时间或超大负荷地运行测试软件&#xff0c;来测试被测系统的性能、…

leetcode-19-删除链表的倒数第N个节点

题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示…

深度学习 Day15——P4猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU&#xff08;如果设备上支持GPU就使用GPU,否则使用C…

Swagger快速上手

快速开始&#xff1a; 导入maven包 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version> </dependency><dependency><groupId>io.springfox<…

UDS DTC故障码格式

文章目录 DTC的定义DTC 故障码的分类DTC 故障码的组成1、OBD DTC 格式结构2、UDS DTC&#xff08;ISO 14229-1、ISO 15031-6&#xff09;格式结构 参考 DTC的定义 DTC&#xff0c;Diagnostic Trouble Code&#xff0c;诊断故障码&#xff0c;即 故障类型的 ID。 一个完整的DT…