Docker 必读资源: 面向初学者的容器、虚拟机和Docker简介 Docker教程与Python 为什么使用DOCKER? 在开发者的控制台上应用运行良好,但在测试或生产环境中却无法正常工作。 开发环境中的软件可能是更新过的版本,但在测试和生产环境中使用的却是旧版本。 Docker是一个计算机程序或工具,它使部署和运行应用程序变得更加容易。其核心概念是“容器化”。 想象一下,作为开发者,你的应用被打包成一个包含所有所需组件(如库和其他依赖项)的包,然后作为一个整体进行分发。 Docker本质上是一个轻量级的虚拟化工具和容器化平台,在Linux环境中可以运行和部署应用程序及其依赖项。 Docker是一个基于Linux容器的开源项目。
为什么使用DOCKER?
在开发者的控制台上应用运行良好,但在测试或生产环境中却无法正常工作。
开发环境中的软件可能是更新过的版本,但在测试和生产环境中使用的却是旧版本。
Docker是一个计算机程序或工具,它使部署和运行应用程序变得更加容易。其核心概念是“容器化”。
想象一下,作为开发者,你的应用被打包成一个包含所有所需组件(如库和其他依赖项)的包,然后作为一个整体进行分发。
Docker本质上是一个轻量级的虚拟化工具和容器化平台,在Linux环境中可以运行和部署应用程序及其依赖项。
Docker是一个基于Linux容器的开源项目。它利用Linux内核的特性(如命名空间和控制组)来创建容器。
Docker引擎
Docker客户端
Docker守护进程
卷
微服务架构:
微服务架构的理念是将应用程序分解成更小的部分,使其更容易构建和维护。
每个组件可以独立开发和完成……
示例:在线购物服务:
微服务架构的优势:
采用微服务的问题:
Docker如何解决这个问题:
Docker如何解决“在整个交付过程中(开发、测试、生产)没有一致的计算环境”的问题:
什么是镜像?
Docker镜像是容器的基础。它是一系列堆叠在一起的只读层。每个Docker镜像引用了一个表示文件系统差异的只读层列表。可以将其类比为Java应用程序的jar文件,创建一个jar文件后,可以在任何启用Java运行时的环境中部署它。
Docker镜像是一个存档,包含了容器中所有的文件。
可以从同一个Docker镜像创建许多Docker容器。
镜像可以在任何Docker环境中部署并作为容器执行。
Docker镜像包含了运行容器所需的一切,包括:

什么是容器?
容器是一种标准的软件单元,它封装了代码及其所有依赖项,使得应用可以在不同计算环境中快速可靠地运行。
Docker容器镜像是一种轻量级、独立且可执行的软件包,包含了运行应用所需的一切:代码、库、设置等。
容器镜像在运行时变成容器。对于Docker容器来说,镜像在Docker引擎上运行时变成容器。
容器共享宿主机的操作系统内核,因此不需要为每个应用分配操作系统。
应用在容器中更安全,Docker提供了业界最强的默认隔离能力。
Docker容器是从Docker镜像创建的实际运行单元。Docker镜像和Docker容器之间的唯一区别是一个可写的顶层。当你创建一个新的容器时,会在底层堆栈之上添加一个新的薄写层。这个层通常被称为“容器层”。所有对正在运行的容器所做的更改——如写入新文件、修改现有文件或删除文件——都会写入这个薄可写的容器层。但是,一旦你删除容器,这个顶层层也会被删除。所以它不是持久化的。Docker最好的一点是,你可以使用当前的Docker容器创建一个新的Docker镜像,从而捕获系统信息并使其不可变,这样可以在任何地方复现。这解决了我们今天遇到的许多服务器相关问题。

容器与虚拟机的区别
当谈到容器化时,经常会与虚拟机进行比较。让我们看看下面的图片,了解它们的主要区别:
Docker容器平台始终运行在宿主操作系统之上。容器包含二进制文件、库和应用程序本身。容器不包含来宾操作系统,这确保了容器的轻量级特性。
相比之下,虚拟机运行在管理程序(负责运行虚拟机)之上,并包含自己的来宾操作系统。这显著增加了虚拟机的大小,使得设置虚拟机更加复杂,并且需要更多的资源来运行每个虚拟机。

Dockerfile
# Super simple example of a Dockerfile FROM ubuntu:latest MAINTAINER Tikam Alma RUN apt-get update RUN apt-get install -y python python-pip wget RUN pip install Flask ADD hello.py /home/hello.py WORKDIR /home
命名空间为容器提供了独立于底层Linux系统的视图,限制了容器能够访问的内容。当你运行一个容器时,Docker会为该特定容器创建命名空间。
Linux内核中有几种类型的命名空间,Docker会使用其中一些,例如:
a. NET:为容器提供独立于系统的网络堆栈视图(例如,其自己的网络设备、IP地址、IP路由表、/proc/net目录、端口号等)。
b. PID:PID代表进程ID。如果你曾经在命令行中运行过ps aux来检查系统上运行的进程,你会看到一个名为“PID”的列。PID命名空间为容器提供了独立的进程视图,包括独立的init(PID 1),它是“所有进程的祖先”。
c. MNT:为容器提供独立于系统的“挂载”视图。因此,不同挂载命名空间中的进程对文件系统层次结构有不同的视图。
d. UTS:UTS代表UNIX时间共享系统。它允许进程标识系统标识符(即主机名、域名等)。UTS允许容器具有独立于其他容器和宿主机系统的主机名和NIS域名。
e. IPC:IPC代表进程间通信。IPC命名空间负责隔离每个容器内部运行的进程间的IPC资源。
f. USER:这个命名空间用于隔离每个容器内的用户。它通过允许容器具有与宿主机系统不同的用户ID(uid)和组ID(gid)范围来实现功能。结果是,进程的uid和gid在容器内外可能不同,这也允许进程在容器外部拥有非特权用户而不牺牲容器内的root权限。
Docker使用联合文件系统来构建镜像。你可以将联合文件系统想象为一种堆叠式文件系统,这意味着来自不同文件系统(称为分支)的文件和目录可以透明地叠加形成一个单一文件系统。
叠加分支中具有相同路径的目录被视为一个合并的目录,避免了每次使用镜像创建和运行新容器时都需要创建单独副本的需求。相反,它们都可以指向同一资源;当某些层需要修改时,它会创建一个副本并在本地进行修改,而原始层保持不变。这就是文件系统可以“看起来”可写但实际上不允许写入的方式。(换句话说,这是一种“写时复制”系统。)
分层系统提供了两个主要好处:
声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。