码头10分钟后开工

2020-11-04 09:51:17

我断断续续地接触过码头,每次我看到它,似乎都需要重温一下。在本文中,我们将介绍您需要了解的关于Docker的所有内容,以便您可以直接进入现有项目,也可以开始使用它。

Docker基本上是一个在主机上以隔离方式运行进程的系统,使用了几个Linux内核功能。因此,Docker比成熟的虚拟机更轻量级。Docker容器与虚拟机相比的缺点是多个容器共享相同的底层操作系统内核。虽然监禁进程的概念并不新鲜,Docker的流行本质上是因为它提供的工具使得旋转和管理容器变得非常简单。

Docker由各种组件组成。主要组件是docker引擎,它由管理容器、映像、构建等的轻量级运行时组成。它在Linux系统上本机运行,由以下部分组成:

Docker客户端是您作为最终用户用来与Docker守护进程通信的工具,例如docker run hello-world。

Docker守护进程实际上执行的是在主机上构建和运行容器等命令。Docker客户端也可以在同一台计算机上运行,但它不是必须的。它还可以与运行在不同主机上的Docker守护进程通信。

我们将在本文后面介绍其他Docker组件,如Docker集线器等。

可以将Docker映像视为设置安装了所有必需软件和依赖项的计算机的秘诀。除了安装软件,映像还可以定义启动时要运行的进程。Docker镜像是通过Dockerfile中写入的指令创建的。图像是建立在层的概念之上的。始终有一个基本层,后面可能跟有表示文件更改的附加层。每一层都堆叠在其他层之上,由它与上一层之间的差异组成。这是通过联合文件系统实现的。

Docker容器是镜像的运行实例。这包括操作系统、应用程序代码、运行时、系统工具、系统库等。Docker镜像可以看作是可执行文件,容器可以看作正在运行的应用程序。请注意,在此类比中,每个运行的应用程序都是其自己的实例,并且独立于其他应用程序。

一般的想法是,一旦您成功创建了容器,您就可以在任何环境中运行它,而不必进行更改。

Docker卷是容器的数据部分,在创建容器时初始化。卷允许您持久化和共享容器的数据。Docker卷独立于默认的联合文件系统,并作为普通目录和文件存在于主机文件系统上。

作为docker安装过程的一部分,通过docker run hello-world下载并执行hello world映像。

$docker imagesRePOSITORY标记映像ID创建SIZEubuntu最新94e814e2efa8 2周前88.9MB hello-world最新fce289e99eb9 2个月前1.84kB。

从新容器中的映像交互运行命令:docker run-it ubuntu bash。

列出所有正在运行的容器:Docker PS。要列出所有以前运行的容器,请使用docker ps-a:

$docker ps-aCONTAINER ID image命令CREATED STATUS PORTS NAMESd2d651741317 ubuntu";bash";45分钟前退出(0)43分钟前可疑_kalam36813bdb6434 ubuntu";bash";大约一小时前退出(0)大约一小时前正在激励_banach46f352a0cde9 hello-world";/hello";2小时前退出(0)2小时前口渴_clke。

