Docker engine
下图展示了 docker engine 的结构,主要包含四部分:image、container、network、data volumes。具体可以参考:Docker architecture
Docker 包括以下几个基本概念
-
镜像(Image)
镜像包含操作系统完成的 root 文件系统,因为 Docker 在设计时就采用 Union FS 技术,将其设计为分层存储的架构,所以严格的来讲镜像非一个ISO 的打包文件,镜像只是一个虚拟的概念。实际是由一组文件系统组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完成就不在发生改变。 -
容器(Container)
容器实质上是镜像的运行实例进程,但与直接的宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间、甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里。虽然这种隔离特性和虚拟机很类似,但结构上是不同的。
容器存储层的生命周期和容器一样,容器消亡时,容器存储层也随之消失。因此任何保存于容器存储层的信息系都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层。
容器中包含以下内容:
- 数据卷 (Data Volumes)
- 网络 (Network)
- 系统资源 (System)
-
仓库(Repository)
镜像构建完成之后,可以很容易的当前宿主上运行,但是,如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
我们可以把镜像上传到共有仓库上,也可以上传到私有的仓库。docker同时提供私有的仓库的搭建。你可以很方便的大家一个私有仓库出来。
-
Dockerfile
提供一套 docker image 的编排机制,可以通过 dockerfile 来配置 image 构建的过程,通过 dockerfile 可以很方便的移植和分享镜像。大家都可以很放心的使用镜像文件,不用担心镜像的构建过程有什么不透明的地方。
-
Docker compose
我们会在后面的章节单独讲到。
常用操作命令
当 docker 容器中指定的应用终结时,容器也自动终止。
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一种是将在终止状态(stopped)的容器重新启动。
因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。
容器操作类命令
docker run
创建并启动容器
-c 指定 cpu 的核心数量
-m 指定最大内存
-e --env 设置环境变量
--network
--ip 设置 ip
-d 设置后台运行,并返回容器 id
-i 让容器的标准输入保持打开
-t 让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-P Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口
-p 指定容器和宿主的端口映射,也可以多次使用 -p 来指定多个端口映射
- 映射所有接口地址
hostPort:containerPort 将本地指定端口映射到容器指定端口,会默认绑定本地所有接口上的所有地址
- 映射到指定地址的指定端口
ip:hostPort:containerPort 指定映射使用一个特定的地址,比如:localhost 或 127.0.0.1
- 映射到指定地址的任意端口
ip::containerPort 绑定 localhost 的任意端口到容器的5000端口,本地主机会自动分配一个端口
还可以指定端口协议(tcp|udp)
hostPort:containerPort/udp
-v 指定卷映射到宿主的目录路径
--device
--rm 退出时删除容器
--restart
--link 参数的格式为 --link name:alias,其中 name 是要连接的容器的名称,alias 是这个连接的别名。
--name 指定 container 名称
--hostname
docker exec
在容器中执行命令
-d 设置后台运行,并打印容器 id
-e 设置环境变量
-i 让容器的标准输入保持打开
-t 让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-u
docker start
启动一个停止的容器
docker stop
停止指定容器
docker restart
重启镜像
docker ps
列出当前运行中的所有容器
-a 列出所有的包含未运行的
-s 显示文件大小
-q 返回容器 id
docker rm
删除指定镜像
-f 强制删除正在运行的容器
-v 删除容器和对应的卷
docker rm $(docker ps -a -q)
docker logs
查看当前容器运行日志信息
docker stats
列出所有容器系统资源使用情况(CPU、内存、IO)
docker port
查看当前映射的端口配置,也可以查看到绑定的地址。
docker inspect 容器
返回 容器当前的实例信息,包含状态、主机配置信息(资源、网络、挂载)
docker export
如果要导出本地某个容器,可以使用 docker export 命令,这样讲导出容器快照到本地文件
docker import
可以使用 docker import 从容器快照文件中再导入为镜像
镜像操作类命令
docker create
创建一个镜像
docker pull
从仓库获取一个 dockerfile,然后构建出一个本地镜像
docker diff
对比当前容器的差异
docker commit
将容器的存储层保存下来成为镜像
- a 作者
- c 添加变更列表
- m 提交内容描述
- p 在提交的时候暂停运行容器
docker commit -a "ytWman <ytwman@gmail.com>" -m "updated default page" webserver nginx:v2
docker build
通过 Dockerfile 构建镜像
docker images
列出当前所有镜像
docker search
搜索镜像
docker rmi
删除本地镜像
docker history 镜像
查看镜像的变更记录,查看提交的内容
查看状态类
docker info
查看 docker 信息
docker version
查看 docker 当前版本
定制镜像(Dockerfile)
如果我们使用 docker commit 来创建镜像,那我们的镜像构建过程都是黑箱操作,没人知道执行过什么命令,怎么生成的镜像,而且制作人可能过一段时间后也无法记清楚具体执行了什么操作。而且镜像每次构建后的会更加臃肿。
我们可以使用 Dockerfile 来一步步配置每个镜像环境,然后通过 docker build 命令来构建一个新的镜像。
Dockerfile 主要是用来移植或分享使用的。
仓库
仓库是几种存放镜像的地方,实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有很多个仓库,而每个仓库下面有多个镜像。
- Docker Hub
- 私有仓库
网络配置
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
可以使用 docker ps 或 docker logs 命令来查看应用的信息。
参考文档
https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
网友评论