Docker-Compose

简介


概述


Dockerfile build run 手动操作,单个容器

微服务 若有100个微服务 且其中还有依赖关系?

Dcoker Compose来轻松高效的管理容器,定义运行多个容器!


Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)

Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名

一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡

Docker-Compose的工程配置文件默认为 docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器

Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理



官方介绍

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration

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

Compose works in all environments: production, staging, development, testing, as well as CI workflows

Compose可以在所有环境中工作:生产、阶段、开发、测试,以及CI工作流

Using Compose is basically a three-step process

1、Define your app’s environment with a Dockerfile so it can be reproduced anywhere

2、Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment

3、Run docker-compose up and Compose starts and runs your entire app

使用Compose基本上有三个步骤

  1. Dockerfile定义应用程序环境,这样就可以在任何地方复制它
  2. 在docker-compose中定义组成应用程序的服务。这样它们就可以在一个独立的环境中一起运行
  3. 运行docker-compose up和Compose启动并运行整个应用程序



理解

作用:批量容器的编排技术

Docker Compose是Docker官方的开源项目,需要安装!

Dockerfile让程序在任何地方运行,web服务,redis,MySQL,nginx…多个容器

使用Docker Compose

version: "3.8"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

仅使用这样一个yaml文件,定义多个容器之间的关系,然后通过docker-compose up起来你的多个服务



安装


1、下载

#官方的,慢
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

#国内的,快
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

在这里插入图片描述

下载完后可以使用docker-compose version命令看看是否已经安装成功


2、授权

对二进制文件应用授予可执行权限

sudo chmod +x /usr/local/bin/docker-compose



Yaml规则



1、概述

Compose允许用户用一个docker-compose.yml模板文件来定义一组相关联的应用容器为一个项目(project)

Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名

Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services和networks两个部分

官方编写配置文档:https://docs.docker.com/compose/compose-file/

Compose文件与Docker版本的对应图

在这里插入图片描述

#三层
version: ''		#版本
services:		#服务
	service1: web
		image:
		build:
		network:
		...................
	service2: redis
	.................................
#其它配置,网络/卷,全局规则
vloumes:
networks:
configs:

例如创建一个简单的docker-compose.yaml文件

version: '3.8'
services:
	web:
		build:
		ports:
			- "5000:5000"
		volumes:
			- .:/code
	redis:
		image: "redis:alpine"
		
#此docker-compose文件定义了两个服务,web与redis
#该web服务使用从当前目录的Dockerfule构建的镜像
#将容器的公开端口5000转发到宿主机上的端口5000,并作卷挂载将当前目录与/code目录映射
#该redis服务使用从Docker Hub注册表中提取的公共redis镜像



2、service配置

image

image是指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试从DockerHub拉取镜像

services:
  web:
    image: hello-world

build

服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用docker-compose up命令启动时执行构建任务,构建标签是build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器

build: /path/mydir

可以是绝对路径也可以是相对路径,只要上下文确定就可以读取到Dockerfile

build: .

context

context选项可以是Dockerfile的文件路径,也可以是到链接到git仓库的url,当提供的值是相对路径时,被解析为相对于撰写文件的路径,此目录也是发送到Docker守护进程的context

build:
  context: ./mydir

dockerfile

替代Dockerfile

Compose使用另一个文件进行构建。还必须指定生成路径

build:
  context: .
  dockerfile: Dockerfile-alternate

command

重写默认的命令

command: bundle exec thin -p 3000

该命令也可以是一个列表,方式类似于dockerfile

command: ["bundle", "exec", "thin", "-p", "3000"]

container_name

指定自定义容器名称,而不是生成的默认名称

Compose的默认容器名称格式是:<项目名称><服务名称><序号>

container_name: my-web-container

depends_on

表达服务之间的依赖关系。服务依赖关系会导致以下行为

  • docker-compose up按照依赖顺序启动服务。在下面的例子中,db和redis在web之前启动
  • docker组合服务自动包含服务的依赖关系。下面例子中,docker-compose up web也创建和启动了db和redis
  • docker-compose stop按照依赖顺序停止服务。在下面的例子中,web在db和redis之前停止
version: "3.8"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

ports

暴露端口

可以指定两个端口(主机:容器),也可以只指定容器端口(选择临时的主机端口)

在以HOST:CONTAINER格式映射端口时,当使用小于60的容器端口时,可能会遇到错误的结果,因为YAML以xx:yy格式解析为60进制。出于这个原因,建议始终显式地将端口映射指定为字符串

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

extra_hosts

添加主机名的标签,会在容器内/etc/hosts文件中添加一些记录

extra_hosts:
  - "somehost:162.242.195.82"
  - "otherhost:50.31.209.229"

启动后查看容器内部hosts文件

162.242.195.82  somehost
50.31.209.229   otherhost

volumes

挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,后者对于容器来说,数据卷是只读的,可以有效保护宿主机的文件系统

