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