欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker compose

程序员文章站 2022-06-03 23:34:23
...

Docker Compose 项目

compose 项目简介

compose 项目来源于之前的 Fig 项目,使用 python 代码编写。compose 项目主要用于编排部署基于 docker 的应用。本身与 docker/swarm 配合度很高。

DockerCompose 是 Docker 编排服务的一部分,可以让用户在其它平台快速安装 Docker,Swarm 可以让 Docker 容器在集群中高效运转,而 Compose 可以让用户在集群中部署分布式应用。简单的说,Docker Compose 属于一个“应用层”的服务,用户可以定义哪个容器组运行哪个应用,它支持动态改变应用,并在需要时扩展。

相对于 kubernetes 来说功能比较简单,相当于 kubernetes 的一个子集。

dockerfile  可以让用户管理一个单独的应用容器,而 而 Compose 则允许用户在一个模板(yaml 格式)中定义一组相关联的应用容器(被称为一个 Project,即项目),例如一个调度器,两个 web 服务容器再加上后端的 数据库服务容器等。

docker compose

安装 Compose 之前,要先安装 docker,这里就不说了,

安装 Docker-compose

先安装 pip

注:pip 类似 RedHat 里面的 yum,安装 Python 包非常方便

#wgethttps://bootstrap.pypa.io/get-pip.py

docker compose

#python get-pip.py

docker compose

再安装 compose

docker composedocker compose

安装成功后,可以查看 docker-compose 的版本和 命令的用法。

#docker-compose -v

#docker-compose -h

docker compose

首先介绍几个术语。

服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。

项目(project):由一组关联的应用容器组成的一个完整业务单元。

可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。


docker-compose命令说明

大多数 Compose 命令都是运行于一个或多个服务的,如果服务没有指定,该命令将会应用

到所有服务,如果要获得所有可用信息,使用命令: docker-compose [COMMAND] --help ,

下面是命令(COMMAND)的说明:

 

build

创建或者再建服务

服务被创建后会标记为 project_service(比如 composetest_db),如果改变了一个服务的Dockerfile或者构建目录的内容,可以使用 docker-compose build 来重建它

 

help

显示命令的帮助和使用信息

 

kill

通过发送 SIGKILL 的信号强制停止运行的容器,这个信号可以选择性的通过,比如:

docker-composekill -s SIGKINT

 

logs

显示服务的日志输出

 

port

为端口绑定输出公共信息

 

ps

显示容器

 

pull

拉取服务镜像

 

rm

删除停止的容器

 

run

在服务上运行一个一次性命令,比如:

docker-composerun web Python manage.py shell

scale

设置为一个服务启动的容器数量,数量是以这样的参数形式指定的:service=num,比如:

docker-composescale web=2 worker=3

 

start

启动已经存在的容器作为一个服务

 

stop

停止运行的容器而不删除它们,它们可以使用命令 docker-compose start 重新启动起来

 

up

为一个服务构建、创建、启动、附加到容器

连接的服务会被启动,除非它们已经在运行了

 

运行 docker-compose up -d 会在后台启动容器并使它们运行

 

–verbose

显示更多输出

 

–version

显示版本号并退出

 

-f,–fileFILE

指定一个可选的 Compose yaml 文件(默认:docker-compose.yml)

 

-p,–project-nameNAME

指定可选的项目名称(默认:当前目录名称)

 

docker-compose.yml命令说明

每一个定义在 docker-compose.yml 中的服务必须明确指定一个 image 或者 build 选项,这与docker run 命令行中输入的是对应相同的,对于 docker run,在 Dockerfile 文件中指定的选项(比如 CMD、EXPOSE、VOLUME、ENV)是默认的,因此不必在 docker-compose.yml 中再指定一次

 

image

标明 image 的 ID,这个 image ID 可以是本地也可以是远程的,如果本地不存在,Compose会尝试去 pull 下来

image:ubuntu

image:orchardup/postgresql

image:a4bc65fd

 

build

该参数指定 Dockerfile 文件的路径,该目录也是发送到守护进程的构建环境(这句有点),

Compose 将会以一个已存在的名称进行构建并标记,并随后使用这个 image

build:/path/to/build/dir

 

command

重写默认的命令,覆盖容器启动后默认执行的命令

command: 要执行的命令

 

links

连接到其他服务中的容器,可以指定服务名称和这个链接的别名,或者只指定服务名称

 

links:

- db

-db:database

- redis

此时,在容器内部,会在/etc/hosts 文件中用别名创建一个条目,就像这样:

172.17.2.186db

172.17.2.186database

172.17.2.186redis

 

环境变量也会被创建,关于环境变量的参数,会在后面讲到

 

external_links

连接到在这个 docker-compose.yml 文件或者 Compose 外部启动的容器,特别是对于提供共享和公共服务的容器。在指定容器名称和别名时,external_links 遵循着和 links 相同的语义用法

