docker初识以及Dokerfile和docker-compose基本命令解析

docker初识和基本命令

docker简介

在这里插入图片描述

从上图可以看到客户端通过命令方式,跟docker主机的守护程序交互,操作Docker镜像,Docker容器是由Docker镜像创建的运行实例。最后可从Docker仓库上传或下载Docker镜像

  • 相关术语

    English中文
    host宿主机
    image镜像
    container容器
    registry仓库
    daemon守护程序
    client客户端
下载并安装
  • 下载地址 docker for windows

  • 安装完成重启电脑

  • 启动docker for windows,命令行中执行docker version,出现下面信息标识docker安装成功

    C:\Users\haorongzhi>docker version
    Client: Docker Engine - Community
    Cloud integration: 1.0.2
    Version: 19.03.13
    API version: 1.40
    Go version: go1.13.15
    Git commit: 4484c46d9d
    Built: Wed Sep 16 17:00:27 2020
    OS/Arch: windows/amd64
    Experimental: false

    Server: Docker Engine - Community
    Engine:
    Version: 19.03.13
    API version: 1.40 (minimum version 1.12)
    Go version: go1.13.15
    Git commit: 4484c46d9d
    Built: Wed Sep 16 17:07:04 2020
    OS/Arch: linux/amd64
    Experimental: false
    containerd:
    Version: v1.3.7
    GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175
    runc:
    Version: 1.0.0-rc10
    GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
    docker-init:
    Version: 0.18.0
    GitCommit: fec3683

