docker-compose 基础命令
Docker Compose管理容器的结构
Docker Compose将所管理的容器分为三层,分别是工程( project),服务(service)以及容器( container)。 Docker Compose运行目录下的所有文件( docker-compose.yml、 extends文件或环境变量文件等)组成一个工程(默认为 docker-compose.yml所在目录的目录名称)。一个工程可包含多个服务,每个服务中定义了容器运行的镜像、参数和依赖,一个服务可包括多个容器实例。
同一个docker compose内部的容器之间可以用服务名相互访问,服务名就相当于hostname,可以直接 ping 服务名,得到的就是服务对应容器的ip,如果服务做了扩容,一个服务对应了多个容器,则 ping 服务名 会轮询访问服务对应的每台容器ip ,docker底层用了LVS等技术帮我们实现这个负载均衡。
docker-compos 基础命令
image
指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。
示例:
image: java
build
指定Dockerfile文件的路径。可以是一个路径,例如:
build: ./dir
也可以是一个对象,用以指定Dockerfile和参数,例如:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
command
覆盖容器启动后默认执行的命令。
示例:
command: bundle exec thin -p 3000
也可以是一个list,类似于Dockerfile总的CMD指令,格式如下:
command: [bundle, exec, thin, -p, 3000]
links
显示链接到其他服务中的容器。可以指定服务名称和链接的别名使用SERVICE:ALIAS 的形式,或者只指定服务名称,示例:
web:
links:
- db
- db:database
- redis
external_links
表示链接到docker-compose.yml外部的容器,甚至并非Compose管理的容器,特别是对于那些提供共享容器或共同服务。格式跟links类似,示例:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
ports
暴露端口信息。使用宿主端口:容器端口的格式,或者仅仅指定容器的端口(此时宿主机将会随机指定端口),类似于docker run -p ,示例:
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"
expose
暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机,示例:
expose:
- "3000"
- "8000"
volumes
卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。示例:
volumes:
# Just specify a path and let the Engine create a volume
- /var/lib/mysql
# Specify an absolute path mapping
- /opt/data:/var/lib/mysql
# Path on the host, relative to the Compose file
- ./cache:/tmp/cache
# User-relative path
- ~/configs:/etc/configs/:ro
# Named volume
- datavolume:/var/lib/mysql
volumes_from
从另一个服务或者容器挂载卷。可以指定只读或者可读写,如果访问模式没有指定,则默认是可读写。示例:
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
environment
设置环境变量。可以使用数组或者字典两种方式。只有一个key的环境变量可以在运行Compose的机器上找到对应的值,这有助于加密的或者特殊主机的值。示例:
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
env_file
从文件中获取环境变量,可以为单独的文件路径或列表。如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则以envirment 为准。示例:
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
extends
继承另一个服务,基于已有的服务进行扩展。
net
设置网络模式。示例:
net: "bridge"
net: "host"
net: "none"
net: "container:[service name or container name/id]"
dns
配置dns服务器。可以是一个值,也可以是一个列表。示例:
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
dns_search
dns_search
配置DNS的搜索域,可以是一个值,也可以是一个列表,示例:
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
replicas
指定副本数;
version: '3.4'
services:
worker:
image: nginx:latest
deploy:
replicas: 6
restart
重启策略;
#默认的重启策略,在任何情况下都不会重启容器
restart: "no"
#容器总是重新启动
restart: always
#退出代码指示失败错误,则该策略会重新启动容器
restart: on-failure
#重新启动容器,除非容器停止
restart_policy
指定重启策略;
version: "3.4"
services:
redis:
image: redis:latest
deploy:
restart_policy:
condition: on-failure #重启条件:on-failure, none, any
delay: 5s # 等待多长时间尝试重启
max_attempts: 3 #尝试的次数
window: 120s # 在决定重启是否成功之前等待多长时间
update_config
定义更新服务的方式,常用于滚动更新;
version: '3.4'
services:
vote:
image: docker-compose-demo
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2 # 一次更新2个容器
delay: 10s # 开始下一组更新之前,等待的时间
failure_action:pause # 如果更新失败,执行的动作:continue, rollback, pause,默认为pause
max_failure_ratio: 20 # 在更新过程中容忍的失败率
order: stop-first # 更新时的操作顺序,停止优先(stop-first,先停止旧容器,再启动新容器)还是开始优先(start-first,先启动新容器,再停止旧容器),默认为停止优先,从version 3.4才引入该配置项
depends_on
定义当前服务启动时,依赖的服务,当前服务会在依赖的服务启动后启动;
depends_on:
- docker-compose-demo02
- docker-compose-demo01
container_name
启动容器名
services:
docker-compose-demo01:
build:
context: /usr/local/docker-compose-demo
dockerfile: Dockerfile
image: docker-compose-demo
container_name: docker-compose-demo01
networks
网络决定了服务之间以及服务和外界之间如何去通信,在执行docker-compose up的时候,docker会默认创建一个默认网络,创建的服务也会默认的使用这个默认网络。服务和服务之间,可以使用服务的名字进行通信,也可以自己创建网络,并将服务加入到这个网络之中,这样服务之间可以相互通信,而外界不能够与这个网络中的服务通信,可以保持隔离性。
#指定对应的网络
networks:
- docker-compose-demo-net
networks:
docker-compose-demo-net:
driver: bridge
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1
ipv4_address, ipv6_address
加入网络时,为此服务指定容器的静态 IP 地址;
version: "3.9"
services:
app:
image: nginx:alpine
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
- subnet: "2001:3984:3989::/64"
其他
docker-compose.yml 还有很多其他命令,这里仅挑选常用命令进行讲解,其它不作赘述。如果感兴趣的,可以参考docker-compose.yml文件官方文档:Compose specification | Docker Documentation
相关文章
- docker容器封装redis 挖矿病毒kdevtmpfs的处理
- .net Core 中DateTime在Linux Docker中与Windows时间不一致
- docker探索-Docker 1.13 编排能力进化(十三)
- 【Docker异常】ERROR: dial unix docker.raw.sock: connect: connection refused
- Docker - 构建镜像:使用docker build命令和Dockerfile文件
- Docker - 构建镜像:使用docker commit命令
- 运维基础之Docker(2)通过docker部署zookeeper nginx tomcat java redis kibana/elasticsearch/logstash mysql kafka mesos/marathon ftp git
- Docker 基础操作 容器自启动 删除镜像和删除容器
- 【docker】Docker快速入门总结笔记(命令大全)
- 【Android 电量优化】电量优化 ( 耗电量测试 | Battery Historian 简介 | apt 源更新 | Docker 安装 | Battery Historian 安装 )
- (二)docker的部署安装,配置,基础命令
- Docker使用阿里云docker镜像加速
- Docker与iptables 只允许特定ip访问Docker的服务 通过iptables限制docker容器端口
- 【Docker】Windows将docker下载的镜像存放到其他盘
- 【Docker】在本地打包maven程序为docker镜像报错: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1]
- y22.第二章 Docker从入门到精通 -- Cgroups和docker 的资源限制(四)
- 【云原生之Docker实战】使用docker部署Homebox内网测速工具
- 【云原生之Docker实战】使用Docker部署jpress开源网站
- 【云原生之Docker实战】使用docker部署Halo博客系统
- 【云原生之Docker实战】使用docker部署webterminal堡垒机
- 【云原生之Docker】使用docker部署talebook个人图书管理平台
- Docker pull拉取镜像报错“Error response from daemon: Get “https://registry-1.docker.io/v2”解决办法
- docker 安装ps命令
- Docker技术----docker-compose实战----快速搭建WordPress博客系统
- 【最全最详细Docker】用docker部署mysql、tomcat、nginx、redis 环境部署
- Docker学习笔记08:docker使用之镜像使用
- Docker笔记 | 基础概念