docker适合初学者吗_Docker初学者指南

拓拔嘉运
2023-12-01

docker适合初学者吗

不管是钢琴还是泰迪熊,容器都可以提供制造商和运输商可以依赖的一致性。 就像运输集装箱彻底改变了进出口行业一样,您已经听说Docker在技术上也做同样的事情。

由于具有相关性和可识别性的用例,它像野火一样扑朔迷离,任何人都非常容易使用。

了解Docker

容器是提供开发人员和运营人员可以依赖的相同一致性的一种方式。 Docker使用容器作为隔离一个或多个进程的一种方式。 主机上的进程(PID)需要内存,CPU,网络访问和磁盘访问。 应用程序需要一个微妙的环境才能运行。 这包括特定的可执行文件,特定的库和特定的标准C库(libc)。 显然,内核是其中许多组件的背后,但是就PID而言,这些资源通常是理所当然的,并且通过libc对内核的访问是抽象的。

有多种方法可以为PID设置环境。 如果需要libc的备用版本,则更改根目录(chroot)是基本选项。 如果需要限制内存,则内核控制组(cgroup)是功能越来越丰富的选项。 虚拟机(VM)可能是答案,但这引入了虚拟机管理程序以封装所包含的运行时的整体,以及需要整个初始化/引导才能使计算机可用。 如果所需的PID仅用于工作或任务,则VM可能是资源昂贵的路由。 要改变根的感觉,并使用cgroups,隔离和易于共享的根文件系统,请转向Docker。 它实现了所有这些,同时还提供了一种编程方式来创建新的根文件系统!

Dotcloud,Inc.的开发人员于2013年1月开始在Docker上工作,同年3月公开发布。 在创建Docker之前,Dotcloud一直是平台即服务(PaaS),因此像Docker这样的工具允许在任何地方构建PaaS环境对于他们来说是非常合理的下一步。 Docker的GitHub页面反映了自公开发布以来的狂热。 在短短的一年内,该项目吸引了500多个贡献者,而不到10位是Docker的员工。 对于婴儿开源项目来说,有70多个版本,13,000 +个星星和2,000+个叉子是一项了不起的活动。 2014年6月, 正值第一个首届DockerCon时 ,Docker发布了1.0.0版本,该版本具有运行linux-amd64容器的稳定性和生产就绪性。

Docker的受众是开发人员和系统管理员,他们专注于应对他们面临的挑战。 开发人员和系统管理员非常熟悉这些问题,以至于它们逐渐成为日常工作。

发展的困境可能是:

  • 遍历新版本时保持一致的环境
  • 文档,以便其他人可以像您已经知道的那样使用您的代码
  • 安装依赖软件而不会与主机版本冲突
  • 一致的测试环境
  • 负责任的数据和可追溯的存储

操作的麻烦可能是:

  • 被监控软件的正确文档
  • 处理微观管理和资源配额
  • 应用需求的网络配置
  • 负责任的数据和可追溯的存储

通过具有标准化的图像格式,开发人员可以看到所有服务器相​​同,而操作可以看到所有容器相同。 这些是Docker直接解决的问题。 首先必须区分Docker环境中“映像”和“容器”的使用。

一个图像

可移植:可以将它们推送到注册表,或另存为tar存档。

分层:生成图像的步骤是分层添加的。 这样,除了最后几个步骤外,几乎相同的映像可以通过共享父层来减少磁盘使用。

静态:除非更改新图像,否则内容不可更改。

一个容器

运行时:PID的环境。

可写:本质上是临时存储。

分层的:它在图像上。

这些术语将在各种情况下显示,重要的是要了解它们之间的关系,但它们也是它们自己的实体。 在此基础上,是时候探索其基本Docker应用程序和功能了。

码头工人101

$> docker run busybox echo 'Hello, World!'
Hello, World!

让我们打开这个简单的例子。 首先,命令是`run` ,并告诉`run` ”“ busybox”映像。 如果图像'busybox'不存在,则docker将尝试从公共Docker集线器中获取名为'busybox'的图像。 然后Docker设置该映像的层,该容器环境的所有cgroup和名称空间,并执行`echo 'Hello, World!'`

