docker详解(docker通俗易懂)
本篇文章给大家谈谈docker详解,以及docker通俗易懂对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
详解Docker——你需要知道的Docker进阶知识二
Docker镜像
镜像仓库(Repository)用于存放镜像,每个仓库都有唯一的地址,和网址类似。镜像仓库托管在某个 Registry,Registry 和GitHub类似。Docker 提供了一个官方的 Registry,官方 Registry 里的镜像仓库地址可以省去前面的域名前缀,其它 Registry 里的镜像仓库地址必须要指定域名前缀,以保证唯一性。
镜像仓库地址后面可以跟一个 TAG。比如一个镜像名称 ubuntu:14.04 ,冒号前面的 ubuntu 是镜像仓库地址(由于是官方 Registry 里的,可以省略域名前缀),后面的 14.04 是 TAG,TAG 通常设置为镜像的版本号。
Docker 镜像是分层存储的,每一个镜像都由多层组成。镜像之间会森察世共享一些相同的层,从而减小镜像占用的存储空间。
也可以查看指定的镜像:
查看镜像的详细信息
比较常用的配置参数为 -a ,代表下载仓库中所有 TAG 的镜像,默认只下载 latest TAG 的镜像。
如果要下载 ubuntu:14.04 镜像没没,可使用如下命令:
对于我们 pull 的新镜像 ubuntu:14.04 来说,如果我们需要对其进行更新,可以创建一个容器,在容器中进行修改,然后将修改提交到一个新的镜像中。
提交修改使用如下命令:
该命令从一个修改过的容器创建一个新的镜像。例如,我们运行一个容器,然后在其中创建一个文件,最后使用 commit 命令:
通过上述操作我们创建了一个新的镜像,但是本方法不推荐在生产环境使用,因为这种方式的可维护性很差。推荐的创建镜像的方法是使用 Dockerfile ,修改镜像可通过修改 Dockerfile ,然后使用新的 Dockerfile 来构建新的镜像。
docker 可以从一个 Dockerfile 文件中读取指令来构建镜像。 Dockerfile 是一个包含用户构建镜像所需命令的文本文件。在 创建好该文件后,我们此肢可以使用如下命令来构建镜像:
对于一个 Dockerfile 文件内容来说,基本语法格式如下所示:
使用 # 号作为注释,指令( INSTRUCTION )不区分大小写,但是为了可读性,一般将其大写。 Dockerfile 中的指令一般包含下面几个部分:
下面是一个最基本的 Dockerfile :
通过阅读上述内容中我们熟悉的一些 linux 指令,可以很容易的知道该 Dockerfile 将创建一个 apache 镜像。
其中 FROM 指定基础镜像。 RUN 命令默认使用 /bin/sh ,并使用 root 权限执行。 CMD 命令也是默认在 /bin/sh 中执行,但是只能有一条 CMD 指令,如果有多条则只有最后一条会被执行。
下面我们创建一个空目录,在其中编辑 Dockerfile 文件,然后基于此文件构建一个新的镜像:
在构建完成后,我们可以使用该镜像启动一个容器来运行 apache 服务,运行如下命令:
此时,容器启动成功后,并且配置了端口映射,我们就可以通过本机的 8000 端口访问容器 hellodocker3 中的 apache 服务了。我们打开浏览器,输入 localhost:8000
删除 ubuntu:latest 镜像可以使用如下命令:
删除所有的镜像
Docker iptables 详解
该环境安装了docker ,并启动了一个容器做了端口映射
iptables 里raw、mangle 表都是空的
接着来梳理,数据经过iptables 是如何处理的。首先需要了解iptables 的组成:
iptables 有4表(raw、mangle、nat、filter)5链(prerouting、input、forward、output、postrouting),数据经过iptables 需要按顺序经过5链进行处理。看下图:
1、首先数据经过prerouting表,由于 raw、mangle表都为空,所以可以直接看nat表的prerouting 链:
从这里可以看到通过nat表中的prerouting链,将所有访问本地地址的数据都匹配到Docker 链;
而Docker 这里有DNAT 规则,将访问宿主机 9525端口枝念的数据转发到 172.17.0.6:9525
2、再到input链,其中mangle表为空,直接看nat、filter表中的input链:
从【1】可以看到nat 中input链以及filter表的input链都没做任何规则芦族
3、再接着到output链,raw、mangle为空,直接查看nat、filter表中的output 链
从上可以看到 nat 表中的output链将所有目的地址为非环回地址的本地地址数据匹配到Docker链,然后重复DNAT;
再到filter表中的output链没有做任何规则
4、 最后到postrouting 链,mangle 为空,nat 表将目标地址为0.0.0.0 数据通过SNAT做动态转发出去,而目标地址为172.17.0.6 的则转发到9525 端口
PS:
这是经过朋友的讲解和自己一些理解,猛哗困如有错误请指正。
详解Docker——你需要知道的Docker进阶知识三
我们可以将数据保存在容器中,但是这样存在一些缺点:
针对上述的缺点,有些数据,例如数据库文件,我们不应该将其保存在镜像或者容器的可写层中。Docker 提供三种不同的方式将数据从 Docker 主机挂载到容器中,分别为卷( volumes ),绑定挂载( bind mounts ),临时文件系统( tmpfs )。很多时候, volumes 总是正确的选择。
无论使用上述的哪一种方式,数据在容器内看上去都是一样的。它被认为是容器文件系统的目录或文件。
对于三种不同的存储数据的方式来说,卷是唯一完全由 Docker 管理的。它更容易备份或迁移,并且我们可以使用 DockerCLI 命令来管理卷。
列出本地可用的卷列表:
这种由系统随机生成名称的卷称为 匿名卷 ,匿名卷名称不具备可读性,使用起来不太方便,所以创建卷时一般会指定其 name 。例如我们创建一个名为 volume1 的卷。
创建好卷之后,我们可以用卷来启动一个容器,这里首先需要学习 docker container run 命令的两个参数:
对于前面创建的卷 volume1 ,可使用如下命令来在容器中使用:
使用 --mount 的命令如下:
上述操作,我们运行了两个容器,并分别挂渗行载了一个卷。对于这两个容器来说,由于挂载的是同一个卷,所以它们将共享该数据卷。多个容器共享数据卷时,需要注意并发读写问题。可以分别连接到两个容器中,操作数据来验证数据是同步的。
绑定挂载( bind-mounts )通过将主机上的目录挂载到容器中,使得容器可以操作和修改主机上的文件。
例如,我们将 /home/hellodocker 目录挂载到容器中的 /home/hellodocker 目录下,使用的命令如下:
而如果使用 --mount ,相应的语句如下:
上述两个操作针对的是目录,而对于挂载文件来说,可能会出现一些特殊情况,涉及到绑定挂载和使用卷的区别。下面我们重现这一操作:
首先在当前目录,即 /home/hellodocker 目录下,创建一个 test.txt 文件。并向其中写入文本内容 "test1":
接着创建一个容器 hellodocker6 ,将 test.txt 文件挂载到容器中的 /test.txt 路径,并查看容器中 /test.txt 文件的内容:
这时新打开一个终端,通过 echo 命令向 /home/hellodocker/test.txt 文件追加内容 "test2",并在容器中查看 /test.txt 文件的内容:
这时无论是在容器中还是主机上都能查看到该文件的最新内容。接下来在主机上查看 test.txt 的 inode 号,并使用 vim 编辑该文件丛渣哗,添加 "test3",并查看该文件的内容:
在主机上使用 vim 编辑后,通过 vim 做出的修改并不能在容器中查看到
这是因为 vim 编辑文件的时候,会将文件内容暂存到一个临时文件中,退出保存后会删除原来的文件,并将临时文件重命名为原文件。但是我们标识文件是通过 inode ,因此 Docker 绑定的依然是旧的主机文件,所以容器中看到的依然是旧的内容。
对于数据卷来说,由 docker 完全管理,而绑定挂载需要我们自己去维护。我们需要自己手动去处理这些问题,这些问题并不仅仅是上面演示的这些,还有用户权限, SELINUX 等。
tmpfs 只存梁姿储在主机的内存中。当容器停止时,相应的数据就会被移除。
[img]关于docker详解和docker通俗易懂的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。