Docker镜像和容器
Docker架构
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参数,就会运行容器并且进入到容器中
-i是interactive交互的意思,-t是tty终端的意思- 并不是所有容器都可以进入的,该容器的程序必须是交互式的程序才能进入

Comments NOTHING