Docker 笔记 - 01.基础
概念:
名称 | 解释 | 备注 |
---|---|---|
镜像 (image) |
可以理解为一个做餐具的模具,用不同的镜像可以加工出来不同的餐具(容器) | |
容器 (container) |
可以理解为模具加工出来的餐具,一个模具可以加工出来很多个相同的餐具,而加工出来的餐具又可以重新雕琢,再以它为基础做出新的餐具模具(容器) * 容器是一个镜像实例化(捏餐具)的产物,实例化以后的改动只影容器(餐具)而不影响镜像(模具) * 容器通常是一套运行环境,可以是linux系统(不同版本),可以是数据库,可以是存储单元 * 程序代码通常需要不同的运行环境,比如php7和php5有不兼容的代码,那么他们需要各自运行在适合的环境里面,容器则为他们提供这个环境 * * 类似:炒不同的菜需要不同的容器(锅碗瓢盆)。 * 容器提供了运行环境的隔绝,比如两个php应用(即使版本一致)需要不同的系统参数和配置,那么放在容器里可以让他们各自得到自己需要的环境配置 |
|
Docker守护进程 (Docker daemon) |
在宿主机上运行的后台服务,它管理docker容器的构建,运行和分发 | |
Docker客户端 (Docker Client) |
允许用户和Docker守护进程交互的命令行工具 | |
Docker Hub | Docker镜像的登记表。可以把它想象为一个存储着所有可用的docker镜像的目录 | |
层 (Layers) |
一个Docker镜像由多个层构成。每个层代表着这个镜像的Dockerfile中的一句指令。除了最后一层,每层都是只读的。 | |
Dockerfile | 一个包含着所有必要的用来构建镜像的命令的文本本间 在Dockerfile reference页面可以查看所有可用于dockerfile的命令和它们的参数细节 |
Dockerfile reference |
卷 (volumes) |
一个特殊的docker容器层允许数据持久化保存而且可以与容器本身分隔开。可以把卷想象为一个区分于应用本身的,抽象的持久化数据储存方式 | |
Docker Compose | 用来在一个单一系统里面控制多个容器 类似使用dockerfile来建立一个镜像,有一个文本文件定义了这个应用:使用哪个基础镜像,几个实例,网络连接等等 |
但是Compose只在一个单一系统里面运行,所以在多系统情况下需要使用Swarm模式 |
Docker Swarm Mode | 告诉Docker会有多个引擎运行而且我们需要在他们之间进行协同. Swarm模式不仅有能力像compose一样定义应用架构,也有能力定义和管理高可用级别,尺度缩放(scanling),负载均衡以及其他. |
通过这些功能,Swarm模式在生产环境的使用要比它的简化版Compose更多. |
用到的命令和用途:
命令 | 用途 | 备注 |
---|---|---|
docker run hello-world | 测试docker已经成功安装 | helloworld镜像运行后会输出docker相关信息 docker container run 也有相同效果 [1] |
docker run NAME | 基于某个镜像,实例化出来一个容器,启动,执行,停止 | 如果本地没有这个镜像,会自动去registry取回 |
docker container run hello-world | 测试docker已经成功安装 | [备注1][1] |
docker pull ubuntu | 获取ubuntu镜像 | docker pull ubuntu: |
docker image pull alpine | 获取ubuntu镜像 | 跟docker pull 一样,目测也是 [备注1][1] |
docker image ls / ls -a | 显示所有本地的镜像 | |
docker container run -it ubuntu bash | 启动ubuntu镜像,并且提供命令行的终端交互 | i:interactively, t:terminal |
docker start ID | 启动某个停止了的容器 | 如果不启动,容器会在执行完毕后自动停止 |
docker exec ID CMD | 在某个已经启动了的指定id的container上执行命令CMD | |
docker image inspect | ||
docker image history | ||
docker image build | ||
docker container rm ID | ||
docker container prune | ||
状态转换关系
命令 | 转换 | |
---|---|---|
docker pull | registry的镜像拉回到本地 | 类似git clone |
docker run | 启动,执行,停止 | 重要在于会执行容器内配置好的指令(dockerfile里面的命令或者容器内部的程序) |
docker start ID | 容器启动(container ls 可以看到) | 容器没有启动的情况下需要(container ls -a 才可以看到) |
docker exec ID CMD | 某个已启动的容器接收并执行这个命令行里面的CMD | 类似后台服务 |
docker stop ID | 容器关机(container ls 看不到) | container ls -a可以看到 |
docker container commit ID | 确认一个容器的实时改动,并基于这一系列改动生成镜像 | |
docker image inspect tag | 显示一个或多个镜像的细节信息 | 包含了所有层的信息,镜像基本信息和环境配置信息等等 |
docker image history tag | 显示一个或多个镜像的修改历史:每个改动的hash,修改时间,作者,容量大小 | 类似git log |
docker image build | 基于一个dockerfile生成一个镜像 | docker image build -t hello:v0.1 . 基于当前目录(.)里面的dockerfile生成一个镜像,并且命名为hello,版本号为0.1 |
docker container logs ID | 显示一个容器的日志 | 有命令行的镜像会返回terminal日志,没有命令行的比如mysql会返回应用日志 docker log 也可以用 |
总结
- 早期docker有很多不区分命令command和子命令subcommand的做法,比如
docker run
,docker pull
,docker commit
,在较新版本后做了统一,但是老的写法仍然被保留。- 更好的习惯是用完整的命令
- 在命令行里面引用各种image和containerid的时候,不需要输入完整id,只需要输入id最左边的三四个字符
docker image build
类似c的compile,基于dockerfile的内容,获取基础包(FROM),执行初始化命令(RUN),设定工作目录(WORKDIR),执行命令(CMD)docker run
有--mount
参数可以绑定本地目录和镜像内目录,对于文件改动可以实时更新. 注意type=bind
.--mount type=bind,source="$(pwd)",target=/usr/share/nginx/html $DOCKERID/linux_tweet_app:1.0
- xx
引用细节(reference_dettails)
[1]: docker run
和 docker container run
的差异: 他们是完全一样的,在docker 1.13版本之前仅有docker run
命令可以使用。命令行命令会被重构成为docker COMMAND SUBCOMMAND
的格式。在这里COMMAND是container而SUBCOMMAND 是run。这个改动是为了让命令分组得更加符合直觉,因为在这个版本更新的时候docker的命令有了实质的大量增长。 [引用来源]
[2].
666 · 1
(点赞功能开发中)