docker常用命令及相关参数解析
  • 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
    docker login [OPTIONS] [SERVER]
    -u :登陆的用户名
    -p :登陆的密码
    #例子 默认是docker hub仓库
    docker login -u 用户名 -p 密码 
    
  • 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

    docker logout [OPTIONS] [SERVER]
    docker logout
    
  • 镜像操作
    • 获取当前所有镜像
      docker image ls
      #或
      docker images
      

      C:\Users\haorongzhi>docker images
      REPOSITORY TAG IMAGE ID CREATED SIZE
      alpine/git latest 76a4083eacef 5 days ago 28.4MB

      REPOSITORY:镜像所在的仓库名称;

      TAG:镜像标签

      IMAGEID:镜像ID

      CREATED:镜像的创建日期(不是获取该镜像的日期)

      SIZE:镜像大小

    • 查询镜像
      docker search [OPTIONS] 镜像名称
      
      #可选参数
      --automated :只列出 automated build类型的镜像;
      
      --no-trunc :显示完整的镜像描述;
      
      -s :列出收藏数不小于指定值的镜像。
      

      #查询start数不小于1000的mysql镜像

      C:\Users\haorongzhi>docker search -s 1000 mysql
      Flag --stars has been deprecated, use --filter=stars=3 instead
      NAME DESCRIPTION STARS OFFICIAL AUTOMATED
      mysql MySQL is a widely used, open-source relation… 10202 [OK]
      mariadb MariaDB is a community-developed fork of MyS… 3753 [OK]

    • 拉取镜像
      # 官方镜像
      docker image pull 镜像名称:TAG
      # 或简写为 
      docker pull 镜像名称:TAG
      #:TAG 可不加 默认拉取latest标签
      
      # 个人镜像
      docker pull 仓库名称/镜像名称
      
      # 第三方仓库
      docker pull 第三方仓库地址/仓库名称/镜像名称
      docker pull hub.c.163.com/library/mysql:latest
      #(默认仓库名为library,所有从官方获取镜像相当于`sudo docker image pull library/镜像名称`)
      
      

      C:\Users\haorongzhi>docker pull ubuntu
      Using default tag: latest
      latest: Pulling from library/ubuntu
      da7391352a9b: Pull complete
      14428a6d4bcd: Pull complete
      2c2d948710f2: Pull complete
      Digest: sha256:c95a8e48bf88e9849f3e0f723d9f49fa12c5a00cfc6e60d2bc99d87555295e4c
      Status: Downloaded newer image for ubuntu:latest
      docker.io/library/ubuntu:latest

    • 删除镜像
      docker image rm 镜像名或镜像ID 
      #或 
      docker rmi 镜像名或镜像ID
      

      问题:

      Error response from daemon: conflict: unable to remove repository reference “alpine/git” (must force) - container db4643e78770 is using its referenced image 76a4083eacef

      有使用该镜像的容器,首先删除容器。(查看容器操作命令)

      C:\Users\haorongzhi>docker rmi alpine/git
      Untagged: alpine/git:latest
      Untagged: alpine/git@sha256:f3a0a5f4b156e34708a9315b175f1bc7c54e7fb913a2d068c438859e92ac408a
      Deleted: sha256:76a4083eacef13b245bfd9039b263d351f8f5214a76a21bc5d2c8df32d4e6562
      Deleted: sha256:5341ce7ea6339047c033ee79b5389fc38a6f547c382fc476d08d5a0399cc8195
      Deleted: sha256:154ea97b5937e06768f6b3147840c8747e37c90ae3d07cf7b7bb967bb2db99df
      Deleted: sha256:ace0eda3e3be35a979cec764a3321b4c7d0b9e4bb3094d20d3ff6782961a8d54

    • 上传镜像
      docker push 第三方仓库地址/仓库名称/镜像名称:TAG
      
    • 加载镜像 运行容器
      docker run [可选参数] 镜像名 [向启动容器中传入的命令]
      
      常用可选参数作用
      -i表示以《交互模式》运行容器。
      -d会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
      -t表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
      –name为创建的容器命名。(默认会随机给名字,不支持中文字符!!!)
      -v表示目录映射关系,即宿主机目录:容器中目录。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
      -p表示端口映射,即宿主机端口:容器中端口。 比如:-p 8080:80 就是将容器中的80端口,映射到主机中的8080端口
      –network=host表示将主机的网络环境映射到容器中,使容器的网络与主机相同。每个 Docker 容器都有自己的网络连接空间连接到虚拟 LAN。使用此命令则会让容器和主机共享一个网络空间。

      C:\Users\haorongzhi>docker run -d -p 8080:80 --name hrzfirststart docker/getting-started
      Unable to find image ‘docker/getting-started:latest’ locally
      latest: Pulling from docker/getting-started
      188c0c94c7c5: Pull complete
      61c2c0635c35: Pull complete
      378d0a9d4d5f: Pull complete
      2fe865f77305: Pull complete
      b92535839843: Pull complete
      ebe280ac36f4: Pull complete
      b7beeb601852: Pull complete
      Digest: sha256:7434aacfacb3c2d7d49f013e8a8092fde022c8b9f058b7fae7077e9cad1edc99
      Status: Downloaded newer image for docker/getting-started:latest
      908df6a58f4f0855f55c622a08d47d7246e459d60bf646324803dedc656d8aff

      打开http://localhost:8080/ 即可打开页面

    • TAG 标记镜像
      docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
      
      #例如
      docker tag ubuntu:15.10 runoob/ubuntu:v3
      
  • 容器操作
    • 查看容器
      # 查看当前所有正在运行的容器
      docker ps
      # 查看当前所有的容器
      docker ps -a
      # 使用过滤器(除了name外,常用的还可以指定id:id= 、所有停止的容器:status=exited,正在运行的容器:status=running 等)
      docker ps -f name=指定的名字
      # 显示2个上次创建的容器(2可以改变)
      docker ps -n 2
      # 显示最新创建的容器(包括所有状态)
      docker ps -l
      # 仅显示ip
      docker ps -q
       # 显示容器大小
      docker ps -s
      

      C:\Users\haorongzhi>docker ps
      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
      908df6a58f4f docker/getting-started “/docker-entrypoint.…” 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp hrzfirststart

      标签含义
      CONTAINER ID镜像ID
      IMAGE创建容器的镜像名称
      COMMAND默认启动命令(启动时会自动执行)
      CREATED创建容器的日期
      STATUS当前的状态(启动了多久,多久之前退出等)
      PORTS映射的端口
      NAMES容器的名称
      SIZE容器大小(使用-s命令参数时才能看到)
    • 启动和关闭容器
      # 停止容器
      docker container stop 容器名或容器id
      # 或可简写为
      docker stop 容器名或容器id
      
      # 强制关闭容器
      docker container kill 容器名或容器id
      # 或可简写为
      docker kill 容器名或容器id
      
      # 启动容器
      docker container start 容器名或容器id
      # 或可简写为
      docker start 容器名或容器id
      

      C:\Users\haorongzhi>docker ps
      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
      908df6a58f4f docker/getting-started “/docker-entrypoint.…” 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp hrzfirststart

      C:\Users\haorongzhi>docker stop 908df6a58f4f
      908df6a58f4f

      C:\Users\haorongzhi>docker start 908df6a58f4f
      908df6a58f4f

    • 操作后台容器
      # 如果我只需要执行简单的一两条命令可以使用docker exec
      # 执行单条命令 (-i: 启动并且保留交互式命令行; -t:作用是分配一个虚拟的终端; docker run )
      docker exec -it 容器名或容器id 执行的命令
      # 比如
      docker exec -it kali-test whoami
      # 用这种方法,我们还可以启动命令行,根据Linux的特性,系统程序会在/bin中,linux中常用的Shell有多个,其中大部分用的Linux默认的为bash
      # 所以我们启动命令可以自行如下命令(除了/bin/bash外,linux一般还会带/bin/sh、/bin/rbash、/bin/dash等,具体区别可以自行百度)
      docker exec -it 容器名或容器id /bin/bash
      # 比如
      docker exec -it kali-test /bin/bash
      # 除了exec外还有attach可以使用,但它有个弊端,多终端启动attach后,都会会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
      docker attach 容器名或容器id
      # 比如
      docker attach kali-test
      
      exec可选参数作用
      -d会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
      -e设置环境变量
      -i表示以《交互模式》运行容器。
      -t表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
      -u设置用户名和UID。
      -w设置容器内的工作目录。
    • 删除容器
      # 使用rm删除容器
      docker rm 容器名或容器id
      
    • 容器制作为镜像
      # 将容器制作成镜像
      docker commit [OPTIONS] 容器名/容器id 镜像名称
      # 镜像打包备份(打包备份的文件会自动存放在当前命令行的路径下,如果想让保存的文件可以打开,可以加.tar后缀)
      #例如
      docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1 
      docker save -o 保存的文件名 镜像名
      # 镜像解压
      docker load -i 文件路径/备份文件
      
      参数作用
      -a提交的镜像作者;
      -c使用Dockerfile指令来创建镜像;
      -m提交时的说明文字;
      -p在commit时,将容器暂停。

      C:\Users\haorongzhi>docker commit 908df6a58f4f hrztestimage
      sha256:fa0876e299a2311ffbeb999325e4e9f446cfe475b37492e91a973a975c25d0ef

      C:\Users\haorongzhi>docker images
      REPOSITORY TAG IMAGE ID CREATED SIZE
      hrztestimage latest fa0876e299a2 9 seconds ago 27.2MB
      ubuntu latest f643c72bc252 8 hours ago 72.9MB
      docker/getting-started latest 67a3629d4d71 3 weeks ago 27.2MB

    • 容器和宿主机进行文件拷贝
      docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
      docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
      
      -L :保持源目标中的链接
      #例
      docker cp /www/runoob 96f7f14e99ab:/www/
      
      
