胡豆秆

个人博客

欢迎来到我的个人博客~


Docker


Docker

简介

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

应用场景

  • Web 应用的自动化打包和发布
  • 自动化测试和持续集成、发布
  • 在服务型环境中部署和调整数据库或其他的后台应用
  • 从编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

优点

Docker 是一个用于开发、交互和运行应用程序的开放平台。Docker 能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker ,可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付、测试和部署代码,可以大大减少编写代码和生产环境中运行代码之间的延迟。

  1. 快速、一致地交付应用程序。Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
  2. 响应式部署和扩展。Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
  3. 在同一硬件上运行更多工作负载。Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。

架构

Docker 包含三个基本概念:

  • 镜像(Image):Docker 镜像是用于创建 Docker 容器的模板,相当于一个 root 文件系统。
  • 容器(Container):容器是独立运行的一个或一组应用,是镜像运行时的实体。镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。容器通过镜像来创建。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建 Docker 容器。

常用命令

镜像

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

  • docker images 列出已拥有的镜像。

    ``` docker images –filter=reference=’:’ 添加过滤

    docker images –format 格式化话展示 docker images –format “\t” Placeholder Description .ID Image ID .Repository Image repository .Tag Image tag .Digest Image digest .CreatedSince Elapsed time since the image was created .CreatedAt Time when the image was created .Size Image disk size

  • docker pull 镜像名 获取一个新镜像。

  • docker search 镜像名 从 Docker Hub 网站来搜索镜像

  • docker rmi 镜像名或镜像ID 删除镜像

  • docker tag 镜像ID 镜像名:标签 为镜像添加标签

  • docker history 查看指定镜像的创建历史。

      docker history [OPTIONS] IMAGE
    

    OPTIONS说明:

    • -H :以可读的格式打印镜像大小和日期,默认为true;

    • –no-trunc :显示完整的提交记录;

    • -q :仅列出提交记录ID。

  • docker save 将指定镜像保存成 tar 归档文件。

      docker save [OPTIONS] IMAGE [IMAGE...]
    

    OPTIONS 说明:

    • -o :输出到的文件。
  • docker load : 导入使用 docker save 命令导出的镜像。

      docker load [OPTIONS]
    

    OPTIONS 说明:

    • –input , -i : 指定导入的文件,代替 STDIN。

    • –quiet , -q : 精简输出信息。

创建镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 从已经创建的容器中更新镜像,并且提交这个镜像
  • 使用 Dockerfile 指令来创建一个新的镜像
更新镜像

更像镜像之前,我们需要使用镜像来创建一个容器。

docker run -t -i ubuntu:18.04 /bin/bash

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu:18.04: 这是指用 ubuntu 18.04 版本镜像为基础来启动容器。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

进入容器内部后,即可进行需要的更新操作。如配置某些环境和功能,然后使用 exit 退出容器。

使用 docker commit -m="更新信息" -a="镜像制作人" 容器ID 新镜像名称 命令来创建新镜像。

通过 docker run -it 新镜像名:标签 /bin/bash 命令,启动镜像去验证更新操作是否成功。

构建镜像

使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

  • FROM 指定基础镜像

  • RUN 执行命令

    shell 格式: RUN <命令行命令>

    <命令行命令> 等同于,在终端操作的 shell 命令。 exec 格式: RUN ["可执行文件", "参数1", "参数2"] RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline **注意**:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如: ``` shell FROM centos RUN yum install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gz 以上执行会创建 3 层镜像。可简化为以下格式: FROM centos RUN yum install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz ``` 如上,以 **&&** 符号连接命令,这样执行后,只会创建 1 层镜像。
  • COPY 复制文件

    复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

      COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
      COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]
    

    **[–chown=:]**:可选参数,用户改变复制到容器内文件的拥有者和属组。

    **<源路径>**:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。

    例如:

      COPY hom* /mydir/
      COPY hom?.txt /mydir/
    

    **<目标路径>**:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

  • ADD 复制文件

    ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

    • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
    • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
  • CMD 执行命令

    类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

    • CMD 在docker run 时运行。
    • RUN 是在 docker build。

    作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

    注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

    格式:

      CMD <shell 命令> 
      CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
      CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
    

    推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

  • ENTRYPOINT 执行命令

    类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且 CMD 这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

    但是, 如果运行 docker run 时使用了 –entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。

    优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

    注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

    格式:

      ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
    

    可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。

    示例:

    假设已通过 Dockerfile 构建了 nginx:test 镜像:

      FROM nginx
      ENTRYPOINT ["nginx", "-c"] # 定参
      CMD ["/etc/nginx/nginx.conf"] # 变参 
    

    1、不传参运行

      $ docker run  nginx:test
    

    容器内会默认运行以下命令,启动主进程。

      nginx -c /etc/nginx/nginx.conf
    

    2、传参运行

      $ docker run  nginx:test -c /etc/nginx/new.conf
    

    容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

      nginx -c /etc/nginx/new.conf
    
  • ENV 设置环境变量

    设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

    格式:

      ENV <key> <value>
      ENV <key1>=<value1> <key2>=<value2>...
    
  • ARG 构建参数

    构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

    构建命令 docker build 中可以用 –build-arg <参数名>=<值> 来覆盖。

    格式:

      ARG <参数名>[=<默认值>]
    
  • VOLUME 定义数据卷

    定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

    作用:

    • 避免重要的数据,因容器重启而丢失,这是非常致命的。
    • 避免容器不断变大。

    格式:

      VOLUME ["<路径1>", "<路径2>"...]
      VOLUME <路径>
    

    在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

  • EXPOSE 声明端口

    仅仅只是声明端口。

    作用:

    • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
    • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

    格式:

      EXPOSE <端口1> [<端口2>...]
    
  • WORKDIR 指定工作目录

    用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

    docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

    格式:

      WORKDIR <工作目录路径>
    
  • USER 指定用户和用户组

    用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

    格式:

      USER <用户名>[:<用户组>]
    
  • HEALTHCHECK 监控容器运行状态

    用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

    格式:

      HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
      HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
      
      HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
    
  • ONBUILD 延迟构建

    用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

    格式:

      ONBUILD <其它指令>
    
  • MAINTAINER 指定作者

容器

  • docker ps 查看运行的容器。 -a 查看所有容器

  • docker create 创建一个新的容器但不启动它

  • docker start 容器ID 启动容器

  • docker stop 容器ID 停止容器

  • docker kill 容器ID 杀掉一个运行中的容器

    ### 语法

      docker kill [OPTIONS] CONTAINER [CONTAINER...]
    

    OPTIONS说明:

    • -s :向容器发送一个信号
  • docker pause/unpause 暂停/恢复容器中所有的进程。

  • docker restart 容器ID 重启容器

  • docker rm 容器ID 删除容器 -f 强制删除

  • docker logs 容器ID 查看容器日志

  • docker inspect 容器ID 查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

  • docker top 查看容器中运行的进程信息,支持 ps 命令参数

  • docker attach 容器ID 连接到正在运行中的容器

  • docker port 容器ID 查看端口的绑定情况

    要attach上去的容器必须正在运行,并且在退出容器时会默认停止容器。attach可以带上–sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器

  • docker exec 容器ID 进入容器(退出时不会导致容器停止)

  • docker run 容器名 启动容器

      docker run -it ubuntu /bin/bash
    

    参数说明:

    • -i: 交互式操作。
    • -t: 终端。
    • -d: 后台运行
    • ubuntu: ubuntu 镜像。
    • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

    要退出终端,直接输入 exit

  • docker export 容器ID > 目标文件 导出本地容器

      docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2
    

    -o :将输入内容写到文件。

  • docker import 目标文件 导入容器的名称 导入镜像

      docker import  my_ubuntu_v3.tar runoob/ubuntu:v4  
    

    OPTIONS说明:

    • -c :应用docker 指令创建镜像;
    • -m :提交时的说明文字;

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P-p 参数来指定端口映射。

docker run -d -P training/webapp python app.py

两种方式的区别是:

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。
其它

docker network create 网络名 新建网络

-d:参数指定 Docker 网络类型,有 bridge、overlay。

在使用 docker run 时,可通过 --network 指定网络,使当前容器链接到该网络上,实现网络上的容器之间的互联。

docker events 从服务器获取实时事件

docker events [OPTIONS]

OPTIONS说明:

  • -f :根据条件过滤事件;
  • –since :从指定的时间戳后显示所有事件;
  • –until :流水时间显示到指定的时间为止;

docker cp 用于容器与主机之间的数据拷贝。

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

OPTIONS说明:

  • -L :保持源目标中的链接

docker diff 检查容器里文件结构的更改。

docker diff [OPTIONS] CONTAINER

docker login/logout 登录/登出到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

docker login [OPTIONS] [SERVER]
docker logout [OPTIONS] [SERVER]

OPTIONS说明:

  • -u :登陆的用户名
  • -p :登陆的密码

docker push 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

docker push [OPTIONS] NAME[:TAG]

OPTIONS说明:

  • –disable-content-trust :忽略镜像的校验,默认开启

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