docker-compose模板指令 命令行指令
一、docker-compose两个重要的概念
- 项目(project):有多个服务共同组成的完整的业务单元,定义在docker-compose.yml文件中
- 服务(service):一个服务对应一个应用容器,在一个项目中可以存在多个服务
书写格式:注意yml文件的书写格式,用空格缩进,用-符号写多个值
version: "3.0" # 表示使用的版本,必写services: # 注意这里写的是复数,表示多个的意思tomcat: # 这个就是服务了,这里写的是付的名称,就是这个服务叫啥,注意这个开头用了2个空格缩进image: tomcat:8.0-jre8 # 表示创建当前这个服务所使用的镜像是那个, 注意这个开头也用了2个空格缩进ports: # 注意这个是端口,是复数- "8000:8000"- "4456:4456"
二、docker-compose 模板指令
1.引入两个概念
服务 service: 表示一个服务一个应用的容器,说白了,就是你想要跑的docker。它是写在servcies: 里面的。每一个都需要一个独一无二的名字。
项目 project: 表示,由多个服务构成,具有相同业务逻辑的单元。其实就是整个docker-compose.yml文件
2. 部分指令如下
image
指定 镜像名称或者镜像的ID。 如果镜像在本地不存在,comopse 将会尝试拉取这个镜像
image: ubuntu
image: orchardup/postgresql
image: abcdfe:v3
posts
暴露端口信息
使用 宿主机端口:容器端口(HOST:CONTAINER)格式,或者仅仅指定容器的端口(宿主机将会随机选择端口)都可以
ports:- "3000"- "8000:8000"- "49200:22"- "127.0.0.1:8001:8001"
*注意: 当使用 "HOST:CONTAINER"格式来映射端口的时候,如果你的端口号小于60,并且没有放到引号里面,可能会得到错误,因为yaml文件会自动解析’ “XX:YY” 这种格式为60进制。为了避免出现这种问题,建议将一组值,翻到引号中 *
volumes
数据卷所挂载的路径设置。可以设置成 宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER)两种格式。。。同时如果需要设置访问权限,就是说只能宿主机修改文件,并且影响到容器里面。不能进容器里面修改数据,从而影响到宿主机。意思就是说:本来双向的数据,现在改成了单向通道,只能宿主机影响容器。格式是:HOST:CONTANIER:ro -->注意这里的:ro 表示read only的意思。
注意: 这个指令支持相对路径
volumes: # 注意这里的复数- /var/lib/mysql- cache:/tmp/cache- ~/configs:/etc/configs/:ro
细节1---------> 如果路径是数据卷的名称,必须要文件中单独配置数据卷。这里就跟network 是一样的。
version: "3.0"services:some-one-service:networks:- some-network- other-networkvolumes:- mysql-data:/var/lib/mysql- data-volume:/srv/data- /home/hello/:/apps/volumes: # 注意这里的volumes 是复数,和services 平齐,需要把上面用数据卷的名字都写下来。mysql-data:data-volume:
进阶的细节2---------> 上面用数据卷中有一个系统指定的问题。就是我们虽然在底部单独定义了volumes: 然后也把上面用到的数据卷,在里面声明了。但是在系统中单独查找这个数据卷,却找不到。因为docker 给我们添加了一个前缀。。。这个前缀就是docker-compose.yml 所在文件的上层文件夹的名字。
比如我们的docker-compose.yml在hello 这个文件夹中。则我们的数据卷在系统中的完整的名字就是:hello_mysql-data 和hello_data-volume
修改 进阶的细节2---------> 上面我们已经在volumes中单独定义了数据卷,但是 系统给它加上了前缀和下划线。
有没有办法不要这个前缀和下划线哪? 办法是有的。如下:
不过你要确定如果系统里面的数据卷和network 不存在重名的问题,要不然出错。就是名字不要重复。
volumes:mysql-data:external: # 注意这里的external: 和true truedata-volume:external: # 表示 使用我们自定义的卷名true # 用true 表示 确认使用指定的卷名
但是这样,直接运行会出错。因为你用我们自定义的数据卷。但是系统在运行的时候,并不知道有这个数据卷,需要提前创建这个数据卷才可以,否则不能用,怎么创建?
在命令行手动创建
docker volume create mysql-data # 执行这个之后,系统里面才有我们上面定义的数据卷,才可用docker-compose.yml 否则会出错。
networks
配置容器连接的网络。
一个容器可以有多个网桥,就是一个容器可以同时用几个网桥,系统会给这个容器分配多个网卡,每一个网卡都绑定不同的IP
可以把一组服务(或者一个工程里面的所有服务,都用一个网桥。这样省的和其他的工程里面的服务产生关系,就是各自在一个独立的局域网里面运行。省的有干扰)
进阶的点------和volumes 一样,都需要单独拿出来定义,然后声明所用到的网桥名字。同时注意 是我们自定义用网桥名字,还是用 系统加前缀的网桥名字。
同时:如果我们用自己的网桥名字的话,需要提前创建,否则运行不通过
docker network create some-network
version: "3.0"services:some-one-service:networks:- some-network- other-network# 注意这里的networks 需要单独定义的,是和上面services 大类是齐平的,也就是说一个docker-compose.yml文件有一组service,那么就有为这一组service服务的网卡,还有为这一组service服务的挂载点volume
networks:some-network:external: # 注意这里使用我们自定义的网桥名字,就是some-network这个名字trueother-network: # 注意这里我们使用系统给我们加前缀的网桥名字
综合volumes 和networks 举例:
version: "3.2"services:tomcat-1:image: tomcat:8.0-jre8ports:- "8080:8080"volumes:- appdata1:/usr/local/tomcat/webapps- /home:/homenetworks:- tomcat-net # 这里一样的网络tomcat-2:image: tomcat:8.0-jre8ports:- 8081:8080volumes:- appdate2:/usr/local/tomcat/webappsnetworks:- tomcat-net # 这里一样的网络-
volumes:appdata1: # tomcat-1 里面的数据卷appdate2: # tomcat-2 里面的数据卷networks:tomcat-net: # 两者公用一个网桥,也就是说tomcate1服务和tomcate2服务,在一个网段里面,可以互通。external:true
container_name
这个是容器的名字,先当于 命令行下面的 --name
重点: 如果设置了container_name那么如果几个容器在一个网桥内,可以使用http://container_name:port来代替http://127.0.0.1:port 来访问同局域网内的其它容器。
version: "3.2"services:tomcat-1:container_name: tomcat-1_name # 这就是给运行的容器一个名字,先当于--nameimage: tomcat:8.0-jre8ports:- "8080:8080"volumes:- appdata1:/usr/local/tomcat/webapps- /home:/homenetworks:- tomcat-net # 这里一样的网络
volumes:appdata1:
networks:tomcat-net:
environment
设置环境变量。你可以使用数组或者字典两种格式。两种格式:字典用:不用-。。。。数组用-用=号
当只给定名称的变量,不赋值。则这个变量会自动获取运行compose主机上对应变量的值,可以用来防止泄露不必要的数据。
environment: # 字典格式,注意第二个变量没有赋值。 也不用 用 - 来开头RACK_ENV: developmentSESSION_SECRET:environment: # 数组格式,注意第二个变量没有赋值。 需要用 - 来开头- RACK_NEN=development- SESSION_SECRET
如果变量名称或者值中用到 true|alse, yes|no
等表达 ··布尔··含义的词汇,最好放到引号里面,避免yaml自动解析某些内容为对应的布尔语义。
这些词汇包括:
y Y yes Yes YES n N no No true True TRUE false False FALSE on On OFF off Off
实例:
mysql:image: mysql:5.7.23ports:- "3307:3306"volumes:- mysql_data:/var/lib/mysql- mysql_config:/etc/mysqlenvironment:MYSQL_ROOT_PASSWORD: "123456" # 注意这里 用的是字典格式, :号 后面有空格,需要符合yaml格式
env_file
从文件中获取环境变量,可以是单独的文件路径或者列表。
如果通过docker-compose -f File
的方式来指定compose模板文件, 则env_file中变量的路径会基于模板文件的路径。
如果有变量名称和environment 中的指令冲突,按照惯例,以后者为准
env_file: .env # 指定一个env_file ,文件名字是 .env
或者:
env_file: # 指定多个env_file, 文件名字各式各样,而且还有相对路径和绝对路径- ./common.env # 相对路径下的- ./apps/web.env # 相对路径下的- /app/secrets.env # 绝对路径下的
书写env_file 文件的格式:
环境变量文件中每一行必须符合格式,支持#
开头的注释行。
# common.env Set development environment # 这个是注释行
PROG_ENV=development # 这个是内容
command
覆盖容器启动后默认执行的命令。
相当于在命令行 run 镜像之后用来覆盖容器内部 默认的命令。
command: echo "hello world"
实例:
redis:image: redis:5.0.10container_name: redisports:- "6379:6379"volumes:- redis_data:/datacommand: "redis-server --appendonly yes" # 原本的redis启动的命令是 redis-server 但是我们要这个是容器,而且要做数据持久化,所以需要覆盖原本的命令,新命令是 command: "redis-server --appendonly yes"
depends_on 比较重要的命令
解决容器的依赖,启动先后的问题。下面的例子会先启动redis db 然后在启动web
注意depends_on 里面写的是服务的名字,不是容器的名字
version: "3"services:web:build: .depends_on:- db_container # 注意这里写的是服务名字- redis_container # 注意这里写的是服务名字,不是服务container_name里面的名字redis_container:image: redisdb_container:image: mysql
注意:web 服务不会等待redis db 完全启动之后才启动,但是确实是晚启动
healthcheck
通过命令检查容器是否健康运行
healthcheck:test: ["CMD", "curl", "-f", "http://localhost"]interval: 1m30stimeout: 10sretries: 3
sysctls
配置容器内核参数。
有两种方式,一种数组,一种字典
用来修改容器内 系统内部参数, 但是这个命令并不是必须的。。有些服务启动的时候,会受到容器内参数的限制导致可能无法成功启动,则必须修改容器内参数才能让这个服务启动成功
sysctls:net.core.somaxconn: 1024net.ipv4.tcp_syncookies: 0sysctls:- net.core.somaxconn=1024- net.ipv4.tcp_syncooies=0
ulimits
用来指定容器中最大进程数。
指定容器的ulimits限制值。
例如,指定最大进程数为65535, 指定文件句柄数为20000(软限制,应用可以随时修改,不能超过硬限制)和40000(系统硬限制,只能root用户提高)。
ulimits:nproc: 65535nofile:sofe: 20000hard: 40000
至此,给一个例子,如下:
version: "3.2"services:tomcat-1:container_name: tomcat-1_nameimage: tomcat:8.0-jre8ports:- "8080:8080"volumes:- appdata1:/usr/local/tomcat/webapps- /home:/homenetworks:- tomcat-net # 这里一样的网络depends_on:- tomcat-2- mysql- redishealthcheck: # 这个是官方给的案例,让系统每1分30秒向本机的docker 引擎发送curl -f http://localhost, 如果能反回,就说明这个tomcat-1的服务是在正常运行中。test: ["CMD", "curl", "-f", "http://localhost"]interval: 1m30stimeout: 10sretries: 3sysctls: # 用来修改系统内部参数- net.core.somaxconn=1024 # 这里是例子- net.ipv4.tcp_syncookies=0ulimits: #用来修改系统内进程数限制,日后使用,可以根据当前容器运行服务要求,进行修改,用以满足容器的成功启动nproc: 65535nofile:soft: 20000hard: 40000tomcat-2:image: tomcat:8.0-jre8ports:- 8081:8080volumes:- appdate2:/usr/local/tomcat/webappsnetworks:- tomcat-net # 这里一样的网络- tomcat2-netmysql:image: mysql:5.7.23container_name: mysqlports:- "3307:3306"volumes:- mysql_data:/var/lib/mysql- mysql_config:/etc/mysql
# environment:
# MYSQL_ROOT_PASSWORD: "123456"
# 第二种方法:用env_fileenv_file:- mysql.envnetworks:- tomcat-netredis:image: redis:5.0.10container_name: redisports:- "6379:6379"volumes:- redis_data:/datacommand: "redis-server --appendonly yes" # 原本的redis启动的命令是 redis-server 但是我们要这个是容器,而且要做数据持久化,所以需要覆盖原本的命令,新命令是 command: "redis-server --appendonly yes"networks:- tomcat-netvolumes:appdata1:appdate2:mysql_data:mysql_config:redis_data:networks:tomcat-net:external:truetomcat2-net:
最复杂的一个命令 build 指令
作用:用来将我们指定的自制的Dockerfile 打包成镜像, 然后再运行这个镜像。
build 用来指定Dockerfile 所在目录,现根据build中Dockerfile自动构建镜像,然后自动运行容器
过程就是:先用Dockerfile 生成image,然后在运行成容器。
注意:build 指令下面,要有Dockerfile所在的目录,就是Dockerfile的上下文环境。这里还要注意就是这个目录相对docker-compose.yml的路径
还有就是要指定Dockerfile 文件名
不要忘记把Dockefile中暴露的端口,在这里也写出来
不要忘记volume 挂载点
version: "3.2"services:demo:build: # 启动服务时先将命令中指定dockerfile打包成镜像,然后运行该镜像context: ./demodir # Dockerfile 的上下文环境,就是Dockerfile所在的目录,里面存放生产镜像所需的文件。这里demodir目录和docker-compose.yaml同级dockerfile: Dockerfile # 指定Dockefile文件的名字container_name: demo # 生产容器的名字ports: # 暴露我们Dockerfile中expose 的端口- "8081:8081"depends_on: # 依赖下面的服务 启动之后,这个再启动- tomcat-1networks:- tomcat-nettomcat-1:container_name: tomcat-1_nameimage: tomcat:8.0-jre8ports:- "8080:8080"volumes:- appdata1:/usr/local/tomcat/webapps- /home:/homenetworks:- tomcat-net # 这里一样的网络depends_on:- tomcat-2- mysql- redishealthcheck: # 这个是官方给的案例,让系统每1分30秒向本机的docker 引擎发送curl -f http://localhost, 如果能反回,就说明这个tomcat-1的服务是在正常运行中。test: ["CMD", "curl", "-f", "http://localhost"]interval: 1m30stimeout: 10sretries: 3sysctls: # 用来修改系统内部参数- net.core.somaxconn=1024 # 这里是例子- net.ipv4.tcp_syncookies=0ulimits: #用来修改系统内进程数限制,日后使用,可以根据当前容器运行服务要求,进行修改,用以满足容器的成功启动nproc: 65535nofile:soft: 20000hard: 40000tomcat-2:image: tomcat:8.0-jre8ports:- 8081:8080volumes:- appdate2:/usr/local/tomcat/webappsnetworks:- tomcat-net # 这里一样的网络- tomcat2-netmysql:image: mysql:5.7.23container_name: mysqlports:- "3307:3306"volumes:- mysql_data:/var/lib/mysql- mysql_config:/etc/mysql
# environment:
# MYSQL_ROOT_PASSWORD: "123456"
# 第二种方法:用env_fileenv_file:- mysql.envnetworks:- tomcat-netredis:image: redis:5.0.10container_name: redisports:- "6379:6379"volumes:- redis_data:/datacommand: "redis-server --appendonly yes" # 原本的redis启动的命令是 redis-server 但是我们要这个是容器,而且要做数据持久化,所以需要覆盖原本的命令,新命令是 command: "redis-server --appendonly yes"networks:- tomcat-netvolumes:appdata1:appdate2:mysql_data:mysql_config:redis_data:networks:tomcat-net:external:truetomcat2-net:
三 docker-compose 命令行指令
up
down
exec
ps
.
.
.
.
翻文挡去吧
docker-compose模板指令 命令行指令相关推荐
- 第四篇:ROS常用命令行指令【重点】
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.常用的ROS命令行指令 1.系统类指令 2.启动类指令 3.节点 ...
- java图形化界面操作和命令行操作,常用的命令行指令
第1章 JAVA语言概述 系统软件即操作系统 做开发需要掌握一定的命令行指令 Java程序执行需要借助命令行 打开cmd方式 一 点击搜索输入cmd 二 按window键加R键,弹出窗口后再输入cm ...
- CMD生疏了?教你10招酷酷的Windows命令行指令
CMD生疏了?教你10招酷酷的Windows命令行指令 [PConline 技巧]经常在电影里看到这样的情节,某大神把键盘敲得震天响,一大串黑屏文字后,屏幕蓦然出现了一行大字"资料已销毁!& ...
- 使用命令行指令进行windows系统设置
目录 通过命令行指令完成win10系统设置 测试环境 实现原理 测试 通过命令行指令完成win10系统设置 问题描述:我们会在windows的系统设置里修改一些设置项,方便自己的使用.我们可以通过鼠标 ...
- redis docker安装、进入命令行后启动服务
下载redis镜像 首先查看一下redis是否正确: docker search redis 显示: NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis R ...
- linux命令后创建 iso 镜像_袋鼠存储 v1.4.1 来了:docker镜像,linux命令行安装,客户端......
袋鼠存储是一款跨平台,跨网络管理数据,就近为用户提供服务的分布式服务.可通过官网文档 roostore.com/docs# 详细了解 袋鼠存储自从发布以来,已得到大量用户的下载与使用反馈,在此感谢大家 ...
- cmd 顺序启动服务_CMD生疏了?教你10招酷酷的Windows命令行指令
[PConline 技巧]经常在电影里看到这样的情节,某大神把键盘敲得震天响,一大串黑屏文字后,屏幕蓦然出现了一行大字"资料已销毁!".虽然类似的情节常被大家戏称为NC,但不可否认 ...
- 常用的Git命令行指令以及图形化界面的简单操作
命令行操作 常用指令 指令 作用 指令 作用 cd 打开目录 pwd 绝对路径 ls 列出清单 mkdir 新建目录 cp 拷贝 mv 移动 rm 移除 touch 创建文档 一.git版本管理的指令 ...
- Windows 常用命令行指令 (持续更新)
常用DOS命令 1. dir : 列出当前目录下的文件及文件夹 2. md : 创建目录/文件夹 3. rd : 删除目录/文件夹(删除的目录必须为空目录) 4. cd : 进入指定目 ...
最新文章
- Scrum Mastery:有效利用组织的5个步骤
- 一款霸榜 GitHub 的开源 Linux 资源监视器!
- 【数据结构与算法】快排、归并 O(nlogn) 基于比较
- 电子科大计算机调试,电子科大计算机学院 汇编语言程序设计 实验报告 99分精品版.doc...
- 关于近期对自己的总结
- SpringMVC 上传图片保存到服务器 同时更改图片名称保存至数据库
- 今年立下的 Flag 倒了几个?
- 写给非网工的CCNA教程(7)通过VLAN连接实现同网段通信
- RTF文件格式编码说明
- 刘一男词汇课(从abdomen到enormous):书上有路勤为径,学海无涯“懂“作舟
- Linux 重命名文件和文件夹
- 用java编写台球小游戏项目
- Gitlab的自动流水线搭建
- 第二篇supervisor集群管理工具cesi安装详解-如何安装supervisor-cesiwebUI
- 判断字符串中是否存在空格符
- 基于微信小程序的垃圾分类小程序(语音识别和历史记录查询)(源码已开源)
- 2015计算机基础知识,计算机基础知识题库【2015版】
- muduo源码分析2——Singleton分析
- ev3 c语言高级编程,EV3运行原生C语言程序实例
- Learning a Deep Compact Image Representation for Visual Tracking 学习用于视觉跟踪的深度紧凑图像表示
热门文章
- window10安装深度linux双系统,转:【史上最详细】win10下的Deepin双系统安装小白教程-论坛-深度科技...
- 人力资本、人均受教育年限,受高等教育人数比重(1997-2020)
- Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等
- Python学习01、计算机基础概念、初识Python、常量,变量,类型和表达式、字符串、动态静态类型、注释
- 看过Django后回头来看Flask(1)
- C语言实现链表与文件的存取
- 计算机各个组成部分介绍
- Python+Vue计算机毕业设计食堂窗口美食评价系统4yee6(源码+程序+LW+部署)
- 视频 | 新基建:模式与路径 - 黄奇帆 王建宙 巴曙松 凌克 吴明辉 周伯文
- 什么是FormData对象?FormData对象的作用