Docker 实战教程之从入门到提高(二)

article/2025/8/27 7:38:34

本系列第一篇文章,Docker 实战教程之从入门到提高 (一),我们已经介绍了如何在 Ubuntu 操作系统中安装 Docker,以及 Proxy 和 Insecure Registry 的配置。

本文继续 Docker 的实战学习。

练习1:通过一个简单例子学习 Docker 和宿主机操作系统文件目录互相隔离的实现原理

我们知道在 Docker 容器里是无法访问到宿主操作系统的文件目录的,但这种隔离是怎么实现的呢?
其实一点也不神奇——利用了 Linux 系统的内部命令 chroot.
chroot 能将进程的根目录设置成任意指定的目录。

使用 chroot 我们能创建一个新的进程,并且以 chroot 执行时传入的参数作为新进程的根目录。
因为新进程创建之后就无法访问除了新进程创建时传入 chroot 参数之外的其他文件目录,为了确保这个新进程能够正常工作,我们必须手动拷贝一些文件到新进程的根目录映射的旧目录下。

做一个如下测试:

新建一个文件夹,执行 chroot . 意思是把文件夹 $HOME/container 当作新建进程的根目录。但是没有成功,报错误消息:

chroot: failed to run command ‘/bin/bash’: No such file or directory

执行下面两条命令:

执行命令 ldd $HOME/container/bin/bash:
该命令为了查看需要有哪些库文件得手动拷贝到文件夹 $/HOME/container/bin/bash下面:

根据 ldd 的输出,再次执行下图的八条命令:


再次执行 chroot . ,发现这次成功了:

pwd 发现是在根目录下,ls 也只能发现执行 chroot 时指定的 container 目录下的子目录:

这就是 docker 文件目录隔离的实现原理。

练习2:用一个实际例子理解 Docker volume 工作原理

要了解 Docker Volume,首先我们需要理解 Docker 文件系统的工作原理。Docker 镜像是由多个文件系统的只读层叠加而成。当一个容器通过命令 docker run 启动时,Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,但是该文件的只读版本依然存在,只不过已经被读写层中该文件的副本所隐藏。

当删除Docker容器,并通过该镜像重新启动时,之前在读写层的更改将会丢失。在 Docker中,只读层及在顶部的读写层的组合被称为 Union File System(联合文件系统),简称UnionFS,它用到了一个重要的资源管理技术,叫写时复制。

写时复制(copy-on-write), 也叫隐式共享,是一种对可修改资源实现高效复制的资源管理技术。对于一个重复资源,若不修改,则无需立刻创建一个新的资源,该资源可以被共享使用。当发生修改的时候,才会创建新资源。这会大大减少对于未修改资源复制的消耗。其实COW 这个概念对编程人员来说一点也不陌生,广泛用在各种领域,比如 ABAP 里对于内表(Internal table) 的拷贝动作,Java 字符串的拷贝实现等等。Docker 基于 UnionFS 去创建containers.

我们下面看一个实际例子。
使用命令行 docker run --help 查看这个命令的帮助文档。 -h 的作用是指定容器的主机名。

使用命令行创建一个新的容器:

docker run -it --name jerry-container-test -h CONTAINER -v /data busybox /bin/sh
名称为 jerry-container-test, 用 -v 创建了一个 volume /data

创建完毕之后,在容器里执行cd /data进入这个目录,这个时候还是空的。

docker ps 查看容器状态:

现在我想知道主机上为了实现这个 volume,使用了哪个 internal 目录。
用命令 docker inspect jerry-container-test 查看关键字"volumes":

得到了容器里 /data 在主机上实现的目录:

/var/lib/docker/volumes/96aa969033ee7e6d7ff607a0a47de5a5866613a422518ed3f86fee6240bae8cc/_data
现在我在主机上使用 touch 命令在这个目录下直接创建一个文件:
sudo touch /var/lib/docker/volumes/96aa969033ee7e6d7ff607a0a47de5a5866613a422518ed3f86fee6240bae8cc/_data/test.s

现在切换到容器里,用ls也能看到直接在主机上用 touch 命令在 internal folder 里创建的文件了。

练习3:利用 Docker volume 修改 Nginx Docker 镜像里的 index.html

通过这个小例子我们可以进一步加深对 Docker volume概念的理解和使用方法。

我们都知道运行基于 Docker 的 Nginx 镜像后,访问 localhost 能看到 Nginx 默认的首页,这个首页的位置是 Nginx 镜像内的 /usr/share/nginx/html 目录下面。

