docker

1.docker#

  • Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中

2.docker 三个概念#

  • 镜像:
    • 一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器
    • 类似于虚拟机中的镜像,是一个包含有文件系统的面向 Docker 引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。
    • 镜像是一种轻量级、可执行的独立软件包,
      用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
    • docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统 UnionFS。
      • UnionFS(联合文件系统):
      • Union 文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加
        同时可以将不同目录挂载到同一个虚拟文件系统下 (unite several directories into a single virtual filesystem)。
        Union 文件系统是 Docker 镜像的基础。
        镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
      • 好处:共享资源
    • docker 镜像都是只读的
    • 当容器启动的时候,一个新的可写成被加载到镜像的顶部,这一层通常称为容器层。容器层之下的层都叫镜像层
  • 容器
    • 类似于一个轻量级的沙盒,可以将其看作一个极简的 Linux 系统环境(包括 root 权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。
    • 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例
    • 容器是镜像创建的实例。可以创建,启动,停止,删除容器。
    • 各个容器之间是相互隔离的,互不影响
    • 注意:镜像本身是只读的,容器从镜像启动时,Docker 在镜像的上层创建一个可写层,镜像本身不变。
  • 仓库
    • 类似于代码仓库,这里是镜像仓库,是 Docker 用来集中存放镜像文件的地方

3. 安装#

4. 配置 aliyun 镜像加速#

  • 1. 注册登录阿里云,获取镜像加速地址
  • 2.vim /etc/docker/daemon.json
  • 3. 添加:
    {
    "registry-mirrors": ["https://自己的镜像加速地址.mirror.aliyuncs.com"]
    }
  • 4.systemctl daemon-reload // 重新载入配置
  • 5.systemctl restart docker // 重启

5. 工作流程(client server dameon)#

  • Docker 是一个 Client-Server 结构的系统,Docker 守护进程运行在主机上,
  • 然后通过 Socket 连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。

    为啥比 VM 快:#

  • 1.docker 有着比虚拟机更少的抽象层
    • 由亍 docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的都是实际物理机的硬件资源。因此在 CPU、内存利用率上 docker 将会在效率上有明显优势。
  • 2.docker 利用的是宿主机的内核,而不需要 Guest OS
    • 当新建一个容器时,docker 不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,
      当新建一个虚拟机时,虚拟机软件需要加载 Guest OS, 返个新建过程是分钟级别的。
      而 docker 由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个 docker 容器只需要几秒钟。

6.docker 基本命令:#

1. 帮助命令:#

  • docker version // 版本
  • docker info //docker 个人信息
  • docker help // 帮助命令

    2. 容器命令:#

    • docker run [options] xxx [command] [args] // 运行
    • options:
      • -i: 以交互模式运行容器
      • -t: 为容器重新分配一个伪输入终端
      • -p 暴露端口:服务的端口
      • -P 随机分配暴露端口
    • docker ps [options] // 查看容器
      • -a: 列出当前所有正在运行的容器 + 历史上运行过的
      • -l: 显示最近创建的容器
      • -q: 静默模式,只显示容器编号
      • --no-trunc : 不截断输出
    • docker stop 容器 ID // 停止
    • docker exit // 容器退出,退出
    • ctrl+P+Q // 容器不停止退出
    • docker start 容器 ID // 启动容器
    • docker restart 容器 ID // 重启
    • docker logs [options] 容器 ID // 查看日志
    • options:
      • -f: 跟随最新的日志打印
      • -t: 加入时间戳
      • --tail: 数字 显示最后多少条
    • docker inspect 容器 ID // 查看容器细节,json 格式
    • docker attach 容器 ID // 重新进入容器
    • docker exec -it 容器 ID /bin/bash
    • docker cp 容器 ID: 路径 目标主机路径 // 拷贝出 docker 文件

      3. 镜像命令:#

    • docker images // 列出本地的镜像
    • 参数
      • -a: 列出本地所有镜像,包含中间层
      • -q: 只显示当前镜像的 ID
      • --digests: 显示摘要
      • --no-trunc: 显示完整的镜像信息
    • docker serach XXX // 查找镜像
    • 参数:
      • -s: 列出 stars 不小于指定数目的镜像
    • docker pull XXX:tag // 从 dockerhub 拉取镜像
    • docker rmi imagesid // 删除镜像
    • 参数:
      • -f: 强制删除
      • docker rmi -f $(docker images -qa) // 删除全部
    • docker commit -a "author" -m "del tomcat's docs" e675f76220c4 (容器 ID) miss201/tomcat:1.0(新的镜像名称)// 提交容器的副本生成新镜像

7. 容器数据卷:#

  • 卷就是目录或文件,存在于一个或多个容器中,由 docker 挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System 提供一些用于持续存储或共享数据的特性
  • 完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷
  • 作用:
    • 1. 持久化
    • 2. 数据共享
  • 命令:
    #冒号之间不要有空格
    docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
    # 如果有:ro,表示容器内不能修改数据
    # 主机和容器之间就可以进行数据共享了

8.DockerFile 添加#

  • 用来构建 Docker 镜像的构建文件,是由一系列的命令和参数构成的脚本
  • dockerFile 保留字:
    FROM:基础镜像,当前新镜像是基于哪个镜像
    MAINTAINER:镜像的维护者的姓名和邮箱
    RUN:容器构建是需要运行的命令
    EXPOSE:当前容器对外暴露出的端口
    WORKDIR:指定当前容器,默认终端登录进来的工作目录
    ENV:用来在构建镜像过程中的设置环境变量
    CMD:指定启动一个容器时候,要运行的指令
    ENTRYPOINT:指定启动一个容器时候,要运行的指令(命令不会被覆盖)
    ONBUILD:子类构建的时候,触发父类的ONBUILD
    ADD:复制并解压缩目标文件到容器内指定目录
    COPY:复制目标文件到容器内指定目录
  • 步骤:构建 File-> docker build -> docker run
    • 1.File 构建,vi dockerFile, 添加如下:
      # volume test
      FROM centos
      VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
      CMD echo "finished,--------success1"
      CMD /bin/bash
    • 2. 用 DockerFile 构建镜像:
      #生成新镜像
      #注意最后一个.有空格
      docker build -f /docker/DockerFile -t miss201/centos .

9. 数据卷容器#

  • 概念:命名的容器挂载数据卷,其它容器通过挂载这个 (父容器) 实现数据共享,挂载数据卷的容器,称之为数据卷容器
  • 命令:
    docker run -it --name doc01 miss201/centos
    # 利用--volumes-from 参数,实现挂载,从而实现数据共享
    docker run -it --name doc02 --valumes-from doc01 miss201/centos

10. 其它:#

  • docker-compose 配置问题:

    # the following setting starts chaincode containers on the same
    # bridge network as the peers
    # https://docs.docker.com/compose/networking/
    - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2e_cli_default
    
    #命名方式是以当前的文件夹目录加上 _default: myapp_default ,在这个文件夹下的所有容器启动文件都会在这个网络里面。
    #要注意一点:要保持配置文件的版本号一致:yaml 文件里的版本号 version:2,
    #如果没有配置版本号,默认的是 version:2,CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE 的生成规则就不是文件夹加上 "_default",
    #如果这时候单独去启动某个文件,就会出现启动的容器不在同一个网络里面,从而出现连接超时的问题。
本作品采用《CC 协议》,转载必须注明作者和本文链接
不卑不亢,不慌不忙,这才是生活的模样。