一、docker-compose 介绍
docker-compose是一个容器编排工具,单机版
有时候有一组服务他们有一些依赖关系,或者需要通信,需要同时部署(eg:web服务器与数据库),此时docker-compose可以简单的实现
且docker-compose会创建一个网络,从而在一个services中的容器,他们是在同一个子网的
指定一个yml文件作为docker-compose的配置文件来启动
docker-compose -f docker-compose-dev.yml up
二、docker-compose 使用
- 模板文件 docker-compose.yml
version: "3"
# 服务 里面包含了多个容器
services:
# 单个service(容器的配置)
webapp:
# 镜像名
image: imageName
# 共享内存的大小
shm_size: 1gb
#卷挂载
volumes:
- /var/www/project:/cached
# 最大文件限制数,主要是程序崩溃后会生成可调试文件core.2131 会占用内存,不启用即可
ulimits:
core: 0
nofile:
soft: 1024
hard: 1024
# 环境变量文件
env_file:
- .env
# 环境变量设置
environment:
RACK_ENV: development
SHOW: 'true'
- 指定yml配置文件名
docker-compose -f docker-compose-dev.yml up
二、 docker-compose 参数详解:
- 所使用的镜像名
image: image_name
- 文件挂载文件、目录映射 —— 注意:linux下vim修改文件wq后是一个新文件,也就是使用文件挂载,vim修改文件无法更新docker容器内的文件,所以这种(平时测试代码)可以选择目录挂载
volumes:
- /var/www/project:/cached # 目录挂载
- /var/www/u2.txt:/home/u2.txt # 文件挂载
挂载点 :
- 如果:挂载了父目录 /app 。里面有个子目录 /app/caches,然后又对子目录/app/caches挂载映射了其他目录,那么原来父目录的/app/caches会被覆盖为新的挂载的目录
- 比如先挂载了一个目录/root/atom-node1(atom-node1下面有个caches子目录)作为/app目录
- 然后又挂载了/app/caches 目录。这时候/tmp就覆盖了原来的/root/atom-node1/caches目录了
# 比如先挂载了一个目录/root/atom-node1(atom-node1下面有个caches子目录)作为/app目录,
# 然后又挂载了/app/caches 目录。这时候/tmp就覆盖了原来的/root/atom-node1/caches目录了
docker run -v /root/atom-node1:/app -it -v /tmp:/app/caches oc-runner bash
- 端口映射,把docker内部的端口暴露出来
ports:
- 8088:8088
- 重启操作
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
- 容器名称
container_name: "test2"
- 环境变量文件
env_file:
- .env
- .env的内容可以如下, 格式是name=value的形式,#表示注释
# Set Rails/Rack environment
RACK_ENV=development
- 环境变量 —— 有时候需要自定义一些环境变量
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
- external_links,链接其他的容器服务 (CONTAINER:ALIAS).
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
- ulimit 限制,限制生成可调试文件
# 最大文件限制数,主要是程序崩溃后会生成可调试文件core.2131 会占用内存,不启用即可
ulimits:
core: 0
nofile:
soft: 1024
hard: 1024
- shm_size 共享内存,这个会限制某些应用(eg. 谷歌浏览器)的使用内存,从而可能导致崩溃
shm_size: 1gb
- command 启动后的命令,这个会直接覆盖掉默认的 dockerfile定义的command
command: bundle exec thin -p 3000
- depends_on 由于启动顺序是随机的,所以如果有依赖关系的话,需要使用这个
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
- entrypoint 容器启动的入口点:docker-compose这里定义的话。会覆盖原本docker的image的默认的entrypoint
# 覆盖Dockerfile文件里面的:ENTRYPOINT command param1 param2
entrypoint : /code/entrypoint.sh
- command 容器的启动命令:docker-compose 这里定义的话,会覆盖docker image里面的CMD 命令
# 覆盖Dockerfile里面的:CMD ./entrypoint.py start
command: bundle exec thin -p 3000
- 执行多行命令的方式:使用 bash -c "command1 && command2"
command: bash -c "ls && pwd && ./start.sh"
三、docker-compose 坑 之 不支持 shell command 扩展
- 本来想在docker-compose.yml中 使用shell动态来映射目录【实际并不支持】:
volumes:
- /var/lib/docker/containers/$(docker inspect --format="{{.Id}}" atom-node1_oc-runner_1):/var/log/atom-node1