• docker-compose详解


    1 安装:

    官方:

    curl -L https://github.com/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
    
    • 1
    • 2

    或者使用包管理工具:

    apt-get install docker-compose
    
    • 1

    2 使用场景

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

    Eg:前端和后端部署在一台机器上,现在直接通过编写docker-compose文件对多个服务(可定义依赖,按顺序启动服务)同时进行启动/停止/更新

    注:

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

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

    即 project 包含 service ,service 包含 container

    3 编写docker-compose.yml

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

    version: '3'
    services:
      back:
        image: backService:1.0
        container_name: back
        environment:
          - name=tom
          - DB_PATH=jdbc:sqlite:/data/ns.db
        restart: always
        privileged: true
        ports:
          - "9000:9000"
        networks:
          - "net"
        volumes:
          - "/root/k3s.kube.config:/k3s.kube.config"
          - "/root/data:/data"
          - "/etc/network/interfaces:/etc/network/interfaces"
      front:
        image: front:1.0
        container_name: front
        restart: always
        ports:
          - "10087:80"
        networks:
          - "net"
        volumes:
          - "/root/nginx.conf:/etc/nginx/nginx.conf"
    networks:
      net:
        driver: bridge
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

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

    services:多个容器集合environment:环境变量配置,可以用数组或字典两种方式

    environment:
        RACK_ENV: "development"
        SHOW: "ture"
    -------------------------
    environment:
        - RACK_ENV="development"
        - SHOW="ture"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    version: '2'
    services:
      redis:
        image: redis:alpine
    
    • 1
    • 2
    • 3
    • 4

    expose:定义容器用到的端口(一般用来标识镜像使用的端口,方便用ports映射

    expose:
        - "3000"
        - "8000"
    
    • 1
    • 2
    • 3

    ports:定义宿主机端口和容器端口的映射,可使用宿主机IP+宿主机端口进行访问**宿主机端口****😗*容器端口

    ports:   # 暴露端口信息  - "宿主机端口:容器暴露端口"
    - "5000"
    - "8081:8080"
    
    • 1
    • 2
    • 3

    注:仅指定容器端口时,宿主机将会随机选择端口

    volumes:卷挂载路径,定义宿主机的目录/文件和容器的目录/文件的映射宿主机路径:容器路径

    volumes:
      - "/var/lib/mysql"
      - "hostPath:containerPath"
      - "root/configs:/etc/configs"
    
    • 1
    • 2
    • 3
    • 4

    depend_on: 规定service加载顺序,例如数据库服务需要在后台服务前运行

    extra_hosts:类似于docker里的–add-host参数 配置DNS域名解析(域名和IP的映射)

    extra_hosts:
     - "googledns:8.8.8.8"
     - "dockerhub:52.1.157.61"
    
    • 1
    • 2
    • 3

    相当于在容器种的/etc/hosts文件里增加

    8.8.8.8 googledns
    52.1.157.61 dockerhub
    
    • 1
    • 2

    restart: always :配置重启,docker每次启动时会启动该服务

    restart: always
    
    • 1

    privileged: true :开启特权模式

    privileged: true
    
    • 1

    user: root :指定容器运行的用户名

    user: root
    
    • 1

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

    networks

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

    version: ‘3’
    services:
    front:
    image: front
    container_name: front
    depends_on:
    - php
    ports:
    - “80:80”
    networks:
    - “net1”

    volumes:
    - “/www:/usr/local/nginx/html”
    back:
    image: back
    container_name:back
    expose:
    - “9000”
    networks:
    - “net1”

    volumes:
    - “/www:/usr/local/nginx/html”

    networks:
    net1:
    driver: bridge

    front里可以直接用back替换IP访问back

    logging:日志服务

    driver:默认json-file,可选syslog

    logging:
      driver: syslog
      options:
        syslog-address: "tcp://192.168.0.42:123"
    
    • 1
    • 2
    • 3
    • 4

    network_mode:设置网络模式

    network_mode: "bridge"
    network_mode: "host"
    network_mode: "none"
    network_mode: "service:[service name]"
    network_mode: "container:[container name/id]"
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

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

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

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

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

    build: .
    image: webapp:tag
    
    • 1
    • 2

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

    command: bundle exec thin -p 3000
    ----------------------------------
    command: [bundle,exec,thin,-p,3000]
    
    • 1
    • 2
    • 3

    4 docker-compose命令:

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

    注意:

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

    Eg: docker-compose -f /usr/docker/docker-compose1.yml ps

    * 表示常用

    *** docker-compose pull:**拉取服务里定义的镜像

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

    Eg:

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

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

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

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

    * docker-compose up -d(相当于 build + start构建(容器)并启动(容器)整个project的所有service

    -d:后台进程

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

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

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

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

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

    -f :删除不在询问

    *** docker-compose down -v(**相当于 stop + rm :停止并移除整个project的所有services

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

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

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

    -f:实时输出日志

    docker-compose run service command:在某个服务上运行命令

    Eg:docker-compose run web ping www.baidu.com

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

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

    docker-compose restart [serviceName]: 重启服务

    docker-compose config:验证和查看compose文件

    docker-composeimages:列出所用的镜像

    docker-cpmpose scale:设置服务个数 Eg:docker-composescaleweb=2worker=3

    docker-compose pause [serviceName]:暂停服务

    docker-compose unpause [serviceName]:恢复服务

    常见流程:

    启动:创建docker-compose.yaml -> docker-compose pull -> docker-compose up -d

    更新:docker-compose down -v -> docker-compose pull -> docker-compose up -d

  • 相关阅读:
    Postman使用总结2
    436-C++基础语法(71-80)
    leetcode题型分析《数组》
    【Qt】对话框QDialog
    帆软FineReport决策报表之页面布局
    数字图像处理——实验四 数字图像的边缘检测实验
    载葛根素(Pur)聚乙烯亚胺/海藻酸钠(PEI/ALG)自组装纳米粒(Pur-PEI/ALG-NPs)|聚乙二醇/聚己内酯/聚乙烯亚胺载胰岛素纳米粒|齐岳
    进程互斥以及进程互斥实现方法(包含代码)
    基于JAVA奇妙店铺电子商务网站计算机毕业设计源码+数据库+lw文档+系统+部署
    软件项目管理【UML-组件图】
  • 原文地址:https://blog.csdn.net/m0_67392661/article/details/126327304