第二本《第一本Docker书》

书籍简介

  1. 书名《第一本Docker书》第四版本
  2. 出版社:人民邮电出版社
  3. 作者:James Turnbull
  4. 封面


    IMG_3842.JPG

阅读进度

  1. 开始阅读:2020年06月04日
  2. 结束阅读:2020年07月04日
  3. 阅读进展:完成

重点摘要

第一章:简介

  1. docker分层管理模式:使用docker开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器;
  2. docker保证一致性:加强开发人员写代码的开发环境与应用程序要部署的生产环境的一致性;
  3. 面向服务的架构:推荐单个容器只运行一个应用程序或进程,这样就形成一个分布式的应用程序模型;
  4. Docker组件
  1. Docker客户端和服务器:C/S架构,Docker客户端不仅可以和本机的守护进程通信,也可以和运行在另外一台宿主机上的守护进程通信
  2. Docker镜像:Docker世界的基石,基于联合文件系统的一种层式的结构
  3. Registry:用来保存用户构建的镜像
  4. Docker容器:一个镜像的格式、一系列标准的操作、一个执行环境
  1. 镜像是docker生命周期中的构建或打包阶段,而容器则是启动或者执行阶段;
  2. Docker的组件技术
  • 一个原生的Linux容器格式,Docker称为:libcontainer
  • Linux内核的命名空间:实现各种隔离

1.文件系统隔离:每个容器都有自己的root文件系统

  1. 进程隔离:每个容器都运行在自己的进程环境中
  2. 网络隔离:容器间的虚拟网络接口和IP地址都是分开的
  • 资源隔离和分组:使用Cgroups;实现CPU和内存之类的资源独立分配
  • 写时复制:文件系统都是通过写时复制创建
  • 日志:容器产生的STDUT、STDERR、STDIN这些IO流都会被收集并记入之日,用来进行日志分析和故障排查
  • 交互式Shell:用户可以创建一个伪tty终端,链接STDIN为容器提供一个叫湖水shell

第二章:安装Docker

  1. 安装Docker的先决条件
  1. 64位操作系统
  2. Linux3.8或更高版本内核
  3. 必须支持一种适合的存储驱动
  4. 必须支持icrgoup和namespace功能

第三章:Docker入门

  1. docker info:用于查看docker的所有相关信息
  2. docker run:用于提供Docker容器的创建到启动的功能
  1. -i:保证容器的STDIN是开启的
  2. -t:为容器创建一个伪tty终端;容器才能提供一个交互式shell
  3. --name:指定自己要创建的容器的名称;容器命名必须是唯一的;
  4. -d:创建和启动一个守护进程;
  5. --log-driver="syslog":禁止用docker logs命令;将所有的日志输出重定向到Syslog;
  6. none:禁止所有的容器中的日数;
  7. exec:docker exec -d 容器名称/ID comand;在容器中运行某个命令; docker exec -i -t 容器名称/容器ID /bin/bash 进入容器交互模式;
  1. 只有在/bin/bash命令处于运行状态的时候,容器才会处于运行状态;一旦容器退出,/bin/bash命令就借宿,容器也就停止;此时可以通过docker ps -a来进行查看;
  2. docker ps:查看当前运行的容器的相关信息
  1. -a;已经停止的容器也可以查看到
  2. -l:最后一个运行的容器,不管容器当前是在运行还是已经停止;
  3. -n x:显示最后x个容器,不管容器是运行的还是停止的
  4. -q:只显示容器ID
  1. 启动和关闭容器

docker start 容器名称/容器ID
docker stop 容器名称/容器ID

  1. docker attach:重新附着在该容器上
  2. docker logs:查看获取容器的日志;加-f参数持续获取输出的日志类似tailf;-t:自动在每个日志上加上时间戳
  3. docker top:查看某个容器的进程信息;
  4. docker stats:显示一个容器的统计信息
  5. 自动重启容器

1.--restart=always:无论容器什么原因退出都自动重启;on-failure:只有在退出代码为非0值的时候,才会自动重启,同时支持重启次数参数;

  1. docker inspect:获取更多的容器信息;添加参数:--format可以有选择性的获取某些参数;支持同时查看多个容器信息,获取其某些具体的值
  2. docker rm:删除容器;不支持同时删除所有容器,封装命令来处理:docker rm `docker ps -a -q`