请注意,在上面的输出中,对于每个docker run命令,都创建了一个新容器。如前所述,每个容器都有自己的数据卷,对其中一个的更改不会影响其他容器。要运行现有容器:Docker run[CONTAINER-NAME.。这将启动容器,停靠器ATTACH[CONTAINER-NAME]将跳到其中。

此时,您应该有足够的资源开始使用现有的docker项目。如果您希望与Ddocker一起开发,请继续阅读。

如前所述,Docker镜像是通过Dockerfile指定的。下面是一个非常基本的示例,它使用ubuntu基本映像,并将名为sysinfo的可执行文件从当前目录复制到容器中并执行它:

让我们看看如何通过docker build命令启动并运行此映像(请注意,需要GCC编译二进制文件):

$cd~$mkdir-p docker/sysinfo$cd docker/sysinfo$vim sysinfo.cpp#include<;iostream>;#include<;sys/utsname.h>;Using<;int main(){struct utsname sysinfo;uname(&;sysinfo);cout<;<;";系统名称:";<;<;sysinfo.sysname<;<;Endl;cout<;<;&34;主机名:&34;<;<;nodename<;发布(内核)版本:";<;<;sysinfo.release<;<;Endl;cout<;<;&34;内核构建时间戳:";<;版本<;<;sysinfo.version<;<;";Machine Arch:";<;<;sysinfo.Machine<;<;Endl;cout<;<;";Machine Arch:";<;<;sysinfo.Machine<;<;Endl;cout<;<;";域名:";<;<;sysinfo.domainname<;<;Endl;return 0;}$g++sysinfo.cpp-o sysinfo$。/sysinfoSystem名称:Linux主机名:CoolbeansRelease(内核)版本:4.18.0-16-GenericKernel Build时间戳:#17-Ubuntu SMP Fri Feb 8 00:06:57 UTC 2019Machine Arch:x86_64域名:(无)$vim DockerfileROM Fubuntu:18.04COPY sysinfo/cmd[";/sysinfo";$docker build。-t sysinfo$docker run sysinfoSystem名称:Linux主机名称:d8e53b009d72Release(内核)版本:4.18.0-16-GenericKernel Build Timestamp:#17-Ubuntu SMP Fri Feb 8 00:06:57 UTC 2019Machine Arch:x86_64域名:(无)。

请注意以上输出中本地系统(CoolBeans)和运行容器(D8e53b009d72)之间的主机名差异。

如果您犯了错误,可以通过docker RMI[image-name]--force删除图像。清理与映像相关的未使用的容器和卷可以通过停靠系统修剪--卷来完成。

在上面的示例中,我们使用标准的Ubuntu映像作为基础映像创建了一个自定义映像,在我们进一步创建自定义映像之前,最好注意到docker集线器为各种软件提供了大量免费的预配置映像。这是第二个Docker组件,有时也称为Docker注册表(也可以有私有注册表)。

在大多数情况下,我们希望通过Docker运行服务。让我们以一个非常简单Web服务器为例,看看如何实现这一点。按如下方式创建映像(请注意,下面的示例使用GO创建二进制文件):

$cd~$mkdir-p docker/webapp$cd docker/webapp$vim webapp.gopackage mainimport(";io";";net/http&34;)func hello(w http.ResponseWriter,r*http.Request){io.WriteString(w,";Hello from webapp!";)}func main(){http.HandleFunc(";/";,hello)http.ListenAndServe(";:8000";)。,nil)}$go build webapp.go$vim DockerfileFROM ubuntu:18.04COPY webapp/cmd[";/webapp";]$docker build。-t Webapp$docker run-d webappcfab907c828a40ce4cc53b88b26badabf8fa6672fd538d0c072fd0947f36d650。

在上面的示例中,我们构建了一个webapp映像,并使用-d标志启动了docker容器。这将以分离模式启动容器,并打印容器ID,以便我们可以与其交互。我们可以通过坞站PS确认它正在运行:

容器ID映像命令已创建状态端口NAMEScFab907c828a Webapp";/webapp";4分钟前开始工作4分钟HERELAUS_HERSCEL。

此时,我们的Web应用程序在停靠容器中运行,但我们无法与其通信。运行docker check cFab907c828a以json格式输出容器配置。我们对NetworkSettings.Networks.bridge ge.IPAddress属性感兴趣。让我们尝试连接到提供的IP地址http://172.17.0.2:8000(在我的例子中),我们可以看到我们的Web应用程序正在运行!

还可以将端口从docker容器绑定到主机,这样我们就可以访问服务,就像它们在本地运行一样,docker run-d-p3000:8000 webapp。因此,我们的Web应用程序现在可以在http://localhost:3000!上使用。

默认情况下,Docker容器具有自己的存储空间,只要容器在运行,该存储空间就会一直存在。如果我们想要跨容器持久化数据,可以将本地文件/目录绑定到容器,也可以创建并挂载命名的Docker卷。使用Docker卷的额外好处是,它不必是主机文件系统上的资源,也可以是外部云存储服务,具体取决于驱动程序。

这里有一个使用Postgres docker图像和持久数据存储的非常实用的示例。

我们了解了Docker的基本概念,创建了几个容器,运行了一些服务,甚至在机器重新启动时保存了数据!这超过了10分钟,但应该足够和多克一起走了。