Docker.pdf

Docker基本组成

镜像、容器、仓库
image.png

镜像 image

Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。

容器 Container

  • Docker 利用容器(Container)独立运行的一个或一组应用。
  • 容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。
  • 每个容器都是相互隔离的、保证安全的平台。
  • 容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

    仓库 Repository

    仓库(Repository)是集中存放镜像文件的场所。 仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。 最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等。添加阿里镜像:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

    Docker常用命令

    帮助命令

    | 命令 | 说明 | | —- | —- | | docker version | 查看docker的版本信息 | | docker info | 查看docker详细的信息 | | docker —help | docker的帮助命令,可以查看到相关的其他命令 |

镜像命令

镜像命令 说明
docker images 列出本地主机上的镜像
docker search 镜像名称 从 docker hub 上搜索镜像
docker pull 镜像名称 从docker hub 上下载镜像
docker rmi 镜像名称 删除本地镜像
docker rmi
删除单个 docker rmi -f 镜像ID
删除多个 docker rmi -f 镜像1:TAG 镜像2:TAG
删除全部 docker rmi -f $(docker images -qa)

容器命令

创建并启动容器

  1. docker run [OPTIONS] IMAGE [COMMAND]
options 说明
—name “容器新名字”:为容器指定一个名称
-d 后台运行容器,并返回容器ID,也即启动守护式容器
-i 以交互模式运行容器,通常与 -t 同时使用
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-P(大写P) 随机端口映射
-p(小写p) 指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort

|

docker run -it centos /bin/bash

列举运行容器

docker ps [OPTIONS]
OPTIONS 说明
-a 列出当前所有正在运行的容器+历史上运行过的
-l 显示最近创建的容器。
-n 显示最近n个创建的容器。
-q 静默模式,只显示容器编号。
—no-trunc 不截断输出。

退出容器

退出方式 说明
exit 容器停止退出
ctrl+p+q 容器不停止退出

启动容器

docker start 容器ID或者容器名称

停止容器

docker stop 容器ID或者名称

docker kill 容器ID或者名称

删除容器

docker rm 容器ID
docker rm -f $(docker ps -qa)
docker ps -a -q | xargs docker rm

其他命令

守护式容器

docker run -d 容器名称

查看容器中运行的进程

docker top 容器ID

查看容器细节

docker inspect 容器ID

进入运行的容器

进入方式 说明
exec 在容器中打开新的终端,并且可以启动新的进程
attach 直接进入容器启动命令的终端,不会启动新的进程

文件复制

# 从容器中拷贝内容到宿主机中

docker cp 容器ID:容器内路径  目的地路径

Docker 镜像文件

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它
包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

UnionFS 联合文件系统

  • Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统
  • 它支持对文件系统的修改作为一次提交来一层层的叠加
  • 同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
  • Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

    镜像加载原理

    Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
    Bootfs(boot file system)主要包含Bootloader和Kernel, Bootloader主要是引导加载Kernel, Linux刚启动时会加载Bootfs文件系统,在Docker镜像的最底层是bootfs

这一层与我们典型的Linux/Unix系统是一样的,包含Boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

Rootfs (root file system) ,在Bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc等标准目录和文件。Rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等。

镜像操作

docker commit -m="要提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

数据卷

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。简单来说,容器卷就相当于Redis中持久化方式的RDB和AOF。

卷就是目录或文件,存在宿主机中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
1. 数据卷可在容器之间共享或重用数据
2. 卷中的更改可以直接生效
3. 数据卷中的更改不会包含在镜像的更新中
4. 数据卷的生命周期一直持续到没有容器使用它为止

数据卷的使用

docker run -it -v /宿主机绝对路径:/容器内目录 镜像名

数据卷用于持久化数据,容器间共享数据、继承数据

docker run -it -v /宿主机绝对路径:/容器目录:ro 镜像名  ## ro 只读权限

DockerFile

DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
image.png

DockerFile构建过程

docker build -f dockerfile名称 -t 新建的镜像名:TAG .

image.png

DockerFile执行过程

docker执行一个Dockerfile脚本的流程大致如下:

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新的容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,Dockerfile是软件的原材料,Docker镜像是软件的交付品,Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力
充当Docker体系的基石。
image.png

  1. Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。

Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

  1. Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行
    Docker镜像时,会真正开始提供服务;
  2. Docker容器,容器是直接提供服务的。

    DockFile指令

    | 指令 | 说明 | | —- | —- | | FROM | 基础镜像,当前新镜像是基于哪个镜像的,有继承的意味 | | MAINTAINER | 镜像维护者的姓名和邮箱地址 | | RUN | 容器构建时需要运行的命令 | | EXPOSE | 当前容器对外暴露的端口 | | WORKDIR | 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点 | | ENV | 用来在构建镜像过程中设置环境变量 | | ADD | 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 | | COPY | 类似ADD,拷贝文件和目录到镜像中。
    将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
    COPY src dest
    COPY [“src”,”dest”] | | VOLUME | 容器数据卷,用于数据保存和持久化工作 | | CMD | 指定一个容器启动时要运行的命令
    Dockerfile中可以有多个CMD指令,但只有最后一个生效
    CMD会被docker run之后的参数替换 | | ENTRYPOINT | 指定一个容器启动时要运行的命令
    ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数 | | ONBUILD | 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发 |
docker history 镜像名