简介
概述
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基本上有三个步骤
- 用
Dockerfile
定义应用程序环境,这样就可以在任何地方复制它 - 在docker-compose中定义组成应用程序的服务。这样它们就可以在一个独立的环境中一起运行
- 运行
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数据库