Docker基本组成
镜像 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/mirrorsDocker常用命令
帮助命令
| 命令 | 说明 | | —- | —- | | 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) |
容器命令
创建并启动容器
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镜像的构建文件,是由一系列命令和参数构成的脚本。
DockerFile构建过程
docker build -f dockerfile名称 -t 新建的镜像名:TAG .
DockerFile执行过程
docker执行一个Dockerfile脚本的流程大致如下:
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新的容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,Dockerfile是软件的原材料,Docker镜像是软件的交付品,Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力
充当Docker体系的基石。
- Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。
Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
- Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行
Docker镜像时,会真正开始提供服务; - 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 镜像名