1、docker介绍
- docker不用硬件虚拟化,直接复用宿主机的硬件资源
- docker利用宿主机的内核,不需要加载操作系统内核
- docker并非通用的容器工具,它依赖一运行的linux环境。因此,docker必须部署在linux内核的系统上。docker实质上是在已经运行的linux下制造了一个隔离的文件系统。
- 虚悬镜像:仓库名、标签都是NONE的镜像。dangling image。可能是镜像构建或删除过程中出了问题。
2、docker常用命令
帮助启动类
| 命令 | 解释 | 示例 |
|---|---|---|
| systemctl start docker | 启动docker | |
| systemctl stop docker | 停止docker | |
| systemctl status docker | 查看docker状态 | |
| systemctl restart docker | 重启docker | |
| systemctl enable docker | 开机启动docker | |
| docker info | 查看docker概要信息 | |
| docker --help | ||
| docker 具体命令 --help | docker具体命令的帮助文档 | docker run --help |
镜像命令
| 命令 | 解释 | 示例 |
|---|---|---|
| docker images | 列出本地主机上的镜像 | docker images - a :列出本地所有镜像层 - q :只显示镜像id (下面有截图补充介绍) |
| docker search 镜像名 | 去远程镜像仓查找某个镜像。(仓库地址:在daemon.json中配置镜像加速器) | docker search --limit 5 redis 查找点赞数最多的前5个redis镜像 |
| docker pull 镜像名[:TAG] | 从docker镜像仓库获取镜像。如果不写TAG代表拉取latest版本 | docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] docker pull redis |
| docker tag | 为一个镜像打标签 | |
| docker rmi 镜像名或镜像ID | 删除镜像 | 删除单个:docker rmi redis 删除多个:docker rmi redis ubutu 删除全部:docker rmi $( docker images -qa) 或者 docker images -qa | xargs docker rmi docker命令支持拼接 - f:强制删除 |
| docker build | 从一个 Dockerfile 创建一个镜像 | |
| docker save | 保存一个镜像为 tar 包文件[对应 load] | |
| docker load | 从一个 tar 包中加载一个镜像[对应 save] | |
| docker system df | 查看镜像/容器/数据卷所占用的空间 |
容器命令
| 命令 | 解释 | 示例 |
|---|---|---|
| docker run [OPTIONS] 镜像名 [COMMAND] [ARG...] | 新建并启动容器 | docker run -it 镜像名: 启动前台交互式容器 docker run -d 镜像名:启动后台守护式容器。 docker run -it -v /data:/home/data nginx:latest /bin/bash -t:让Docker分配一个伪终端并绑定到容器的标准输入上 。 -i:让容器的标准输入保持打开。 -v:绑定一个卷。将主机的目录/data映射到容器的目录/home/data。 /bin/bash:在容器中执行/bin/bash命令。 (下面有截图补充介绍) |
| docker ps | 列出当前正在运行的所有容器实例 | - a:显示正在运行和历史上运行过的容器 - l :显示最近运行的容器 - q :只显示容器ID - n:显示最近n个创建的容器 |
| 退出容器 | 通过docker run 进去的容器,使用exit退出后,容器停止;使用ctrl + p + q 退出,容器不停止 | |
| docker start 容器ID或容器名 | 启动已经停止的容器 | |
| docker restart 容器ID或容器名 | 重启容器 | |
| docker stop 容器ID或容器名 | 停止容器 | |
| docker kill 容器ID或容器名 | 强制停止容器 | |
| docker rm 容器ID或容器名 | 删除已经停止的容器 | - f:强制删除,可以删除正在运行的容器。 支持批量删除,跟删镜像方式一样。 |
| docker logs 容器ID或容器名 | 查看容器日志 | |
| docker top 容器ID或容器名 | 查看容器内运行的进程 | |
| docker inspect 容器ID或容器名 | 查看容器内部细节 | |
| 进入正在运行容器 | docker exec -it 容器ID /bin/bash (推荐使用) docker attach 容器ID 使用exec进入容器,会在容器中打开新的终端,启动一个新的进程run,使用exit退出,不会导致容器停止。 attach直接进入容器启动命令的终端,不会启动新的进程,使用exit退出后,容器会停止。 | |
| docker cp 容器ID:容器内路径 宿主机路径 | 从容器中拷贝文件到宿主机 | 在宿主机上执行 |
| docker export 容器ID > 文件名.tar | 导出容器的内容,作为一个tar归档文件 | 在宿主机上执行 |
| docker import | 从tar包中的内容创建一个新的文件系统再导入为镜像 | cat 文件名.tar | docker import -镜像用户/镜像名:镜像版本号 |
docker run的 OPTION参数补充:
3、docker镜像
镜像介绍
概念
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,包括代码、依赖的库、环境变量、配置文件等。
镜像分层
镜像可以通过分层来进行继承。
UnionFS(联合文件系统):分层、轻量级、高性能的文件系统,它支持对文件系统的修改作为一次提交来一层一层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。UnionFS是Docker镜像的基础。Docker基于基础镜像,来制作各种业务镜像。
镜像分层的好处:
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享
Docker镜像层都是只读的,容器层是可写的。 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的改动都只会发生在容器层中。
镜像制作
两种方法:docker commit 和 dockerfile
docker commit
| 命令 | 解释 | 示例 |
|---|---|---|
| docker commit | 提交容器副本,使之成为一个新的镜像 | docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名] |
dockerfile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
Docker执行Dockerfile的大致流程:
- (1)docker从基础镜像运行一个容器
- (2)执行一条指令并对容器作出修改
- (3)执行类似docker commit的操作提交一个新的镜像层
- (4)docker再基于刚提交的镜像运行一个新容器
- (5)执行dockerfile中的下一条指令直到所有指令都执行完成
Dockerfile保留字指令:
| 指令 | 描述 | 示例 | 命令执行阶段 |
|---|---|---|---|
| FROM | 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from | docker build | |
| MAINTAINER | 镜像维护者的姓名和邮箱地址 | docker build | |
| RUN | 容器构建时需要运行的命令 | RUN <命令行命令> RUN yum -y install vim | build |
| EXPOSE | 当前容器对外暴露出的端口 | run | |
| WORKDIR | 指定在创建容器后,终端默认登陆的进来工作目录 | build + run | |
| USER | 指定该镜像以什么用户去执行,如果都不指定,默认是root | build + run | |
| ENV | 用来在构建镜像过程中设置环境变量。 | ENV MY_PATH /usr/mytest 这个环境变量可以在后续的任何RUN指令中使用;也可以在其它指令中直接使用这些环境变量,比如:WORKDIR $MY_PATH | run |
| ADD | 将宿主机目录下的文件拷贝进镜像,且会自动处理URL和解压tar压缩包。相当于复制和解压 | build | |
| COPY | 拷贝目录和文件到镜像中。将从构建上下文目录中源路径的文件/目录复制到新的一层镜像的目标路径内。 | COPY src dest | build |
| VOLUMN | 容器数据卷 | run | |
| CMD | 指定容器启动后要干的事情 | CMD catalina.sh run Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。 比如,如果docker run后写了参数/bin/bash,则catalina,sh run会被/bin/bash替换 | run |
| ENTRYPOINT | 也是用来指定一个容器启动时要运行的命令 | 类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序 dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。如果ENTRYPIONT后面有CMD,则CMD会当做ENTRYPOINT的参数 | run |
4、容器数据卷
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
- 作用:将docker容器内的数据保存进宿主机的磁盘中。
- 命令:docker run -it --privileged=true -v /宿主机绝对路径目录:容器内目录:读写规则 镜像名。
- 特点:(1)数据卷可在容器之间共享或重用数据(2)卷中数据更改实时生效(3)数据卷中的更改不会包含在镜像的更新中(4)数据卷的生命周期持续到没有容器使用它为止。
- 查看数据卷是否安装成功,可以使用docker inspect命令,查看Mounts字段
- 数据卷读写规则:默认是rw。ro:容器只读
- 数据卷的继承:docker run -it --privileged=true --volumes-from 父类的容器名 镜像名