Dokerfile说明和使用
  • 文件说明和构建说明

    Dockerfile是一个包含用于组合镜像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成镜像。

    Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

    docker build命令用于从Dockerfile构建镜像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

    例:

    docker build -f /path/to/a/Dockerfile
    
  • 常用指令
    指令说明
    FROM设置镜像使用的基础镜像
    MAINTAINER镜像的作者
    RUN编译镜像时运行的脚本
    CMD设置容器的启动命令
    LABLE镜像的标签
    EXPOSE镜像暴露的端口
    ENV容器的环境变量
    ADD编译镜像时复制文件到镜像中
    COPY编译镜像时复制文件到镜像中
    ENTRYPPOINT设置容器的入口程序
    VOLUME设置容器的挂载卷
    USER设置运行RUN CMD ENTRYPOINT的用户名
    WORKDIR设置RUN CMD ENTRYPOINT COPY ADD指令的工作目录
    ARG设置编译镜像时加入的参数
    ONBUILD设置镜像的ONBUILD指令
    STOPSIGNAL设置容器的退出信号量
    #示例
    
    FROM openjdk:8-jre-buster
    #声明维护任人员的联系方式
    LABEL maintainer="haorongzhi"
    #jar文件路径 相当于CD
    WORKDIR  /myserver
    #添加jar文件到该目录
    ADD myjar.jar .
    #预制环境变量
    ENV  JAVA_OPTS =""
    #暴露服务端口
    EXPOSE 8080
    #挂载外部目录
    VOLUME  /temp
    #程序启动命令
    ENTRYPOINT ["sh","-c","java ${JAVA_OPTS} -jar /myserver/myjar.jar"]
    
  • 常用指令说明 参考Docker实战-编写Dockerfile
    • FROM

      语法:FROM < image>[:< tag> | @< digest>]
      #例子

      FROM mysql:5.6
      

      注意:如果忽略tag选项,会使用latest镜像

    • MAINTAINER

      语法:MAINTAINER < name>

    • RUN

      语法: RUN < command>
      RUN [“executable”,”param1”,”param2”]
      提示:RUN指令会生成容器,在容器中执行脚本,容器使用当前镜像,脚本指令完成后,Docker Daemon会将该容器提交为一个中间镜像,供后面的指令使用
      补充:RUN指令第一种方式为shell方式,使用/bin/sh -c < command>运行脚本,可以在其中使用\将脚本分为多行
      RUN指令第二种方式为exec方式,镜像中没有/bin/sh或者要使用其他shell时使用该方式,其不会调用shell命令
      例子:RUN source $HOME/.bashrc;
      echo $HOME

      ​ RUN [“/bin/bash”,”-c”,”echo hello”]

      ​ RUN [“sh”,”-c”,”echo”,”$HOME”] 使用第二种方式调用shell读取环境变量

    • CMD

      语法:CMD [“executable”,”param1”,”param2”]
      CMD [“param1”,”param2”]
      CMD < command>
      提示:CMD第一种、第三种方式和RUN类似,第二种方式为ENTRYPOINT参数方式,为entrypoint提供参数列表
      注意:Dockerfile中只能有一条CMD命令,如果写了多条则最后一条生效

    • LABEL

      格式:LABEL < key>=< value> < key>=< value> …
      提示:不同标签之间通过空格隔开
      注意:每条指令都会生成一个镜像层,Docker中镜像最多只能有127层,如果超出Docker Daemon就会报错,如LABEL …=… <假装这里有个换行> LABEL …=…合在一起用空格分隔就可以减少镜像层数量,同样,可以使用连接符\将脚本分为多行
      镜像会继承基础镜像中的标签,如果存在同名标签则会覆盖

    • EXPOSE

      语法:EXPOSE < port> < port> …
      延伸:镜像暴露端口可以通过docker inspect查看
      提示:容器启动时,Docker Daemon会扫描镜像中暴露的端口,如果加入-P参数,Docker Daemon会把镜像中所有暴露端口导出,并为每个暴露端口分配一个随机的主机端口(暴露端口是容器监听端口,主机端口为外部访问容器的端口)
      注意:EXPOSE只设置暴露端口并不导出端口,只有启动容器时使用-P/-p才导出端口,这个时候才能通过外部访问容器提供的服务

    • ENV

      语法:ENV < key>=< value>…|< key> < value>
      注意:环境变量在整个编译周期都有效,第一种方式可设置多个环境变量,第二种方式只设置一个环境变量
      提示:通过${变量名}或者 变 量 名 使 用 变 量 , 使 用 方 式 变量名使用变量,使用方式 使使{变量名}时可以用${变量名:-default} ${变量名:+cover}设定默认值或者覆盖值
      ENV设置的变量值在整个编译过程中总是保持不变的

    • ADD

      语法:ADD < src>… < dest>|[“< src>”,… “< dest>”]
      注意:当路径中有空格时,需要使用第二种方式
      当src为文件或目录时,Docker Daemon会从编译目录寻找这些文件或目录,而dest为镜像中的绝对路径或者相对于WORKDIR的路径
      提示:src为目录时,复制目录中所有内容,包括文件系统的元数据,但不包括目录本身
      src为压缩文件,并且压缩方式为gzip,bzip2或xz时,指令会将其解压为目录
      如果src为文件,则复制文件和元数据
      如果dest不存在,指令会自动创建dest和缺失的上级目录

    • COPY

      语法:COPY < src>… < dest>|[“< src>”,… “< dest>”]
      提示:指令逻辑和ADD十分相似,同样Docker Daemon会从编译目录寻找文件或目录,dest为镜像中的绝对路径或者相对于WORKDIR的路径

    • ENTRYPOINT

      语法:ENTRYPOINT [“executable”,”param1”,”param2”]
      ENTRYPOINT command param1 param2(shell方式)
      提示:入口程序是容器启动时执行的程序,docker run中最后的命令将作为参数传递给入口程序
      入口程序有两种格式:exec、shell,其中shell使用/bin/sh -c运行入口程序,此时入口程序不能接收信号量
      当Dockerfile有多条ENTRYPOINT时只有最后的ENTRYPOINT指令生效
      如果使用脚本作为入口程序,需要保证脚本的最后一个程序能够接收信号量,可以在脚本最后使用exec或gosu启动传入脚本的命令
      注意:通过shell方式启动入口程序时,会忽略CMD指令和docker run中的参数
      为了保证容器能够接受docker stop发送的信号量,需要通过exec启动程序;如果没有加入exec命令,则在启动容器时容器会出现两个进程,并且使用docker stop命令容器无法正常退出(无法接受SIGTERM信号),超时后docker stop发送SIGKILL,强制停止容器
      例子:FROM ubuntu <换行> ENTRYPOINT exec top -b

    • VOLUME

      语法:VOLUME [“/data”]
      VOLUME /data1 /data2
      提示:启动容器时,Docker Daemon会新建挂载点,并用镜像中的数据初始化挂载点,可以将主机目录或数据卷容器挂载到这些挂载点

    • USER

      语法:USER < name>

    • WORKDIR

      语法:WORKDIR < Path>
      提示:如果工作目录不存在,则Docker Daemon会自动创建
      Dockerfile中多个地方都可以调用WORKDIR,如果后面跟的是相对位置,则会跟在上条WORKDIR指定路径后(如WORKDIR /A WORKDIR B WORKDIR C,最终路径为/A/B/C)

    • ARG

      语法:ARG < name>[=< defaultValue>]
      注意:ARG从定义它的地方开始生效而不是调用的地方,在ARG之前调用编译变量总为空,在编译镜像时,可以通过docker build –build-arg < var>=< value>设置变量,如果var没有通过ARG定义则Daemon会报错
      可以使用ENV或ARG设置RUN使用的变量,如果同名则ENV定义的值会覆盖ARG定义的值,与ENV不同,ARG的变量值在编译过程中是可变的,会对比使用编译缓存造成影响(ARG值不同则编译过程也不同)
      例子:ARG CONT_IMAG_VER <换行> RUN echo $CONT_IMG_VER
      ARG CONT_IMAG_VER <换行> RUN echo hello
      当编译时给ARG变量赋值hello,则两个Dockerfile可以使用相同的中间镜像,如果不为hello,则不能使用同一个中间镜像

    • ONBUILD

      语法:ONBUILD [INSTRUCTION]
      提示:从该镜像生成子镜像,在子镜像的编译过程中,首先会执行父镜像中的ONBUILD指令,所有编译指令都可以成为钩子指令

    • STOPSIGNAL

      语法:STOPSIGNAL signal
      提示:信号量可以是数字或者信号量的名字,如9或者SIGKILL,信号量的数字说明在Linux系统管理中有简单介绍

  • 常见问题解析

    (待续。。。)