$> docker pull fedora

这是从公共Docker集线器中获取名为“ fedora”的映像的直接方法。

$> docker images

这显示了本地可用的图像。 像这样的更多码头工人命令。 要查看所有内容,请参阅`docker help` 。 可以交互运行docker映像,然后决定稍后将该容器作为映像提交,以备将来使用。


    
    
$ > $ docker run fedora touch file
$ > docker ps -l
CONTAINER ID  IMAGE      COMMAND     CREATED  STATUS          NAMES
9626763a35f9  fedora: 20   touch file  6s ago   Exited ( 0 ) 3s   prickly_goldstine
$ > docker commit 9626763a35f9 my-touched-file
$ > docker run my-touched-file ls -s / file
0 / file

对于以编程方式提交新映像的方式,有“ Dockerfile”格式。 Dockerfile是包含准备映像的步骤的文件。 乍一看,它看起来像是带有少量元数据的shell脚本。


    
    
FROM fedora
RUN yum install -y mongodb-server && mkdir -p / data / db
EXPOSE 27017
VOLUME [ "/data/db" ?? ]
CMD mongod

我们在“ fedora”映像上构建,运行一个shell命令以安装软件并创建目录,然后声明一个要发布的端口,并在其中存储目录。最后,我们声明该容器的运行时要执行的命令(例如“ mongod”)。

根据这些说明,在名为“ Dockerfile”的文件中运行:

$> docker build -t mongodb .

步骤的所有输出都是可见的,一旦成功完成,将提供“ mongodb”映像。

运行服务容器使用这个由Dockerfile构建的新的“ mongodb”映像,启动它并进行检查。

 $ > docker run -it -p 127.0.0.1: 27017 : 27017 -v $ ( pwd ) / db: / data / db mongodb 

mongodb服务器将启动并预分配所需的文件。

这是自“ Hello,World!”以来新标记的说明。 例:

  • `-it`连接终端,以便<ctrl> + c可以终止附加的进程。
  • `-p 127.0.0.1:27017:27017`将容器内的端口27017连接到主机上的127.0.0.1:27017
  • `-v $(pwd)/db:/data/db`将容器中的'/ data / db'卷挂载到主机上的$(pwd)/ db。

现在,在运行mongodb容器的情况下,在另一个终端中运行以下命令:


    
    
$ > docker ps
CONTAINER ID  IMAGE          COMMAND             CREATED  
cb5346e10a69  mongodb:latest / bin / sh -c mongod   2min ago

STATUS        PORTS                    NAMES
Up 2min   127.0.0.1: 27017 - > 27017 / tcp   hopeful_torvalds    

出现在“ mongodb”映像上运行的容器的运行时信息。 要结束此过程,请<ctrl> + c原始容器,或`docker kill cb5346e10a69`该容器。 由于该临时容器写入的唯一数据位于/ data / db目录中,该目录已挂载到主机目录中,因此即使重新加载了该新的`docker run`本身就是干净的。

本地分享

除了前面提到的Docker镜像公共注册表Docker Hub之外,还有Docker Registry ,它可以托管本地Docker镜像。 尽管许多Linux发行版都打包了docker-registry,但使用docker本身运行Docker注册表更容易。


    
    
$ > docker run -d -p 5000 : 5000 -v $ ( pwd ) / registry-data: / tmp registry:latest

现在我们有了一个本地服务,可以将Docker映像推入和拉出。 由于该服务正在侦听主机的“ 0.0.0.0”,因此需要使用主机的IP地址或DNS名称标记图像。 建议使用DNS名称,因此不需要为新IP地址重新标记本地docker映像。

要使用此本地注册表,图像需要将其包含在图像名称中。 这可以在`docker build` ”时设置,或者可以这样标记。 假设DNS名称为“ image-storage.local.lan”(这是完全任意的),它指向主机的IP地址,请运行:


    
    
$ > docker tag mongodb image-storage.local.lan: 5000 / mongodb
$ > docker push image-storage.local.lan: 5000 / mongodb

现在,本地网络上的其他人都可以通过引用此新的标记名称来拉出并运行该映像。

