• docker-compose示例与命令介绍


    一、docker-compose.yml示例

    version: ‘2‘    #指定compose版本
    services:
      log:    #服务名称
        image: vmware/harbor-log    #指定镜像名称
        container_name: harbor-log  #启动后的容器名称
        restart: always    #down掉自动重启
        volumes:    #宿主机和容器关联的目录
          - /var/log/harbor/:/var/log/docker/
        ports:    #映射出来的端口
          - 1514:514
      registry:
        image: library/registry:2.5.0
        container_name: registry
        restart: always
        volumes:
          - /data/registry:/storage
          - ./common/config/registry/:/etc/registry/
        environment:    #设置环境变量
          - GODEBUG=netdns=cgo
        command:    #容器内执行命令
          ["serve", "/etc/registry/config.yml"]
        depends_on:    #依赖关系
          - log
        logging:    #日志设置
          driver: "syslog"    #指定日志设备的容器
          options:  
            syslog-address: "tcp://127.0.0.1:1514" #日志连接地址
            tag: "registry"    #日志标签

    二、命令

    YAML 模板文件

    默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。

    其它大部分指令都跟 docker run 中的类似。

    如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMDEXPOSEVOLUMEENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置。

    image

    指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉去这个镜像。

    例如:

    image: ubuntu
    image: orchardup/postgresql
    image: a4bc65fd

    build

    指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

    build: /path/to/build/dir

    command

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

    command: bundle exec thin -p 3000

    links

    链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。

    links:
     - db
     - db:database
     - redis

    使用的别名将会自动在服务容器中的 /etc/hosts 里创建。例如:

    172.17.2.186  db
    172.17.2.186  database
    172.17.2.187  redis

    相应的环境变量也将被创建。

    external_links

    链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 管理的容器。参数格式跟 links 类似。

    external_links:
     - redis_1
     - project_db_1:mysql
     - project_db_1:postgresql

    ports

    暴露端口信息。

    使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

    ports:
     - "3000"
     - "8000:8000"
     - "49100:22"
     - "127.0.0.1:8001:8001"

    注:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。

    expose

    暴露端口,但不映射到宿主机,只被连接的服务访问。

    仅可以指定内部端口为参数

    expose:
     - "3000"
     - "8000"

    volumes

    卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。ro为只读的意思

    volumes:
     - /var/lib/mysql
     - cache/:/tmp/cache
     - ~/configs:/etc/configs/:ro

    volumes_from

    从另一个服务或容器挂载它的所有卷。

    volumes_from:
     - service_name
     - container_name

    environment

    设置环境变量。你可以使用数组或字典两种格式。

    只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。

    environment:
      RACK_ENV: development
      SESSION_SECRET:
    
    environment:
      - RACK_ENV=development
      - SESSION_SECRET

    env_file

    从文件中获取环境变量,可以为单独的文件路径或列表。

    如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。

    如果有变量名称与 environment 指令冲突,则以后者为准。

    env_file: .env
    
    env_file:
      - ./common.env
      - ./apps/web.env
      - /opt/secrets.env

    环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

    # common.env: Set Rails/Rack environment
    RACK_ENV=development

    extends

    基于已有的服务进行扩展。例如我们已经有了一个 webapp 服务,模板文件为 common.yml

    # common.yml
    webapp:
      build: ./webapp
      environment:
        - DEBUG=false
        - SEND_EMAILS=false

    编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。

    # development.yml
    web:
      extends:
        file: common.yml
        service: webapp
      ports:
        - "8000:8000"
      links:
        - db
      environment:
        - DEBUG=true
    db:
      image: postgres

    后者会自动继承 common.yml 中的 webapp 服务及相关环节变量。

    net

    设置网络模式。使用和 docker client 的 --net 参数一样的值。

    net: "bridge"
    net: "none"
    net: "container:[name or id]"
    net: "host"

    pid

    跟主机系统共享进程命名空间。打开该选项的容器可以相互通过进程 ID 来访问和操作。

    pid: "host"

    dns

    配置 DNS 服务器。可以是一个值,也可以是一个列表。

    dns: 8.8.8.8
    dns:
      - 8.8.8.8
      - 9.9.9.9

    cap_add, cap_drop

    添加或放弃容器的 Linux 能力(Capabiliity)。

    cap_add:
      - ALL
    
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN

    dns_search

    配置 DNS 搜索域。可以是一个值,也可以是一个列表。

    dns_search: example.com
    dns_search:
      - domain1.example.com
      - domain2.example.com

    working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares

    这些都是和 docker run 支持的选项类似。

    cpu_shares: 73
    
    working_dir: /code
    entrypoint: /code/entrypoint.sh
    user: postgresql
    
    hostname: foo
    domainname: foo.com
    
    mem_limit: 1000000000
    privileged: true
    
    restart: always
    
    stdin_open: true
    tty: true
     三、docker-compose基本用法

    启动服务

    定义好服务以后,在项目的目录启动这些服务,可以执行:

    docker-compose up

    这样会启动,在compose文件下定义的所有服务。由于这是第一次启动这个服务,所以可以看到它是creating,也就是去创建相关的东西。首先会创建这个服务使用的网络,这里是叫做「beckdocker_default」的网络,然后是dog和cat的服务,这些网络和服务的名字,默认会加上一个前缀,由于在创建应用的时候没有指定名字,所以会默认使用项目目录的名字,后面还有一个数字的后缀。最后会有一个「Attaching to …」,将网络应用到服务上。

    启动成功后,在浏览器访问一下。8080对应的是dog的服务,8081是cat的服务。

    回到终端,可以看到服务的访问日志,日志的开头会有服务的名字,标志着日志是从哪个服务来的:

    如果希望服务在后台运行,可以使用-d选项(也就是detach):

    docker-compose up -d

    服务的生命周期

    查看正在运行的服务

    docker-compose ps

    停止一个服务

    docker-compose stop [服务名]
    如果后面不加服务名,会停止所有的服务。

    启动某一个服务

    docker-compose start [服务名]
    如果后面不加服务名,会启动所有的服务。

    查看服务运行的log

    docker-compose logs -f
    加上-f选项,可以持续跟中服务产生的log。

    进入服务容器中

    docker-compose exec dog bash

    删除服务

    docker-compose rm

    注意这个docker-compose rm不会删除应用的网络和数据卷。查看一下网络,可以看到应用创建的网络「beckdocker_default」,如果要删除所有的这些,可以使用:

    docker-compose down

     

  • 相关阅读:
    关于篮球🏀
    Docker学习笔记
    Java中的强引用,软引用,弱引用,虚引用
    MySQL:show process
    航空航天概论复习
    【Shell技巧】shell统计文件夹下的文件个数、目录个数 Don't use ls | grep. Use a glob or a for loop with a condition to allow nonalphanumeric filenames.
    【Shell技巧】以空格分隔的字符串解析成数组 Prefer mapfile or read a to split command output (or quote to avoid splitting).
    【Shell Check】Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
    【Shell技巧】清理文件内的所有文件以及 Use "${var:?}" to ensure this never expands to /* .
    【go语言基础】函数
  • 原文地址:https://www.cnblogs.com/boshen-hzb/p/6433564.html
Copyright © 2020-2023  润新知