docker-compose详解

安装:apt-get install docker-compose

docker-compose用来单机上编排容器(定义和运行多个容器,使容器能互通)

docker-compose将所管理的容器分为3层结构:project  service  container

docker-compose.yml组成一个project,project包括多个service,每个service定义了容器运行的镜像(或构建镜像),网络端口,文件挂载,参数,依赖等,每个service包括同一个镜像多个容器实例

即 project 包含 service ,service 包含 container 

 

常用命令:

官网地址:https://docs.docker.com/compose/reference/overview/

参考:http://blog.51cto.com/ityouknow/2091043

注意:

以下都需要在docker-compose.yml所在目录下执行,且名字就是默认的docker-compose.yml,否则需要加上 -f yml地址。Eg:  docker-compose -f /usr/docker/docker-compose1.yml ps

 

 

docker-compose ps :列出project所有运行容器(容器名:目录名_service_index  index表示容器序数,从1开始) 

Eg:

docker-compose详解_第1张图片

 

docker-compose logs [serviceName]:查看服务内所有容器日志输出,

加上serviceName表示输出某一个service的日志

-f:实时输出日志

 

docker-compose build:构建/重新构建所有镜像

当某个service的Dockerfile改变时,即镜像发生改变需要重新生成时,如果仅仅是docker-compose.yml改变,只需要up重新启动project即可

 

docker-compose up -d:构建(容器)并启动(容器)整个project的所有service(首次运行会包括运行docker-compose build)

-d:后台进程

--scale:指定服务运行的容器个数(如果服务有对外的端口就不能指定多个容器,因为端口已经被占用)   Eg:docker-compose up -d --scale web=1 --scale redis=2

 

docker-compose down -v:停止并移除整个project的所有services

-v :删除挂载卷和volunme的链接

 

docker-compose start [serviceName]:启动已存在但停止的所有service

(可选)serviceName:表示启动某一个service

 

docker-compose stop [serviceName]:停止已运行的service

(可选)serviceName:表示停止某一个service

 

docker-compose rm -f [serviceName]:删除已停止的所有service

(可选)serviceName:表示删除已停止某一个service(可以用docker-compose up重新构建service)

-f :删除不在询问

 

docker-compose run service command:在某个服务上运行命令 Eg:docker-compose run web ping www.baidu.com

docker-compose详解_第2张图片

 

docker-compose exec [serviceName] sh:进入到某个容器

--index:2  :当服务内有多个容器时,需要指定第几个,默认是第一个  Eg:docker-compose exec --index=2 web sh

 

 

 

 

 

docker-compose.yml:

官网地址:https://docs.docker.com/compose/compose-file/

 

version:指定 docker-compose.yml 文件的写法格式

services:多个容器集合

 

build:配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 路径

注:如果指定build同时也指定image,那么会从build里构建,镜像的名字和tag将取image指定的

build: .
image: webapp:tag

 

command:覆盖容器启动后默认执行的命令

command: bundle exec thin -p 3000
----------------------------------
command: [bundle,exec,thin,-p,3000]

 

 

environment:环境变量配置,可以用数组或字典两种方式

environment:
    RACK_ENV: development
    SHOW: 'ture'
-------------------------
environment:
    - RACK_ENV=development
    - SHOW=ture

 

image:指定服务所使用的镜像

version: '2'
services:
  redis:
    image: redis:alpine

 

expose:暴露端口,只将端口暴露给连接的服务,而不暴露给主机(一般用来标识镜像使用了那一个端口,方便用ports映射)

expose:
    - "3000"
    - "8000"

 

ports:对外暴露的端口定义,和 expose 对应。宿主机端口:容器端口

ports:   # 暴露端口信息  - "宿主机端口:容器暴露端口"
- "5001:5000"
- "8081:8080"

 

links:将指定容器连接到当前连接,可以设置别名,已废弃,推荐使用networks

networks

可参考:https://www.cnblogs.com/jsonhc/p/7823286.html

services:
  some-service:
    networks:
      db:
        aliases:
         - database
  db:
    image: postgres
         

这样 Web 服务就可以使用 db 或 database 作为 hostname 访问 db 服务了,默认以服务名为hostname

可以测试:docker-compose exec some-service ping database

version: '3'
services:
  nginx:
    image: nginx
    container_name: lnmp-nginx
    depends_on:
      - php
    ports:
      - "80:80"
    networks:
      - "net1"
    volumes:
      - "/www:/usr/local/nginx/html"
  php:
    image: php
    container_name: lnmp-php
    expose: 
      - "9000"
    networks:
      - "net1"
    volumes:
      - "/www:/usr/local/nginx/html"

networks:
  net1:
    driver: bridge

要访问其它容器或者服务时,只要指定networks的名字一致就可以了,默认名字bridge

 

 

volumes:卷挂载路径

depend_on:规定service加载顺序,在某些服务start后才能启动

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

 

logging:日志服务

driver:默认json-file,可选syslog

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

 

network_mode:设置网络模式

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

bridge:默认,需要单独配置ports映射主机port和服务的port,并且开启了容器间通信

host:和宿主机共享网络,比如service是8081端口,无需配置ports,直接可以用主机IP:8081访问

 

cap_add cap_drop:赋予/删除 容器某些能力

可运行 man 7 capabilities 查看所有能力

 

Eg:

version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: redis:alpine

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(docker)