docker-compose 容器编排
  • 说明

    Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

    Compose 使用的三个步骤:

    • 使用 Dockerfile 定义应用程序的环境。
    • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
    • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
  • docker-compose.yml

    常用参数

    命令说明
    build本地创建镜像
    command覆盖缺省命令
    depends_on连接容器
    volumes
    imagepull镜像
    #示例
    version: '3'
    
    services:
      # Nginx负载均衡服务
      chat-nginx:
        image: nginx:stable
        ports:
          - 80:80
        volumes:
          - ./conf.d:/etc/nginx/conf.d
    
      # 应用服务器 - 1
      chat-server-1:
        image: 镜像名
        environment:
          - SPRING_DATASOURCE_URL=jdbc:postgresql:chat-postgres/chat
          - SPRING_DATASOURCE_USERNAME=postgres
          - SPRING_DATASOURCE_PASSWORD=Test6530
          - SPRING_REDIS_HOST=chat-redis
        ports:
           - 8080:8080
    
      # 应用服务器 - 2
      chat-server-2:
        image: 镜像名
        environment:
          - SPRING_DATASOURCE_URL=jdbc:postgresql:chat-postgres/chat
          - SPRING_DATASOURCE_USERNAME=postgres
          - SPRING_DATASOURCE_PASSWORD=Test6530
          - SPRING_REDIS_HOST=chat-redis
         ports:
           - 8081:8081
    
      # 数据库服务器
      chat-postgres:
        image: 镜像名
        environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=Test6530
        volume:
          - chat-postgres:/var/lib/postgresql/data
         ports:
           - 5432:5432
    
      # 缓存服务器
      chat-redis:
        image: redis:5
        ports:
           - 6379:6379
    
    volumes:
      chat-postgres:
      
    
  • 参数说明
    • image

      image是指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

      services:
          web:
              image: hello-world
      
    • build

      服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动时执行构建任务,构建标签是build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。

      build: /path/to/build/dir
      #设定上下文根目录,然后以该目录为准指定Dockerfile
      build:
        context: ../
        dockerfile: path/of/Dockerfile
      
    • context

      ontext选项可以是Dockerfile的文件路径,也可以是到链接到git仓库的url,当提供的值是相对路径时,被解析为相对于撰写文件的路径,此目录也是发送到Docker守护进程的context

    • dockerfile

      使用dockerfile文件来构建,必须指定构建路径

    • commond

      使用command可以覆盖容器启动后默认执行的命令。

      command: bundle exec thin -p 3000
      
    • container_name

      Compose的容器名称格式是:<项目名称><服务名称><序号>
      可以自定义项目名称、服务名称,但如果想完全控制容器的命名,可以使用标签指定:

      container_name: app
      
    • depends_on

      在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题

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

      pid: "host"
        将PID模式设置为主机PID模式,跟主机系统共享进程命名空间。容器使用pid标签将能够访问和操纵其他容器和宿主机的名称空间

    • ports

      ports用于映射端口的标签。
        使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口

      ports:
       - "3000"
       - "8000:8000"
       - "127.0.0.1:8001:8001"
      
    • extra_hosts

      添加主机名的标签,会在/etc/hosts文件中添加一些记录。

      extra_hosts:
       - "somehost:162.242.195.82"
       - "otherhost:50.31.209.229"
      
    • volumes

      挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,后者对于容器来说,数据卷是只读的,可以有效保护宿主机的文件系统。
      Compose的数据卷指定路径可以是相对路径,使用 . 或者 … 来指定相对目录。
      数据卷的格式可以是下面多种形式

      volumes:
        // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
        - /var/lib/mysql
        // 使用绝对路径挂载数据卷
        - /opt/data:/var/lib/mysql
        // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
        - ./cache:/tmp/cache
        // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
        - ~/configs:/etc/configs/:ro
        // 已经存在的命名的数据卷。
        - datavolume:/var/lib/mysql
      
    • volumes_from

      从另一个服务或容器挂载其数据卷:

      volumes_from:
         - service_name   
           - container_name
      
    • dns

      自定义DNS服务器。可以是一个值,也可以是一个列表。

      dns:8.8.8.8
      dns:
          - 8.8.8.8   
            - 9.9.9.9
      
    • expose

      暴露端口,但不映射到宿主机,只允许能被连接的服务访问。仅可以指定内部端口为参数,如下所示:

      expose:
          - "3000"
          - "8000"
      
    • links

      链接到其它服务中的容器。使用服务名称(同时作为别名),或者“服务名称:服务别名”(如 SERVICE:ALIAS),例如:

      links:
          - db
          - db:database
          - redis
      
    • net

      设置网络模式。

      net: "bridge"
      net: "none"
      net: "host"
      
  • docker compose命令
    • 常用命令
      参数说明
      up启动服务
      stop停止服务
      rm删除服务器中的各个容器
      logs观察各个容器的日志
      ps列出服务相关的容器
    • 命令格式 参照Docker入门之docker-compose
      docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
      
      -f --file FILE指定Compose模板文件,默认为docker-compose.yml
      -p --project-name NAME 指定项目名称,默认使用当前所在目录为项目名
      --verbose 输出更多调试信息
      -v,-version 打印版本并退出
      --log-level LEVEL 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)
      
    • docker -compose up
      docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
      选项包括:
      -d 在后台运行服务容器
      -no-color 不是有颜色来区分不同的服务的控制输出
      -no-deps 不启动服务所链接的容器
      --force-recreate 强制重新创建容器,不能与-no-recreate同时使用
      –no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
      –no-build 不自动构建缺失的服务镜像
      –build 在启动容器前构建服务镜像
      –abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
      -t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
      –remove-orphans 删除服务中没有在compose文件中定义的容器
      
    • docker-compose ps
      docker-compose ps [options] [SERVICE...]
      列出项目中所有的容器
      
    • docker-compose stop
      docker-compose stop [options] [SERVICE...]
      选项包括
      -t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
      docker-compose stop
      停止正在运行的容器,可以通过docker-compose start 再次启动
      
    • dokcer-compose -h 查看帮助
    • docker-compose down
      docker-compose down [options]
      停止和删除容器、网络、卷、镜像。
      选项包括:
      –rmi type,删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像
      -v, –volumes,删除已经在compose文件中定义的和匿名的附在容器上的数据卷
      –remove-orphans,删除服务中没有在compose中定义的容器
      docker-compose down
      停用移除所有容器以及网络相关
      
    • docker-compose logs
      docker-compose logs [options] [SERVICE...]
      查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。
      docker-compose logs
      查看服务容器的输出
      -f 跟踪日志输出
      
    • docker-compose build
      docker-compose build [options] [--build-arg key=val...] [SERVICE...]
      构建(重新构建)项目中的服务容器。
      选项包括:
      –compress 通过gzip压缩构建上下环境
      –force-rm删除构建过程中的临时容器
      –no-cache 构建镜像过程中不使用缓存
      –pull 始终尝试通过拉取操作来获取更新版本的镜像
      -m, –memory MEM为构建的容器设置内存大小
      –build-arg key=val为服务设置build-time变量
      服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务
      
    • docker-compose pull
      docker-compose pull [options] [SERVICE...]
      拉取服务依赖的镜像。
      选项包括:
      –ignore-pull-failures,忽略拉取镜像过程中的错误
      –parallel,多个镜像同时拉取
      –quiet,拉取镜像过程中不打印进度信息
      docker-compose pull
      拉取服务依赖的镜像
      
    • docker-compose restart
      docker-compose restart [options] [SERVICE...]
      重启项目中的服务。
      选项包括:
      -t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)
      docker-compose restart
      重启项目中的服务
      
    • docker-compose rm
      docker-compose rm [options] [SERVICE...]
      删除所有(停止状态的)服务容器。
      选项包括:
      –f, –force,强制直接删除,包括非停止状态的容器
      -v,删除容器所挂载的数据卷
      docker-compose rm
      删除所有(停止状态的)服务容器。推荐先执行docker-compose stop命令来停止容器。
      
    • docker-compose start
      docker-compose start [SERVICE...]
      docker-compose start
      启动已经存在的服务容器。
      
    • docker-compose run
      docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
      在指定服务上执行一个命令。
      docker-compose run ubuntu  ping www.baidu.com
      在指定容器上执行一个ping命令。
      
    • docker-compose scale
      docker-compose scale web=3 db=2
      设置指定服务运行的容器个数。通过service=num的参数来设置数量
      
    • docker-compose pause
      docker-compose pause [SERVICE...]
      暂停一个服务容器
      
    • docker-compose kill
      docker-compose kill [options] [SERVICE...]
      通过发送SIGKILL信号来强制停止服务容器。
      支持通过-s参数来指定发送的信号,例如通过如下指令发送SIGINT信号:
      docker-compose kill -s SIGINT
      
    • docker-compose config
      docker-compose config [options]
      验证并查看compose文件配置。
      选项包括:
      –resolve-image-digests 将镜像标签标记为摘要
      -q, –quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
      –services 打印服务名,一行一个
      –volumes 打印数据卷名,一行一个
      
    • docker-compose create
      docker-compose create [options] [SERVICE...]
      为服务创建容器。
      选项包括:
      –force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容–no-recreate参数
      –no-recreate:如果容器已经存在,不需要重新创建,不兼容–force-recreate参数
      –no-build:不创建镜像,即使缺失
      –build:创建容器前,生成镜像
      
    • docker-compose exec
      docker-compose exec [options] SERVICE COMMAND [ARGS...]
      选项包括:
      -d 分离模式,后台运行命令。
      –privileged 获取特权。
      –user USER 指定运行的用户。
      -T 禁用分配TTY,默认docker-compose exec分配TTY。
      –index=index,当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-compose exec –index=1 web /bin/bash,web服务中包含多个容器
      
    • docker-compose port
      docker-compose port [options] SERVICE PRIVATE_PORT
      显示某个容器端口所映射的公共端口。
      选项包括:
      –protocol=proto,指定端口协议,TCP(默认值)或者UDP
      –index=index,如果同意服务存在多个容器,指定命令对象容器的序号(默认为1)
      
    • docker-compose push
      docker-compose push [options] [SERVICE...]
      推送服务的镜像。
      选项包括:
      –ignore-push-failures 忽略推送镜像过程中的错误
      
    • docker-compose stop
      docker-compose stop [options] [SERVICE...]
      停止运行的容器
      
    • docker-compose uppause
      docker-compose unpause [SERVICE...]
      恢复处于暂停状态中的服务。
      
      
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郝さん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值