Compose的数据卷指定路径可以是相对路径,使用 . 或者 … 来指定相对目录

数据卷的格式可以是下面多种形式

volumes:
  #只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
  - /var/lib/mysql
  #使用绝对路径挂载数据卷
  - /opt/data:/var/lib/mysql
  #以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
  - ./cache:/tmp/cache
  #使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro
  #已经存在的命名的数据卷。
  - datavolume:/var/lib/mysql

dns

自定义DNS服务器。可以是一个值,也可以是一个列表

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

expose

暴露端口,但不映射到宿主机,只允许能被连接的服务访问。仅可以指定内部端口为参数

expose:
    - "3000"
    - "8000"

network

要加入的网络,在顶级networks键下引用条目

services:
  some-service:
    networks:
     - some-network
     - other-network



3、Networks配置

顶级网络key允许您指定要创建的网络

driver

指定这个网络应该使用哪个驱动程序

默认的驱动程序取决于你正在使用的Docker引擎是如何配置的,但在大多数情况下,它是在单个主机上的桥接,在集群上的叠加

如果驱动程序不可用,Docker引擎会返回一个错误

driver: overlay

bridge

Docker默认在一台主机上使用桥接网络



4.configs配置

顶层configs声明定义了可以授予此服务栈中的配置或引用。配置源要么是文件file,要么是外部的external

  • file:配置是用指定路径上的文件内容创建的
  • external:如果设置为真,则指定该配置已经创建。Docker不尝试创建它,如果它不存在,就会出现config not found错误
  • name:Docker中配置对象的名称。这个字段可以用来引用包含特殊字符的配置。该名称按原样使用,不会与堆栈名称一起作用域

在这个例子中,my_first_config是在部署堆栈时创建的,而my_second_config已经存在于Docker中

configs:
  my_first_config:
    file: ./config_data
  my_second_config:
    external: true

外部配置的另一个变中是,Docker中的配置名与服务中的配置名不同。下面的示例修改了前面的示例,以使用名为redis config的外部配置。

configs:
  my_first_config:
    file: ./config_data
  my_second_config:
    external:
      name: redis_config



使用Docker-Compose部署WordPress博客


我们可以使用Docker Compose来轻松地在Docker容器构建的独立环境中运行WordPress。这个快速启动指南演示了如何使用Compose来设置和运行WordPress。在启动之前,确保已经安装了Compose



1、定义项目

1.1、创建一个空工程文件夹

您可以将目录命名为易于记忆的名称。这个目录是应用程序映像的上下文。该目录应该只包含用于构建映像的资源。这个项目目录包含一个docker-compose.yml文件,它本身是一个很好的入门wordpress项目。

提示:可以对该文件使用.yml或.yaml扩展名。他们都工作。

1.2、进入你的文件夹

例如,如果你将你的目录命名为 my_wordpress

cd my_wordpress/
1.3、编写compose文件

创建一个docker-compose.yml,启动WordPress博客的yml文件和一个单独的MySQL实例,该实例带有用于数据持久化的卷挂载

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

小提示:

  • docker数据卷db_data保存WordPress对数据库所做的任何更新
  • WordPress 网络只能在端口80和443上工作。



2、构建项目

现在,从您的项目目录运行 docker-compose up -d

它以后台模式运行Docker -compose up,提取所需的Docker图像,并启动wordpress和数据库容器,如下面的示例所示。

$ docker-compose up -d
Creating network "my_wordpress_default" with the default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
efd26ecc9548: Pull complete
a3ed95caeb02: Pull complete
...
Digest: sha256:34a0aca88e85f2efa5edff1cea77cf5d3147ad93545dbec99cfe705b03c520de
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:latest)...
latest: Pulling from library/wordpress
efd26ecc9548: Already exists
a3ed95caeb02: Pull complete
589a9d9a7c64: Pull complete
...
Digest: sha256:ed28506ae44d5def89075fd5c01456610cd6c64006addfe5210b8c675881aff6
Status: Downloaded newer image for wordpress:latest
Creating my_wordpress_db_1
Creating my_wordpress_wordpress_1

提示:WordPress 网络仅在端口80或443上起作用。如果收到有关将0.0.0.0绑定到端口80或443(取决于您指定的端口)的错误消息,很可能您为WordPress配置的端口已经被其他服务使用了。



3、在浏览器中访问

http://localhost:8000

此时,WordPress应该运行在Docker主机的8000端口上,您可以作为WordPress管理员完成著名的5分钟安装。

注意:8000端口上的WordPress站点不能立即使用,因为容器还在初始化中,在第一次加载之前可能需要一些时间

在这里插入图片描述

在这里插入图片描述



4、关闭与清理

命令docker-compose down删除容器和默认网络,但保留您的WordPress数据库

命令docker-compose down ——volumes删除容器、默认网络和WordPress数据库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大恐龙的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值