一致的开发人员环境

许多Docker用例都围绕生产服务和可伸缩性,但更相关的用例是开发人员的环境。 Docker映像的可用性可以创建遗留代码,当前代码和最新代码所需的环境。 现在,无需VM虚拟机管理程序,也无需通过网络访问“具有正确版本的构建机”。 此外,一旦准备好这些开发映像并在本地注册表上共享,那么任何能够运行映像的机器都将成为可能的工作站。

就像前面提到的分层一样,可以将以下Dockerfile拆分为一个公共基础映像,然后允许为最后的步骤构建单个用户名。


    
    
FROM fedora: 20

# setup and install common tools
RUN yum groupinstall -y "Development tools" ??
RUN yum install -y vim-enhanced git
CMD bash -l

# this part could be per-user
RUN useradd -m -u 1000 vbatts
ENV HOME / home / vbatts
WORKDIR / home / vbatts
USER vbatts

构建它,并将其标记为本地注册表:


    
    
$ > docker build -t image-storage.local.lan: 5000 / $USER / devel:f20 .
[ ... ]
$ > docker push image-storage.local.lan: 5000 / $USER / devel:f20

现在使用此构建。 该开发映像使主机可以将源代码和主目录保持原样,同时在活动的shell周围移植此标准化的开发映像。


    
    
function devel ( ) {
        docker run \
        --rm \
        -it \
        --hostname =$ ( hostname ) -devel \
        -v $HOME : $HOME \
        -v $SSH_AUTH_SOCK : $SSH_AUTH_SOCK \
        --env SSH_AUTH_SOCK \
        --env PATH = / usr / local / bin: / usr / local / sbin: / usr / bin: / usr / sbin: / bin: / sbin \
        --workdir $ ( pwd ) \
        ${1+"$@"} \
        image-storage.local.lan: 5000 / $USER / devel:f20
}

这是`~/.bashrc`的bash函数。 这定义了一个名为`devel`的函数,它将进入刚刚构建的开发映像的bash shell。

这是传递给`docker run`的所有标志的`docker run`

  • `--rm`这部分管家在外壳退出后将容器`--rm`
  • `-it`是一个交互式的附加终端
  • `--hostname=$(hostname)-devel`设置容器内的主机名,但附加'devel'以帮助区分
  • `-v $HOME:$HOME`当前主目录安装到容器内的相同目录
  • `-v $SSH_AUTH_SOCK:$SSH_AUTH_SOCK`在容器内安装一个活动的ssh代理套接字
  • `--env SSH_AUTH_SOCK`传递ssh代理环境变量
  • `--env PATH=...`清理PATH板岩
  • `--workdir $(pwd)`在与当前工作目录相同的目录中启动bash shell(例如〜/ src / my / big / project /)
  • `${1+"$@"}`在函数`devel`添加了附加标志

    
    
vbatts @ noyee ~ $ > cd src / my / big / project
vbatts @ noyee ~ / src / my / big / project
$ > devel
vbatts @ noyee-devel ~ / src / my / big / project $ > make
[ ... ]

这样可以保持无缝的体验,而不必担心仅使用特定项目所需的工具和库来使主机混乱或混乱。

CI /测试

使用持续集成(CI)可以为构建和测试软件提供引擎。 构建Dockerfile可以将其包装为一个动作,如果成功,则留下可用的映像。


    
    
[ ... ]
RUN cd / src / myapp && git pull --force origin master && \
 autoreconf && \
 . / configure && \
  make
RUN cd / src / myapp && \
  make test

如果Dockerfile中的任何内容退出非零值,则构建映像失败。 此外,通过从基础映像构建Dockerfile,并能够自定义其自身的环境,可以减轻共享构建主机上的构建要求,版本冲突以及各种复杂性。

通过这些示例,可以识别许多日常用例。 不难看出为什么这项技术在从开发到生产的生命周期中引起了人们的关注。 虽然是底层构建块,但它同时正在革新计算环境的编排。 加入对话,并帮助培养Docker正在发展的容器生态系统。

翻译自: https://opensource.com/business/14/7/guide-docker

docker适合初学者吗

 类似资料: