docker-compose 的使用及参数

2020-04-14  本文已影响0人  谁有羊毛

一、docker-compose 介绍

  1. docker-compose是一个容器编排工具,单机版

  2. 有时候有一组服务他们有一些依赖关系,或者需要通信,需要同时部署(eg:web服务器与数据库),此时docker-compose可以简单的实现

  3. 且docker-compose会创建一个网络,从而在一个services中的容器,他们是在同一个子网的

  4. 指定一个yml文件作为docker-compose的配置文件来启动

 docker-compose -f docker-compose-dev.yml up

二、docker-compose 使用

  1. 模板文件 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'
  1. 指定yml配置文件名
docker-compose -f docker-compose-dev.yml up

二、 docker-compose 参数详解:

  1. 所使用的镜像名
image: image_name
  1. 文件挂载文件、目录映射 —— 注意:linux下vim修改文件wq后是一个新文件,也就是使用文件挂载,vim修改文件无法更新docker容器内的文件,所以这种(平时测试代码)可以选择目录挂载
volumes:
  - /var/www/project:/cached # 目录挂载
  - /var/www/u2.txt:/home/u2.txt # 文件挂载

挂载点 :

  1. 如果:挂载了父目录 /app 。里面有个子目录 /app/caches,然后又对子目录/app/caches挂载映射了其他目录,那么原来父目录的/app/caches会被覆盖为新的挂载的目录
  2. 比如先挂载了一个目录/root/atom-node1(atom-node1下面有个caches子目录)作为/app目录
  3. 然后又挂载了/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

  1. 端口映射,把docker内部的端口暴露出来
ports: 
  - 8088:8088
  1. 重启操作
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
  1. 容器名称
container_name: "test2"
  1. 环境变量文件
env_file:
  - .env
# Set Rails/Rack environment
RACK_ENV=development
  1. 环境变量 —— 有时候需要自定义一些环境变量
environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:
  1. external_links,链接其他的容器服务 (CONTAINER:ALIAS).
external_links:
  - redis_1
  - project_db_1:mysql
  - project_db_1:postgresql
  1. ulimit 限制,限制生成可调试文件
 # 最大文件限制数,主要是程序崩溃后会生成可调试文件core.2131 会占用内存,不启用即可
  ulimits:
      core: 0
      nofile:
        soft: 1024
        hard: 1024
  1. shm_size 共享内存,这个会限制某些应用(eg. 谷歌浏览器)的使用内存,从而可能导致崩溃
shm_size: 1gb
  1. command 启动后的命令,这个会直接覆盖掉默认的 dockerfile定义的command
command: bundle exec thin -p 3000
  1. depends_on 由于启动顺序是随机的,所以如果有依赖关系的话,需要使用这个
version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
  1. entrypoint 容器启动的入口点:docker-compose这里定义的话。会覆盖原本docker的image的默认的entrypoint
# 覆盖Dockerfile文件里面的:ENTRYPOINT command param1 param2
entrypoint : /code/entrypoint.sh
  1. command 容器的启动命令:docker-compose 这里定义的话,会覆盖docker image里面的CMD 命令
# 覆盖Dockerfile里面的:CMD ./entrypoint.py start
command: bundle exec thin -p 3000
command: bash -c  "ls && pwd && ./start.sh"

三、docker-compose 坑 之 不支持 shell command 扩展

  1. 本来想在docker-compose.yml中 使用shell动态来映射目录【实际并不支持】:
volumes: 
  - /var/lib/docker/containers/$(docker inspect --format="{{.Id}}" atom-node1_oc-runner_1):/var/log/atom-node1
  1. issue:https://github.com/docker/compose/issues/4081

  1. docker-compose 参数 官方文档
上一篇下一篇

猜你喜欢

热点阅读