利用docker搭建一个mysql + java service + nginx,总共4个docker容器,如果采用docker run的方式一个一个容器去创建十分麻烦。为了能更高效的批量创建容器,docker推出了docker-compose工具,只需要定义一个docker-compose.yml文件即可快速搞定一组容器的创建.
docker-compose.yml文件格式如下:
mysql:
image: daocloud.io/yjmyzz/mysql-osx:latest
volumes:
- ./mysql/db:/var/lib/mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=123456
service1:
image: java:latest
volumes:
- ./java:/opt/app
expose:
- 8080
#ports:
# - 9081:8080
links:
- mysql:default
command: java -jar /opt/app/spring-boot-rest-framework-1.0.0.jar
service2:
image: java:latest
volumes:
- ./java:/opt/app
expose:
- 8080
#ports:
# - 9082:8080
links:
- mysql:default
command: java -jar /opt/app/spring-boot-rest-framework-1.0.0.jar
nginx1:
image: nginx:latest
volumes:
- ./nginx/html:/usr/share/nginx/html:ro
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
#expose:
# - 80
ports:
- "80:80"
links:
- service1:service1
- service2:service2
每一个定义在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: bundle exec thin -p 3000
links
连接到其他服务中的容器,可以指定服务名称和这个链接的别名,或者只指定服务名称
links: - db - db:database - redis
此时,在容器内部,会在/etc/hosts文件中用别名创建一个条目,就像这样:
172.17.2.186 db 172.17.2.186 database 172.17.2.186 redis
环境变量也会被创建,关于环境变量的参数,会在后面讲到
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_from: - service_name - container_name
environment
加入环境变量,可以使用数组或者字典,只有一个key的环境变量可以在运行Compose的机器上找到对应的值,这有助于加密的或者特殊主机的值
environment: RACK_ENV: development SESSION_SECRET: environments: - RACK_ENV=development - SESSION_SECRET
env_file
从一个文件中加入环境变量,该文件可以是一个单独的值或者一张列表,在environment中指定的环境变量将会重写这些值
env_file: - .env 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
cap_add,cap_drop
加入或者去掉容器能力,查看man 7 capabilities 可以有一张完整的列表
cap_add: - ALL cap_drop: - NET_ADMIN - SYS_ADMIN
dns_search
自定义DNS搜索范围,可以是单独的值或者一张列表
dns_search: example.com dns_search: - dc1.example.com - dc2.example.com
working_dir,entrypoint,user,hostname,domainname,mem_limit,privileged,restart,stdin_open,tty,cpu_shares
上述的每一个都只是一个单独的值,和docker run中对应的参数是一样的
cpu_shares: 73working_dir: /codeentrypoint: /code/entrypoint.shuser: postgresqlhostname: foodomainname: foo.commem_limit: 1000000000privileged: truerestart: alwaysstdin_open: truetty: true
****************************************************************************************
好,终于把yml文件中的一些参数进行了说明,下面根据个人理解来说一下docker-compose build、docker-compose up、以及gradle构建的项目下 ./gradlew clean build 三者之间的关系。
./gradlew clean build是基于gradle构建项目时的打包指令,会将所有的文件打成一个项目名命名的jar包。
docker-compose build是基于docker compose的指令,在Dockerfile文件基础上会将项目打成一个app.jar并将jar包制作成镜像,并且结合yml文件可以批量build。
docker-compose up 是基于docker和yml文件的一种批量启动方式,与其相对应的单个docker image启动方式是 docker run 方式,这种方式要设定参数配置IP 端口号 image名称,当项目包含多个docker时会十分繁琐。
镜像除了可以build出来也可以从远端pull,使用docker pull image名的方式把镜像pull下来之后可以直接使用docker run 将其运行。
docker-compose build、gradlew build、docker-compose up的个人理解相关推荐
- 从零开始学习docker(十一)介绍Docker Compose yml文件介绍
撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 如果我们有一个App,他由多个container组成,那么这个App的维护会非常繁琐. 包括: 要从Docker ...
- Docker小白到实战之Docker Compose在手,一键足矣
前言 Docker可以将应用程序及环境很方便的以容器的形式启动,但当应用程序依赖的服务比较多,或是遇到一个大系统拆分的服务很多时,如果还一个一个的根据镜像启动容器,那就有点累人了,到这有很多小伙伴会说 ...
- Docker容器虚拟化技术---Docker运维管理(Docker Compose)4
Docker容器虚拟化技术-Docker运维管理(Docker Compose)4 Docker Compose 通过前面的讲解我们知道使用一个Dockerfile模板文件,可以很方便地定义一个单独的 ...
- Docker进阶(3)docker容器编排-docker compose、swarm、service
Docker进阶(3)docker容器编排 Docker进阶(3)docker容器编排 1. 容器编排 2. docker compose 2.1 安装 2.2 官方文档创建一个简单的web应用 2. ...
- Docker 学习笔记 - 进阶四 Docker网络和 Docker compose
Docker 学习笔记 - 进阶四 Docker网络和 Docker compose 4. docker 网络 4.1 docker network是什么 4.1.1 docker不启动,默认网络情况 ...
- docker build -t_在Docker环境构建、打包和运行Spring Boot应用
为何考虑采用Docker? Docker是提供用户构建镜像的一种容器化技术,所构建的镜像包含了主要的应用程序和运行应用所需的所有依赖项.该镜像可在任何虚拟机或物理机器上的Docker容器上运行.它的强 ...
- Docker 深入篇之 Build 原理
使用 Docker 时,最常用的命令无非是 docker container 和 docker image 相关的子命令,当然最初没有管理类命令(或者说分组)的时候,最常使用的命令也无非是 docke ...
- 手动build unity3d的docker镜像
手动build unity3d的docker镜像 参考资料 docker官方文档:Docker Documentation | Docker Documentation unity3d linux版的 ...
- Dokcer14_5:Docker Compose volumes解析、Docker Compose volumes目录路径生成规则
Dokcer14_5:Docker Compose volumes解析.Docker Compose volumes目录路径生成规则 docker-compose volumes语法 语法格式及其三种 ...
- jenkins docker 自动部署 构建_jenkins+docker+vue项目的自动部署环境
亮点 采用shell自定义脚本,控制集成部署环境更加方便灵活 如果服务器更换,重新部署的工作量会比较小 准备工作 首先我们得有一台服务器.我这里用的是阿里云ECS,华东节点.具体的购买操作的话百度会有 ...
最新文章
- leetcode算法题--新21点★
- 常见的天气现象有哪些
- postmessage 游戏窗口内无效_前端的微前端在交通项目内的应用实践
- Yann LeCun, Geoffrey E. Hinton, and Yoshua Bengio
- 怎么查看linux网关,如何查看linux服务器网关
- c语言数组的使用步骤,C语言中为什么要使用数组?详细图解数组的使用
- flask 自定义错误页面
- dockerfile 创建Jenkins镜像
- html鼠标拖尾效果,JS实现鼠标移动拖尾
- 每日算法系列【LeetCode 495】提莫攻击
- 一次性下载CVPR2016的所有文章
- xp 计算机桌面图标不见,萝卜XP系统桌面图标全部消失了如何解决
- Adobe产品序列号
- 目前流行的前端UI框架
- 一个网游盗号木马的汇编源码分析
- 网络游戏外挂编写初级教程
- 《自顶向下计算机网络》其二 Application Layer
- Pytorch官方文档英语翻译
- 三网融合触发MeeGo风暴
- 商场智慧消防栓远程监测项目
热门文章
- SIGAR - System Information Gatherer And Reporter
- 最新河南电信、网通(联通)、铁通DNS地址ip
- 深圳地铁五号线联网监控!
- linux中批量删除用户,Linux shell批量删除用户
- 基于脉振高频电压信号注入法的PMSM无位置传感器控制原理和仿真
- 小米手机安装欧洲版系统(MIUI12) 详细安装教程
- idea remote debug
- 全球与中国SS-OCT激光市场深度研究分析报告
- 微型计算机主要性能指标是什么,微型计算机的主要性能指标
- EXCEL表格-输入身份证号无法正常展示问题详解