教程基于ubuntu下最新的compose版本3
参考: https://docs.docker.com/compose/overview/css
Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,一般由多个容器组成。使用Docker Compose再也不须要使用shell脚原本启动容器。
Compose 经过一个配置文件来管理多个Docker容器,在配置文件中,全部的容器经过services来定义,而后使用docker-compose脚原本启动,中止和重启应用,和应用中的服务以及全部依赖服务的容器,很是适合组合使用多个容器进行开发的场景。node
compose文件格式版本 | docker版本 |
---|---|
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
1.0 | 1.9.1.+ |
Docker从1.13.x版本开始,版本分为企业版EE和社区版CE,版本号也改成按照时间线来发布,好比17.03就是2017年3月。python
Docker的linux发行版的软件仓库从之前的https://apt.dockerproject.org和https://yum.dockerproject.org变动为目前的https://download.docker.com, 软件包名字改成docker-ce和docker-ee。mysql
Docker的社区版(Docker Community Edition)叫作docker-ce。老版本的Docker包叫作docker或者docker-engine,若是安装了老版本的docker得先卸载而后再安装新版本的docker。docker的发展很是迅速,apt源的更新每每比较滞后。因此docker官网推荐的安装方式都是下载docker安装脚本安装。
卸载老旧的版本(若未安装过可省略此步):linux
$ sudo apt-get remove docker docker-engine docker.io
安装最新的docker:git
shell会提示你输入sudo的密码,而后开始执行最新的docker过程
或者github
$ curl -sSL https://get.docker.com/ | sh
确认Docker成功最新的docker:web
$ sudo docker run hello-world
两种最新的docker安装方式redis
$ sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.16.1, build 1719ceb
$ sudo pip install docker-compose
sql
docker-compose.yml:
经过docker-compose构建一个在docker中运行的基于python flask框架的web应用。
注意:确保你已经安装了Docker Engine和Docker Compose。 您不须要安装Python或Redis,由于这两个都是由Docker镜像提供的。
目录结构以下:
一个容器一个Dockerfile文件
为了工程目录更加清晰,在compose_test/docker/目录下建立compose_test/docker/web目录
在compose_test/docker/web/目录中建立Dockerfile文件:
FROM python:3.4
Dockerfile文件告诉docker了以下信息:
从Python 3.4镜像开始构建一个容器镜像。
复杂当前 . (即compose_test/docker)目录到容器的/docker目录。
复制../../src目录(即compose_test/src) 到容器中的/src目录(此处../../src是不合法的路径,ADD的源路径必须在Dockerfile文件的上下文环境中,即Dockerfile文件所在根目录或起子目录中,实际应该使用volumes挂载项目源文件)。
将容器的工做目录设置为/src。
安装Python依赖关系。
将容器的默认命令设置为python app.py。
在compose_test/docker/目录下建立docker-compose.yml文件,并在里面定义服务,内容以下:
这个compose文件定义了两个服务,即定义了web和redis两个容器。
web容器:
* 使用当前的web目录(compose_test/docker/web/)中的Dockerfile构建映像。
* 将容器上的暴露端口5000映射到主机上的端口5000。 咱们使用Flask Web服务器的默认端口5000。
redis容器:
* redis服务使用从Docker Hub提取的官方redis镜像3.0.7版本。
在compose_test/docker/目录下执行docker-compose.yml文件:
而后在浏览器中输入http://0.0.0.0:5000/查看运行的应用程序。
上面的代码是在构建时静态复制到容器中的,即经过Dockerfile文件中的ADD ./src /src命令实现物理主机中的源码复制到容器中,这样在后续物理主机src目录中代码的更改不会反应到容器中。
能够经过volumes 关键字实现物理主机目录挂载到容器中的功能(同时删除Dockerfile中的ADD指令,不须要建立镜像时将代码打包进镜像,而是经过volums动态挂载,容器和物理host共享数据卷):
经过volumes(卷)将主机上的项目目录(compose_test/src)挂载到容器中的/src目录下,容许您即时修改代码,而无需从新构建映像。
使用更新的compose文件构建应用程序,而后运行它。
$ docker-compose up -d
Compose文件是一个定义服务,网络和卷的YAML文件。 Compose文件的默认文件名为docker-compose.yml。
**提示:您能够对此文件使用.yml或.yaml扩展名。 他们都工做。
与docker运行同样,默认状况下,Dockerfile中指定的选项(例如,CMD,EXPOSE,VOLUME,ENV)都被遵照,你不须要在docker-compose.yml中再次指定它们。
同时你可使用相似Bash的$ {VARIABLE} 语法在配置值中使用环境变量,有关详细信息,请参阅变量替换。
本节包含版本3中服务定义支持的全部配置选项。
build 能够指定包含构建上下文的路径:
或者,做为一个对象,该对象具备上下文路径和指定的Dockerfile文件以及args参数值:
webapp服务将会经过./dir目录下的Dockerfile-alternate文件构建容器镜像。
若是你同时指定image和build,则compose会经过build指定的目录构建容器镜像,而构建的镜像名为image中指定的镜像名和标签。
这将由./dir构建的名为webapp和标记为tag的镜像。
包含Dockerfile文件的目录路径,或者是git仓库的URL。
当提供的值是相对路径时,它被解释为相对于当前compose文件的位置。 该目录也是发送到Docker守护程序构建镜像的上下文。
备用Docker文件。Compose将使用备用文件来构建。 还必须指定构建路径。
添加构建镜像的参数,环境变量只能在构建过程当中访问。
首先,在Dockerfile中指定要使用的参数:
而后在args键下指定参数。 你能够传递映射或列表:
** 注意:YAML布尔值(true,false,yes,no,on,off)必须用引号括起来,以便解析器将它们解释为字符串。
指定启动容器的镜像,能够是镜像仓库/标签或者镜像id(或者id的前一部分)
若是镜像不存在,Compose将尝试从官方镜像仓库将其pull下来,若是你还指定了build,在这种状况下,它将使用指定的build选项构建它,并使用image指定的名字和标记对其进行标记。
指定一个自定义容器名称,而不是生成的默认名称。
container_name: my-web-container
因为Docker容器名称必须是惟一的,所以若是指定了自定义名称,则没法将服务扩展到多个容器。
卷挂载路径设置。能够设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro),挂载数据卷的默认权限是读写(rw),能够经过ro指定为只读。
你能够在主机上挂载相对路径,该路径将相对于当前正在使用的Compose配置文件的目录进行扩展。 相对路径应始终以 . 或者 .. 开始。
可是,若是要跨多个服务并重用挂载卷,请在顶级volumes关键字中命名挂在卷,可是并不强制,以下的示例亦有重用挂载卷的功能,可是不提倡。
** 注意:经过顶级volumes定义一个挂载卷,并从每一个服务的卷列表中引用它, 这会替换早期版本的Compose文件格式中volumes_from。
覆盖容器启动后默认执行的命令。
command: bundle exec thin -p 3000
该命令也能够是一个相似于dockerfile的列表:
command: ["bundle", "exec", "thin", "-p", "3000"]
连接到另外一个服务中的容器。 请指定服务名称和连接别名(SERVICE:ALIAS),或者仅指定服务名称。
在当前的web服务的容器中能够经过连接的db服务的别名database访问db容器中的数据库应用,若是没有指定别名,则可直接使用服务名访问。
连接不须要启用服务进行通讯 - 默认状况下,任何服务均可以以该服务的名称到达任何其余服务。 (实际是经过设置/etc/hosts的域名解析,从而实现容器间的通讯。故能够像在应用中使用localhost同样使用服务的别名连接其余容器的服务,前提是多个服务容器在一个网络中可路由联通)
links也能够起到和depends_on类似的功能,即定义服务之间的依赖关系,从而肯定服务启动的顺序。
连接到docker-compose.yml 外部的容器,甚至并不是 Compose 管理的容器。参数格式跟 links 相似。
暴露端口,但不映射到宿主机,只被链接的服务访问。
仅能够指定内部端口为参数
暴露端口信息。
经常使用的简单格式:使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)均可以。
** 注意:当使用 HOST:CONTAINER 格式来映射端口时,若是你使用的容器端口小于 60 你可能会获得错误得结果,由于 YAML 将会解析 xx:yy 这种数字格式为 60 进制。因此建议采用字符串格式。
简单的短格式:
在v3.2中ports的长格式的语法容许配置不能用短格式表示的附加字段。
长格式:
target:容器内的端口
published:物理主机的端口
protocol:端口协议(tcp或udp)
mode:host 和ingress 两总模式,host用于在每一个节点上发布主机端口,ingress 用于被负载平衡的swarm模式端口。
no是默认的重启策略,在任何状况下都不会重启容器。 指定为always时,容器老是从新启动。 若是退出代码指示出现故障错误,则on-failure将从新启动容器。
添加环境变量。 你可使用数组或字典两种形式。 任何布尔值; true,false,yes,no须要用引号括起来,以确保它们不被YML解析器转换为True或False。
只给定名称的变量会自动获取它在 Compose 主机上的值,能够用来防止泄露没必要要的数据。
** 注意:若是你的服务指定了build选项,那么在构建过程当中经过environment定义的环境变量将不会起做用。 将使用build的args子选项来定义构建时的环境变量。
将PID模式设置为主机PID模式。 这就打开了容器与主机操做系统之间的共享PID地址空间。 使用此标志启动的容器将可以访问和操做裸机的命名空间中的其余容器,反之亦然。即打开该选项的容器能够相互经过进程 ID 来访问和操做。
pid: "host"
配置 DNS 服务器。能够是一个值,也能够是一个列表。