external_links:

- redis_1

-project_db_1:mysql

-project_db_1:postgresql

 

ports

暴露端口,指定两者的端口(主机:容器),或者只是容器的端口(主机会被随机分配一个端口)

注:当以 主机:容器 的形式来映射端口时,如果使容器的端口小于 60,那可能会出现错误,因为 YAML 会将 xx:yy 这样格式的数据解析为六十进制的数据,基于这个原因,时刻记得要将端口映射明确指定为字符串

ports:

-"3000"

-"8000:8000"

-"49100:22"

-"127.0.0.1:8001:8001

 

expose

暴露端口而不必向主机发布它们,而只是会向链接的服务(linked service)提供,只有内部端口可以被指定

 expose:

-"3000"

-"8000"

 

volumes

挂载路径最为卷,可以选择性的指定一个主机上的路径(主机:容器),或是一种可使用的模式(主机:容器:ro)

volumes:

-/var/lib/mysql

-cache/:/tmp/cache

-~/configs:/etc/configs/:ro

 

volumes_from:

从另一个服务或容器挂载它的所有卷。

volumes_from:

-service_name

-container_name

 

environment

加入环境变量,可以使用数组或者字典,只有一个 key 的环境变量可以在运行 Compose 的机器上找到对应的值,这有助于加密的或者特殊主机的值

environment:

RACK_ENV:development

SESSION_SECRET:

environments:

-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

 

net

网络模式,可以在 docker 客户端的--net 参数中指定这些值

net:"bridge"

net:"none"

net:"container:[name or id]"

net:"host"

 

dns

自定义 DNS 服务,可以是一个单独的值或者一张列表

dns:8.8.8.8

dns:

- 8.8.8.8

- 9.9.9.9

 

dns_search

自定义 DNS 搜索范围,可以是单独的值或者一张列表

dns_search:example.com

dns_search:

-dc1.example.com

-dc2.example.com


使用 Compose 只需要简单的三个步骤:

首先,使用 Dockerfile 或 docker commit 来定义你的应用环境

第二步,用一个 docker-compose.yml 来定义你的应用,他们可以在下个互隔离的容器中组成你的应用。

第三步,执行 docker-compose up -d 来启动你的应用,它会根据 docker-compose.yml 的

设置来 pull/run 相关的容器。

测试案例

下面,我们创建一个经典的 Web 项目:一个 Haproxy,挂载三个 Web 容器。

docker-haproxy目录,作为项目工作目录,并在其中分别创建两个子目录: haproxy 和web。

#mkdir -p/root/docker-haproxy/{haproxy,web}

在/root/docker-haproxy/目录下创建 docker-compose.yml 文件

在/root/docker-haproxy/haproxy 目录下创建 haproxy 的主配置文件 haproxy.cfg

在/root/docker-haproxy/web 目录下存放 web 站点网页文件

目录结构如下图所示:

docker compose

haproxy 目录:

在其中生成一个 haproxy.cfg 文件

docker compose

global
  log 127.0.0.1 local0
  log 127.0.0.1 local1 notice

defaults
  log global
  mode http
  option httplog
  option dontlognull
  timeout connect 5000ms
  timeout client 50000ms
  timeout server 50000ms

listen stats
    bind 0.0.0.0:70
    stats enable
    stats uri /

frontend balancer
    bind 0.0.0.0:80
    mode http
    default_backend web_backends

backend web_backends
    mode http
    option forwardfor
    balance roundrobin
    server weba weba:80 check
    server webb webb:80 check
    server webc webc:80 check
    option httpchk GET /
    http-check expect status 200

docker-compose.yml

编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。内容十分简单,指定 3 个 web 容器,以及 1 个 haproxy 容器。

docker compose
weba:
  image: 7e3b9e1dad39
  volumes:
    - /root/docker-haproxy/web/:/var/www/html/
  expose:
    - 80

webb:
  image: 7e3b9e1dad39
  volumes:
    - /root/docker-haproxy/web/:/var/www/html/
  expose:
    - 80

webc:
  image: 7e3b9e1dad39
  volumes:
    - /root/docker-haproxy/web/:/var/www/html/
  expose:
    - 80

haproxy:
  image: 047d39960eb2
  volumes:
    - /root/docker-haproxy/haproxy/:/etc/haproxy/:ro
  command: /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
  links:
    - weba
    - webb
    - webc
  ports:
    - "80:80"
    - "70:70"

运行 compose 项目:

docker-haproxy目录下执行docker-compose up -d 来启动你的应用

#cd docker-haproxy

docker compose

查看容器启动情况

docker compose

docker compose

打开浏览器本机本机 IP:http://192.168.157.128

docker compose

打开浏览器本机本机 IP:http://192.168.157.128:70

docker compose

相关标签: docker