{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
docker的深层次的学习,本人通常将docker-compose的脚本用于工具类镜像容器的一键恢复的脚本编写(比如mysql,oracle,sqlserver,sqlite等数据库,rabbitmq,redis,dockerui,humpback等工具),一般用于服务器宕机的手动恢复,十分实用.
dockercompose是一个用来定义和运行复杂应用的docker工具。一个使用docker容器的应用,通常由多个容器组成。使用dockercompose不再需要使用shell脚本来启动容器。compose通过一个配置文件来管理多个docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
docker的社区版(dockercommunityedition)叫做docker-ce。老版本的docker包叫做docker或者docker-engine,如果安装了老版本的docker得先卸载然后再安装新版本的docker。docker的发展非常迅速,apt源的更新往往比较滞后。所以docker官网推荐的安装方式都是下载docker安装脚本安装。卸载老旧的版本(若未安装过可省略此步):
$sudoapt-getremovedockerdocker-enginedocker.io
安装最新的docker:
$curl-fsslget.docker.com-oget-docker.sh$sudoshget-docker.sh
shell会提示你输入sudo的密码,然后开始执行最新的docker过程或者
$curl-sslhttps://get.docker.com/|sh
确认docker成功最新的docker:
$sudodockerrunhello-world.安装docker-compose
两种最新的docker安装方式
$sudopipinstalldocker-compose
docker-compose.yml:
version:"3"services:redis:image:redis:alpineports:-"6379"networks:-frontenddeploy:replicas:2update_config:parallelism:2delay:10srestart_policy:condition:on-failuredb:image:postgres:9.4volumes:-db-data:/var/lib/postgresql/datanetworks:-backenddeploy:placement:constraints:[node.role==manager]vote:image:dockersamples/examplevotingapp_vote:beforeports:-5000:80networks:-frontenddepends_on:-redisdeploy:replicas:2update_config:parallelism:2restart_policy:condition:on-failureresult:image:dockersamples/examplevotingapp_result:beforeports:-5001:80networks:-backenddepends_on:-dbdeploy:replicas:1update_config:parallelism:2delay:10srestart_policy:condition:on-failureworker:image:dockersamples/examplevotingapp_workernetworks:-frontend-backenddeploy:mode:replicatedreplicas:1labels:[app=voting]restart_policy:condition:on-failuredelay:10smax_attempts:3window:120splacement:constraints:[node.role==manager]visualizer:image:dockersamples/visualizer:stableports:-"8080:8080"stop_grace_period:1m30svolumes:-"/var/run/docker.sock:/var/run/docker.sock"deploy:placement:constraints:[node.role==manager]networks:frontend:backend:volumes:db-data:docker-compose使用示例
通过docker-compose构建一个在docker中运行的基于pythonflask框架的web应用。
注意:确保你已经安装了dockerengine和dockercompose。您不需要安装python或redis,因为这两个都是由docker镜像提供的。
$mkdircompose_test$cdcompose_test$mkdirsrc#源码文件夹$mkdirdocker#docker配置文件夹
目录结构如下:
fromflaskimportflaskfromredisimportredisapp=flask(__name__)redis=redis(host='redis',port=6379)@app.route('/')defhello():count=redis.incr('hits')return'helloworld!ihavebeenseen{}times.n'.format(count)if__name__=="__main__":app.run(host="0.0.0.0",debug=true)
3.创建python需求文件compose_test/docker/requirements.txt
flaskredis12step2:创建容器的dockerfile文件
一个容器一个dockerfile文件为了工程目录更加清晰,在compose_test/docker/目录下创建compose_test/docker/web目录
$cddocker$mkdirweb12
在compose_test/docker/web/目录中创建dockerfile文件:
frompython:3.4add./dockeradd../../src/src#add的源路径应该在dockerfile文件的上下文环境中(即dockerfile文件所在根目录及其子目录下,如add./src是合法的,而add../../src/src不合法),此处为了清晰的项目结构,只是展示add指令,实际中应该用volumes挂载workdir/srcrunpipinstall-r/docker/requirements.txtcmd["python","app.py"]112345
dockerfile文件告诉docker了如下信息:
从python3.4镜像开始构建一个容器镜像。
复杂当前.(即compose_test/docker)目录到容器的/docker目录。
复制../../src目录(即compose_test/src)到容器中的/src目录(此处../../src是不合法的路径,add的源路径必须在dockerfile文件的上下文环境中,即dockerfile文件所在根目录或起子目录中,实际应该使用volumes挂载项目源文件)。
将容器的工作目录设置为/src。安装python依赖关系。将容器的默认命令设置为pythonapp.py。
在compose_test/docker/目录下创建docker-compose.yml文件,并在里面定义服务,内容如下:
version:'3'services:web:build:./web/ports:-"5000:5000"redis:image:"redis:3.0.7"
这个compose文件定义了两个服务,即定义了web和redis两个容器。web容器:*使用当前的web目录(compose_test/docker/web/)中的dockerfile构建映像。*将容器上的暴露端口5000映射到主机上的端口5000。我们使用flaskweb服务器的默认端口5000。redis容器:*redis服务使用从dockerhub提取的官方redis镜像3.0.7版本。
在compose_test/docker/目录下执行docker-compose.yml文件:
$docker-composeup#若是要后台运行:$docker-composeup-d#若不使用默认的docker-compose.yml文件名:$docker-compose-fserver.ymlup-d
然后在浏览器中输入http://0.0.0.0:5000/查看运行的应用程序。
上面的代码是在构建时静态复制到容器中的,即通过dockerfile文件中的add./src/src命令实现物理主机中的源码复制到容器中,这样在后续物理主机src目录中代码的更改不会反应到容器中。可以通过volumes关键字实现物理主机目录挂载到容器中的功能(同时删除dockerfile中的add指令,不需要创建镜像时将代码打包进镜像,而是通过volums动态挂载,容器和物理host共享数据卷):
version:'3'services:web:build:.ports:-"5000:5000"volumes:-../src:/srcredis:image:"redis:3.0.7"
通过volumes(卷)将主机上的项目目录(compose_test/src)挂载到容器中的/src目录下,允许您即时修改代码,而无需重新构建映像。
使用更新的compose文件构建应用程序,然后运行它。
$docker-composeup-d6.compose常用服务配置参考
compose文件是一个定义服务,网络和卷的yaml文件。compose文件的默认文件名为docker-compose.yml。
**提示:您可以对此文件使用.yml或.yaml扩展名。他们都工作。
与docker运行一样,默认情况下,dockerfile中指定的选项(例如,cmd,expose,volume,env)都被遵守,你不需要在docker-compose.yml中再次指定它们。
同时你可以使用类似bash的${variable}语法在配置值中使用环境变量,有关详细信息,请参阅变量替换。
本节包含版本3中服务定义支持的所有配置选项。
build可以指定包含构建上下文的路径:
version:'2'services:webapp:build:./dir
或者,作为一个对象,该对象具有上下文路径和指定的dockerfile文件以及args参数值:
version:'2'services:webapp:build:context:./dirdockerfile:dockerfile-alternateargs:buildno:1
webapp服务将会通过./dir目录下的dockerfile-alternate文件构建容器镜像。如果你同时指定image和build,则compose会通过build指定的目录构建容器镜像,而构建的镜像名为image中指定的镜像名和标签。
build:./dirimage:webapp:tag
这将由./dir构建的名为webapp和标记为tag的镜像。
context
包含dockerfile文件的目录路径,或者是git仓库的url。当提供的值是相对路径时,它被解释为相对于当前compose文件的位置。该目录也是发送到docker守护程序构建镜像的上下文。
dockerfile
备用docker文件。compose将使用备用文件来构建。还必须指定构建路径。
args
添加构建镜像的参数,环境变量只能在构建过程中访问。首先,在dockerfile中指定要使用的参数:
argbuildnoargpasswordrunecho"buildnumber:$buildno"runscript-requiring-password.sh"$password"
然后在args键下指定参数。你可以传递映射或列表:
build:context:.args:buildno:1password:secretbuild:context:.args:-buildno=1-password=secret
**注意:yaml布尔值(true,false,yes,no,on,off)必须用引号括起来,以便解析器将它们解释为字符串。
指定启动容器的镜像,可以是镜像仓库/标签或者镜像id(或者id的前一部分)
image:redisimage:ubuntu:14.04image:tutum/influxdbimage:example-registry.com:4000/postgresqlimage:a4bc65fd
如果镜像不存在,compose将尝试从官方镜像仓库将其pull下来,如果你还指定了build,在这种情况下,它将使用指定的build选项构建它,并使用image指定的名字和标记对其进行标记。
指定一个自定义容器名称,而不是生成的默认名称。
container_name:my-web-container
由于docker容器名称必须是唯一的,因此如果指定了自定义名称,则无法将服务扩展到多个容器。
卷挂载路径设置。可以设置宿主机路径(host:container)或加上访问模式(host:container:ro),挂载数据卷的默认权限是读写(rw),可以通过ro指定为只读。你可以在主机上挂载相对路径,该路径将相对于当前正在使用的compose配置文件的目录进行扩展。相对路径应始终以.或者..开始。
volumes:#只需指定一个路径,让引擎创建一个卷-/var/lib/mysql#指定绝对路径映射-/opt/data:/var/lib/mysql#相对于当前compose文件的相对路径-./cache:/tmp/cache#用户家目录相对路径-~/configs:/etc/configs/:ro#命名卷-datavolume:/var/lib/mysql
但是,如果要跨多个服务并重用挂载卷,请在顶级volumes关键字中命名挂在卷,但是并不强制,如下的示例亦有重用挂载卷的功能,但是不提倡。
version:"3"services:web1:build:./web/volumes:-../code:/opt/web/codeweb2:build:./web/volumes:-../code:/opt/web/code
**注意:通过顶级volumes定义一个挂载卷,并从每个服务的卷列表中引用它,这会替换早期版本的compose文件格式中volumes_from。
version:"3"services:db:image:dbvolumes:-data-volume:/var/lib/dbbackup:image:backup-servicevolumes:-data-volume:/var/lib/backup/datavolumes:data-volume:command
覆盖容器启动后默认执行的命令。
command:bundleexecthin-p3000
该命令也可以是一个类似于dockerfile的列表:
command:["bundle","exec","thin","-p","3000"]links
链接到另一个服务中的容器。请指定服务名称和链接别名(service:alias),或者仅指定服务名称。
web:links:-db-db:database-redis
在当前的web服务的容器中可以通过链接的db服务的别名database访问db容器中的数据库应用,如果没有指定别名,则可直接使用服务名访问。
链接不需要启用服务进行通信-默认情况下,任何服务都可以以该服务的名称到达任何其他服务。(实际是通过设置/etc/hosts的域名解析,从而实现容器间的通信。故可以像在应用中使用localhost一样使用服务的别名链接其他容器的服务,前提是多个服务容器在一个网络中可路由联通)
links也可以起到和depends_on相似的功能,即定义服务之间的依赖关系,从而确定服务启动的顺序。
链接到docker-compose.yml外部的容器,甚至并非compose管理的容器。参数格式跟links类似。
external_links:-redis_1-project_db_1:mysql-project_db_1:postgresqlexpose
暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数
expose:-"3000"-"8000"ports
暴露端口信息。常用的简单格式:使用宿主:容器(host:container)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
**注意:当使用host:container格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误得结果,因为yaml将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。
简单的短格式:
ports:-"3000"-"3000-3005"-"8000:8000"-"9090-9091:8080-8081"-"49100:22"-"127.0.0.1:8001:8001"-"127.0.0.1:5000-5010:5000-5010"-"6060:6060/udp"
在v3.2中ports的长格式的语法允许配置不能用短格式表示的附加字段。长格式:
ports:-target:80published:8080protocol:tcpmode:host
target:容器内的端口published:物理主机的端口protocol:端口协议(tcp或udp)mode:host和ingress两总模式,host用于在每个节点上发布主机端口,ingress用于被负载平衡的swarm模式端口。
no是默认的重启策略,在任何情况下都不会重启容器。指定为always时,容器总是重新启动。如果退出代码指示出现故障错误,则on-failure将重新启动容器。
restart:"no"restart:alwaysrestart:on-failurerestart:unless-stoppedenvironment
添加环境变量。你可以使用数组或字典两种形式。任何布尔值;true,false,yes,no需要用引号括起来,以确保它们不被yml解析器转换为true或false。只给定名称的变量会自动获取它在compose主机上的值,可以用来防止泄露不必要的数据。
environment:rack_env:developmentshow:'true'session_secret:environment:-rack_env=development-show=true-session_secret
**注意:如果你的服务指定了build选项,那么在构建过程中通过environment定义的环境变量将不会起作用。将使用build的args子选项来定义构建时的环境变量。
将pid模式设置为主机pid模式。这就打开了容器与主机操作系统之间的共享pid地址空间。使用此标志启动的容器将能够访问和操作裸机的命名空间中的其他容器,反之亦然。即打开该选项的容器可以相互通过进程id来访问和操作。
pid:"host"dns
配置dns服务器。可以是一个值,也可以是一个列表。
dns:8.8.8.8dns:-8.8.8.8-9.9.9.9