假设我们有个需求,修改 Nginx 默认的首页成下面的内容:

<html>
<head>
<title>Custom Website from my container</title>
</head>
<body>
<h1>This is Jerry's custom website.</h1>
<p>This website is served from my <a href="http://www.docker.com" target="_blank">SAP Docker</a> container.</p>
</body>
</html>

下面是详细方法。

命令行 -v 将主机目录 nginx-html 挂载到 Nginx 容器内的 /usr/share/nginx/html 目录内。

docker run -d -p 1081:80 -v pwd/nginx-html:/usr/share/nginx/html --name jerry-custom nginx

使用 vi 将主机目录 nginx-html 下面的 index.html 修改成自定义内容:


通过交互式的方式进入到docker容器内部:

docker exec -it jerry-custom /bin/sh

发现 Docker 容器里的 index.html 也自动被修改了,内容和主机目录 nginx-html 下面的一致。

localhost:1081 即可看到修改过后的自定义 Nginx 首页:

总结

本文首先通过一个简单的例子,介绍了 Docker 和宿主机操作系统文件目录互相隔离,是如何通过 Linux 命令 chroot 的实现原理,接着用修改 Nginx Docker 镜像 index.html 的实际例子,阐述了 Docker Volume 的实现原理和使用方法。


http://chatgpt.dhexx.cn/article/ohaBAIAd.shtml

相关文章

docker简单实战

1.为ubuntu镜像添加ssh服务 1.1查看可用的ubuntu版本 1&#xff09;访问ubuntu镜像库地址&#xff1a;https://hub.docker.com/search?qubuntu&typeimag1e 2&#xff09;点击第一个ubuntu的官方镜像&#xff0c;选择tag标签&#xff0c;可以选择下载对应的ubuntu镜像 3…

Docker入门与进阶(基础+实战+进阶+Compose+Swarm)超详细版

Docker入门与进阶&#xff08;基础实战进阶&#xff09; 一、Docker入门1.1 Docker 概述1.2 Docker 安装、配置、卸载1.3 Docker 使用流程1.4 Docker 访问原理1.5 Docker 常用命令1.5.1 基础命令1.5.2 镜像命令1.5.3 容器命令1.5.4 其他常用命令1.5.5 镜像导出、导入 1.6 制作D…

Docker 入门到实战教程(三)镜像和容器

上一篇文章介绍到Docker的安装,那我们就来验证下 验证安装结果 docker run --rm hello-world输入以下的内容代表安装成功 file 下面开始镜像和容器操作 一. 镜像操作 Docker完美融合Linux&#xff0c;所以Docker命令行的风格和Linux还是比较接近的&#xff0c;相对来说比较容…

Docker入门实战大全终极版

Docker入门 学习推荐 哔哩哔哩 狂神说java 本文主要学习大纲 Docker组成 Docker基本操作 Docker安装卸载Docker阿里云镜像加速Docker run 运行流程图底层原理 Docker的常用命令 帮助命令镜像命令 docker images 查看所有本地的主机上的镜像docker search 搜索镜像docker pull…

Docker入门实战看这篇就够了(最新详细以及踩过的坑)

Docker入门实战看这篇就够了 前言初识是什么容器与虚拟机 能干什么去哪玩 安装先决条件查看自己的内核 安装所需的软件包(支持devicemapper存储类型)设置镜像的仓库设置yum源安装docker启动docker测试配置自己的阿里云镜像加速(强烈推荐)注册登录阿里云开发平台进入控制台选择容…

Docker 基础实战教程:入门

Docker 基础实战教程&#xff1a;入门 前言Hello Docker !Docker使用的基本过程Docker使用基本实例 拉取镜像获取镜像docker pull命令背后的工作docker pull的两个基本实例设置镜像加速器 导入导出容器docker export和docker save的区别 前言 Docker是一个操作系统级的虚拟化技…

Docker 入门到实战教程(十三)Docker Compose

文章目录 一. Docker Compose 概述与使用二. 安装 Docker Compose三. 使用Docker Compose四. 更新Docker Compose五. 更新应用程序测试 一. Docker Compose 概述与使用 1.1 概述 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,定义和运行多容器D…

我的Docker学习笔记:从入门到实战过程全记录

文章目录 1 和Docker相关的概念1.1 虚拟机和容器1.2 容器、镜像和Docker1.3 Docker和k8s 2 Docker的安装2.1 在ubuntu中安装2.2 在Win10中安装2.3 Hello world 3 Docker镜像的使用3.1 列出本地所有镜像3.2 从镜像库中查找镜像3.3 下载新的镜像 4 Docker容器的使用4.1 启动容器4…

