02-Docker镜像和容器

nobility 发布于 2022-07-24 2809 次阅读


Docker镜像和容器

Docker架构

Docker Architecture Diagram

Docker Engine包括:一个名为dockerd的守护进程,一个REST API Serve,一个CLI客户端

Docker使用CS架构,Docker客户端与Docker守护进程通信,Docker守护进程负责构建、运行和分发Docker容器,Docker客户端和守护进程通过UNIX套接字或网络接口使用REST API进行通信

上图表示Docker使用Docker CLI命令,可通过镜像构建容器,镜像获取可从Registry仓库获取,也可以本地构建

Docker镜像

Linux操作系统分为内核空间(boot filesystem)和用户空间(root filesystem),内核启动后会使用root文件系统为其提供用户空间支持,也就是运行Linux的发行版本操作系统,比如CentOS

因为镜像包含操作系统完整的root文件系统,其体积较大,所以Docker就利用Union file systems技术实现分层存储的架构,在下层镜像的基础上添加删除文件(安装卸载软件)形成一个新的镜像,不同的镜像可共享相同的层,最下层镜像就是完整的root文件系统,也称为base image,所以体积、性能较高,综上所述镜像是由多层文件系统联合组成

镜像本身是只读的,也就是说删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除,在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像,所以每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉

简单的说Docker镜像是一个特殊的文件系统,即文件和文件的元数据的集合

镜像管理

  • 镜像的管理命令都是以docker image开头的,同时也有一些别名命令
  • 可指定镜像名地方,也可指定镜像的ID,ID取前几位也可以,只要能独一无二的识别即可
  • docker image ls:列出当前Dockers中的所有镜像,docker images是该命令的别名,以列表的形式显示,具体如下
    • 使用-q参数,就会列出ID列,常用于批量操作
    • 使用-f参数,可指定过滤条件,过滤出符合条件的镜像
docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
#该镜像的仓库地址   该镜像的版本        该镜像的ID          该镜像的创建时间    该镜像的大小
  • docker image history:列出指定镜像的创建历史,docker history是该命令的别名
  • docker image tag:复制镜像(类似于一个硬链接),通常用于镜像重命名
  • docker image rm:删除指定镜像,docker rmi是该命令的别名
docker image rm $(docker image ls -q)  #用于批量删除镜像命令

获取镜像

Dockerfile构建

docker image build:使用Dockerfile构建镜像,docker build是该命令的别名

  • 在构建时最好使用-t参数为该镜像指定一个名字,否则只有ID,没有名字
  • 指定Dockerfile时无需只需要指定Dockerflie所在目录即可
  • 在构建镜像时会生成一个临时的镜像,若出现错误可运行该临时镜像到容器中调试
docker build -t test ./  #指定Dockerflie的存在目录为当前目录
仓库拉取

docker image pull:从镜像仓库远程拉取镜像,docker pull是该命令的别名

  • 镜像名和版本号使用冒号分隔,默认版本是最新版latest
  • 非官方镜像的镜像名和组织名使用斜杠分隔
容器提交成镜像

docker container commit:使用容器创建镜像,docker commit是该命令的别名

  • 先指定容器名,后指定生成的镜像名
镜像导入和导出
  • docker image save:将某个容器导出成*.tar.gz包,docker save是该命令的别名
    • 使用-o参数指定输出包名,自行指定.tar.gz后缀
  • docker image load:将导出的镜像导入,docker load是该命令的别名
    • 使用-i参数指定输入的包名

Docker容器

容器是镜像运行时的实体,实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间,所以容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间,容器内的进程是运行在一个隔离的环境里,这种特性使得容器封装的应用比直接在宿主运行更加安全

容器管理

  • 镜像的管理命令都是以docker image开头的,同时也有一些别名命令
  • 可指定容器名地方,也可指定镜像的ID,ID取前几位也可以,只要能独一无二的识别即可
  • docker container ls:列出当前Docker中的所有正在运行的容器,docker ps是该命令的别名,以列表的形式显示,具体如下
    • 使用-a参数,就会列出所有运行过的容器,包括退出的
    • 使用-q参数,就会列出ID列,常用于批量操作
    • 使用-f参数,可指定过滤条件,过滤出符合条件的容器
docker container ls
CONTAINER ID   IMAGE         COMMAND                CREATED       STATUS         PORTS          NAME
#容器ID        使用的镜像名  容器启动后执行的命令   容器创建时间  容器当前状态   容器映射端口   容器名
  • docker container exec:在某个正在运行的容器中运行一些命令,docker exec是该命令的别名
    • 使用-it参数可交互进入到某个容器中,通常与/bin/bash命令连用
  • docker container stop:停止某个正在运行的容器,docker stop是该命令的别名
  • docker container start:启动某个停止运行的容器,docker start是该命令的别名
  • docker container restart:重启某个停止运行的容器,docker restart是该命令的别名
  • docker container inspect:查看某个容器的详细信息,docker inspect是该命令的别名
  • docker container logs:查看某个容器的输出信息,docker logs是该命令的别名
  • docker container pause:暂停某个容器中的所有进程,docker pause是该命令的别名
  • docker container unpause:将暂停的某个容器继续运行,docker unpause是该命令的别名
  • docker container rm:删除指定停止的容器
    • 使用-f参数可强制删除为停止的容器
    • 可指定容器名,也可指定容器的ID,ID取前几位也可以,只要能独一无二的识别即可
    • 容器虽然退出了,但是依然还存在,所以应该删除
docker container rm $(docker container ls -aq)  #用于批量删除容器

构建容器

非交互式运行容器

docker container run:使用镜像创建容器,docker run是该命令的别名,后面可跟一个容器启动后要执行的命令和该命令的参数,所以容器启动的参数需要在镜像名的前面

  • 使用--name参数可为容器起一个名字,若不指定会随机分配一个名字
  • 使用-d参数,该容器会进入后台运行
  • 使用-e参数可设置容器中的环境变量,通常用于配置容器中程序的配置参数,多个参数值可使用多个-e参数进行指定
交互式运行容器

在运行容器docker container run命令时使用-it参数,就会运行容器并且进入到容器中

  • -iinteractive交互的意思,-ttty终端的意思
  • 并不是所有容器都可以进入的,该容器的程序必须是交互式的程序才能进入
此作者没有提供个人介绍
最后更新于 2022-07-24