第四章 使用Docker镜像和仓库

  1. Docker最底层是一个引导文件系统:bootfs,当容器启动后该文件系统就会被卸载;镜像的第二层是root文件系统rootfs,它位于引导文件系统上,可是是一种或者多种操作系统;
    2.当一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统。Docker中运行的程序就是在这个读写层中执行的。Docker第一次启动的时候,初始的读写层是空的,当文件系统发生变化这些变化就会应用到这一层上。如果要修改一个文件,这个文件首先会从读写下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已经被读写层中的文件所隐藏。
  2. 2这种机制称为写时复制(copy on write),每个只读镜层都是只读的,并且以后永远不会变化。
  3. 镜像仓库相关命令
  1. docker images 列出镜像
  2. docker pull ubuntu:12.04 拉取镜像包含标签信息
  3. docker images fedora 查找本地的某个镜像
  4. docer search fedora 用来查找所有DockerHub上公共的可用镜像
  5. docker inspect 镜像:可用用来查看镜像的详细信息
  1. 仓库的相关信息管理:Docker Hub仓库分两种类型:用户仓库和顶层仓库;用户仓库由Docker用户自己创建,顶层仓库由Docker内部的人员来管理; 用户仓库由:用户名和仓库名两部分组成(jamturo01/puppet),顶层仓库由仓库名组成;
  2. 构建镜像
  1. 构建镜像由两种方法:docker commit命令和docker build结合Dockerfile文件(推荐方法)
  2. 通常构建镜像的方法是基于已经有的基础镜像来创建;
  3. 创建docker hub账号;通过 docker login命令来登入;
  1. 采用docker commit创建容器
  • 创建一个需要修改的定制容器:docker run -i -t ubuntu /bin/bash
  • 安装应用包:例如apache;apt-get -yqq update;apt-get -y install apache2
  • 提交定制容器:docker commit 容器ID 镜像信息;同时可以指定-m,-a等信息添加一些属性
  1. Dockerfile构建镜像
  • Dockerfile采用DSL(Domain Specific Language)语法来构建一个docker镜像;
  • 首先需要创建一个目录:该目录下创建一个dockerfile文件,这个目录就是我们的构建环境,docker称该环境为构建上下文;
  • Docker由一系列的指令和参数组成;每条指令都必须是大写字母,且后面要跟随一个参数;并且执行都是按顺序从上到下执行,需要合理安排顺序;
  • 构建第一个Dockerfile的命令
  1. FROM:固定的第一条指令,指定基础镜像
  2. MAINTAINER指令:描述Docker镜像维护者的信息;
  3. RUN指令:在当前的镜像中运行指令,每个执行成功都会创建一个新的镜像层;
  4. 默认情况下RUN指令会在shell里面使用命令包装器:/bin/sh -c 来执行
  5. EXPOSE:告诉Docker将容器内的应用程序将会使用容器的指定端口
  6. .dockerignore命名的文件,可以设定那些文件不会被当作构建上下文的一部分
  7. docker build --no-cache 标示:忽略缓存功能;生成最新的包
  8. ENV指令:设置一个环境变量
  9. CMD指令:类似RUN,RUN是容器构建的时候需要执行,CMD是容器指定的时候需要执行;
  • docker history 镜像ID:可以得到一个镜像完整的构建过程;
  • 通过docker ps 可以查看容器的端口分配情况;
  • docker run -p:用来控制Docker 在运行时应该公开哪些端口给外部;
  • docker port 容器ID 端口:可以查看到容器ID映射的对应主机端口信息;
  • docker run -d -p 8080:80 --name static_web jamtur01/static_web nginx -g "daemon off;":通过-p指定容器端口和宿主机端口,已经进行两者的绑定映射;
  • -P:该参数可以用来公开在Dockerfile中通过Expose指令公开的所有端口;该端口指定是在容器监听的端口,但是对于宿主机则是绑定一个随机的端口
  • 如果在Dockerfile里指定了CMD指令,而同时在docker run命令行中也指定了要运行的指令;则命令行run会覆盖CMD指令

读书心得

你可能感兴趣的:(第二本《第一本Docker书》)