Docker入门与实战讲解

简述 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#xff08;类似 iPh…

Docker 入门到实战教程(一)介绍Docker

一. Docker简介 1.1 什么是虚拟化? 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0…

Docker——入门实战

I. Docker 简介 Docker是一种新兴的虚拟化技术&#xff0c;能够一定程度上的代替传统虚拟机。不过&#xff0c;Docker 跟传统的虚拟化方式相比具有众多的优势。我也将Docker类比于Python虚拟环境&#xff0c;可以有效的配置各个版本的开发环境&#xff0c;比如深度学习与Java…

Docker超详细教程——入门篇+实战

Docker详细教程——入门篇 官方地址docker概念相关概念docker底层操作流程docker好处为什么比虚拟机快 docker常用命令概览 docker安装本教程环境安装步骤解决提示找不到软件包&#xff1a;添加阿里云镜像 镜像镜像底层原理镜像命令官方地址镜像命令搜索镜像拉取镜像镜像删除 d…

Docker 从入门到实战

docker rm删除已经终止的容器docker -f rm 可以删除正在运行的容器 本文主要介绍了Docker 从入门到实战&#xff1a;概述、安装及部署等 。希望对你的学习有帮助。 一、概述 1.1 基本概念 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开…

docker 入门到实战

目录 1.Docker介绍 1.1 简介&#xff1a; 1.2 Docker的应用场景 1.3 Docker 的优点 1.4 Docker 架构 Docker包括三个基本概念: Docker和虚拟机区别&#xff1a; 2.Docker安装 2.1 CentOS Docker 安装 2.2卸载旧版本 2.3设置仓库 2.4安装Docker 2.5启动docker 2.6…

Virtualbox虚拟机安装Mac os14教程

1、VirtualBox虚拟机 下载地址&#xff1a;https://www.virtualbox.org/ 特别提醒&#xff1a;推荐官方下载&#xff0c;安装VirtualBox虚拟机的时候请保持默认安装位置&#xff08;就是直接点下一步&#xff0c;不要自己修改安装位置&#xff09; 2. Mac Os14下载 下载地址…

pd虚拟机安装linux系统,Mac利用PD虚拟机安装CentOS 7

Post Views: 263 使用Parallels Desktop在Mac上安装CentOS Linux的方法有两种: 通过使用Parallels Desktop中可用的CentOS设备。 通过使用从Internet下载的安装映像手动安装CentOS。 使用设备安装CentOS 1.启动Parallels Desktop,然后 从Mac顶部栏中选择 File – New。 2.从…

虚拟机安装MAC系统、搭建ios开发环境

MacOS系统资源&#xff0c;网盘下载&#xff1a;https://pan.baidu.com/s/1xRWusbgfIUxJxMpUbWWRag 提取码: 08fc 1、安装虚拟机 虚拟机下载&#xff1a; http://www.onlinedown.net/soft/2062.htm 注册码&#xff1a; AZ312-2FE41-M81LP-R6WEZ-NA2Z4 VC1J8-0TX11-M84WP-2WN…

mac 安装虚拟机win11

下载PD安装包、win11镜像、PR试用 链接: https://pan.baidu.com/s/1A6M_dc-mL4oUMpVak9Cu3A 提取码: 1cfl 1、下载好后&#xff0c;允许访问文件权限 2、这一步可直接安装&#xff0c;或者跳过通过win11的IOS镜像导入&#xff0c;win11则选择跳过 3、跳过则到该页面&#xff…

VMware14虚拟机安装Mac OS教程

搬运一波&#xff0c;在论坛里搜了下&#xff0c;没有这个教程&#xff0c;就来分享给大家&#xff0c;还是很不错的东西呢&#xff01;给大家分享在Windows10系统上用Vmware14虚拟机安装苹果Mac os x系统的方法~准备工具 Vmware14虚拟机unlocker补丁mac os x 镜像 下载好上面…

mac下安装win7虚拟机

首先需要有Parallels desktop这个工具 下载win7镜像&#xff0c;下载链接https://msdn.itellyou.cn/ 找到windows7操作系统&#xff0c;下载第一个 下载方式为复制下载地址ed2k链接&#xff0c;然后打开迅雷&#xff08;或qq旋风等下载工具&#xff09;&#xff0c;自动识别到…