玩转容器Docker教程_第1页
玩转容器Docker教程_第2页
玩转容器Docker教程_第3页
玩转容器Docker教程_第4页
玩转容器Docker教程_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

玩转容器Docker教程

目录1. Docker与虚拟机 32. 运行你的容器 43. 在容器内运行进程 64. 运行一个随机引用容器 85. 停止和启动容器 116. 如何获得容器ID 127. 移除容器 13

Docker对软件开发生命周期产生了巨大影响,使得大规模软件部署变得简单而且安全。这个教程将介绍运行、启动、停止和删除Docker容器的基础知识。

Docker使得在不同的操作系统上使用不同的编程语言很容易,而所有这些都在同一主机上实现。

在Docker之后部署你的软件变得更加容易,你不必担心错过系统配置或先决条件。Docker与虚拟机如果你正使用虚拟运行你的软件,为什么还需要Docker来取代呢?

它们之间的主要区别在于Docker是一个在你的本机操作系统中运行的独立进程,而虚拟机是一个完整的隔离操作系统,它在主机操作系统之上运行,需要更多时间来加载。所以Docker比虚拟机有更多优势,例如:

加载速度与虚拟机不同,所需的硬件资源很少。在同一操作系统上同时运行多个Docker容器。你可以修改容器并对其进行部署,或将Docker文件定义提供给朋友,以便在同一环境中工作。实际上,Docker不是虚拟机的替代品,而是解决特定问题。

假设你的应用程序需要3个或更多在不同操作系统上运行的服务,那么你可以在同一主机上平稳运行3个容器,而不是在同一主机上运行3个虚拟机。听起来很棒!运行你的容器在开始之前,请确保已正确安装Docker并准备好接受命令。在新的终端窗口中键入以下命令:

$

docker

-v

以上命令输出PC上安装的Docker版本:

Docker

version

17.12.0-ce-rc2,

build

f9cde63

是时候开始运行容器了:

$

docker

container

run

alpine

echo

"Hello

World"

当您第一次运行上述命令时,你应该在终端窗口中看到与此类似的输出:

Unable

to

find

image

'alpine:latest'

locally

latest:

Pulling

from

library/alpine

2fdfe1cd78c2:

Pull

complete

Digest:

sha256:ccba511b...

Status:

Downloaded

newer

image

for

alpine:latest

Hello

World

这很容易,不是吗?尝试再次运行相同的命令:$

docker

container

run

alpine

echo

"Hello

World"运行上述命令的第二,第三或第n次,你应该只在终端中看到此输出:

Hello

World

现在你已成功运行容器,现在是时候分析究竟发生了什么。查看以下命令:

$

docker

container

run

alpine

echo

"Hello

World"

该命令包含多个部分。首先,你有“docker”这个词。这是Docker命令行界面(CLI)的名称,用于与负责运行容器的Docker引擎进行交互。

接下来,您有单词“container”,它表示你正在使用的上下文。

再下一步是实际要执行的命令run。

现在,还需要告诉Docker运行哪个容器。在这里,运行的是alpine容器。

最后,需要定义在容器运行时,应在容器内执行的进程或任务类型。这是命令的最后一部分,echo"HelloWorld"。在容器内运行进程既然已经了解了运行容器的命令的各个部分,请尝试在另一个容器中运行不同的进程:

$

docker

container

run

centos

ping

-c

5

输出如下:

Unable

to

find

image

'centos:latest'

locally

latest:

Pulling

from

library/centos

85432449fd0f:

Pull

complete

Digest:

sha256:3b1a65e9a05...

Status:

Downloaded

newer

image

for

centos:latest

PING

()

56(84)

bytes

of

data.

64

bytes

from

:

icmp_seq=1

ttl=64

time=0.022

ms

64

bytes

from

:

icmp_seq=2

ttl=64

time=0.019

ms

64

bytes

from

:

icmp_seq=3

ttl=64

time=0.029

ms

64

bytes

from

:

icmp_seq=4

ttl=64

time=0.030

ms

64

bytes

from

:

icmp_seq=5

ttl=64

time=0.029

ms

ping

statistics

5

packets

transmitted,

5

received,

0%

packet

loss,

time

4103ms

在前面的示例中,使用的容器镜像是CentOS,并且在CentOS容器内执行的进程是ping-c5,它将环回地址ping五次直到它停止。

第一行如下:

Unable

to

find

image

'centos:latest'

locally

这告诉你Docker没有在系统的本地缓存中找到名为centos:latest的镜像。因此,Docker知道它必须从存储容器的某个镜像源中提。

默认情况下,Docker环境配置为从的DockerHub中提取镜像。这由第二行表示如下:latest:

Pulling

from

library/centos接下来的三行输出如下:

85432449fd0f:

Pull

completeDigest:

sha256:3b1a65e9a05...Status:

这告诉您Docker已成功从DockerHub中提取了镜像centos:latest。

后续的输出都是由容器内运行的进程生成的,这里运行的是ping工具。

你可能还注意到latest这个关键字出现了几次。每个映像都有一个版本(也称为标记),如果没有明确指定版本,则Docker会自动其视为最新版本。

如果在系统上再次运行这个容器,将不会输出之前的五行,因为Docker将在本地缓存容器映像,因此不必先下载它。试试是不是这样。运行一个随机引用容器为了运行随机语句容器,需要一个生成随机语句的算法。可以在此处[1]找到生成这些随机语句的API。

现在的目标是要在容器内运行一个进程,每5秒生成一条随机语句,并且输出到STDOUT:while

:

do

wget

-qO-

/api/quotes/random

printf

'n'

sleep

5

done按Ctrl+C停止脚本。这是输出:{"quote":"Martha

Stewart

is

extremely

talented.

Her

designs

are

picture

perfect.

Our

philosophy

is

life

is

messy,

and

rather

than

being

afraid

of

those

messes

we

design

products

that

work

the

way

we

live.","author":"Kathy

Ireland","cat":"design"}{"quote":"We

can

reach

our

potential,

but

to

do

so,

we

must

reach

within

ourselves.

We

must

summon

the

strength,

the

will,

and

the

faith

to

move

forward

-

to

be

bold

-

to

invest

in

our

future.","author":"John

Hoeven","cat":"faith"}每个响应都是一个JSON格式的字符串,包含引号,作者及其类别。

现在,让这个容器后台运行。为此,需要将前面的脚本缩成一行,并使用/bin/sh-c“…”来执行。Docker的表达式如下:

$

docker

container

run

-d

--name

quotes

alpine

\

/bin/sh

-c

"while

:;

do

wget

-qO-

/api/quotes/random;

printf

'\n';

sleep

5;

done"

上面的表达式,你使用了两个命令行参数,-d和--name。-d告诉Docker以一个Linux守护进程的方式运行容器。-name参数用于为容器指定显式名称。

如果您未指定显式容器名称,Docker将自动为容器分配一个随机但唯一的名称。这个名字将由一位着名科学家的名字和一个形容词组成。

诸如,“boring_borg”或“angry_goldberg”。相当幽默,不是吗?

一个重要的方面是容器名称必须是唯一的。确保引号容器已启动并正在运行:

$

docker

container

ls

-l

前面输出的重要部分是STATUS列,此例中,它显示UP16seconds。这意味着容器已经启动并运行了16秒。

随着时间的推移继续运行容器,你的系统也许会产生很多容器。要查找主机上当前正在运行的容器,可以使用containerls命令,如下所示:

$

docker

container

ls

这将列出所有当前运行的容器。

默认情况下,Docker输出七列,含义如下:

列描述ContainerID唯一的容器ID。它是SHA-256.Image所以用的镜像Status容器的状态(created,restarting,running,removing,paused,exited,ordead)Ports映射到宿主机的端口Names分配到容器的名字(可以是多个名字的)如果要列出系统上定义的所有容器,可以使用命令行参数-a或-all,如下所示:

$

docker

container

ls

-a

这将列出任何状态的容器,无论是创建,运行还是退出。

有时,可能只想列出所有容器的ID。为此,你有-q参数:

$

docker

container

ls

-q

你可能想知道这有什么用。这里有个例子:

$

docker

container

rm

-f

$(docker

container

ls

-a

-q)

上面的命令删除当前在系统上定义的所有容器,包括已停止的容器。rm命令代表删除,将在本教程中进一步解释。

在上一节中,您在list命令中使用了-l参数。尝试使用Docker帮助找出-l参数代表什么。您可以为list命令调用help,如下所示:

$

docker

container

ls

-h

停止和启动容器有时,你可能需要暂时停止正在运行的容器。试试以下这个容器:

$

docker

container

run

-d

--name

quotes

alpine

\

/bin/sh

-c

"while

:;

do

wget

-qO-

/api/quotes/random;

printf

'\n';

sleep

5;

done"

现在,你可以使用以下命令停止此容器:$

docker

container

stop

quotes当你尝试暂停容器时,可能会注意到它需要一段时间(大约10秒)才能执行完成。为什么会这样?Docker将LinuxSIGTERM信号发送到容器内运行的主进程。

在上面的命令中,容器的名称用于指定要停止的容器。也可以使用容器ID。如何获得容器ID有几种方法可以做到这一点。手动方法是列出所有正在运行的容器,并在列表中找到您要查找的容器。只需从那里复制其ID。

更自动化的方法是使用shell脚本和环境变量。例如,如果要获取引号容器的ID,这是一个示例:

$

export

CONTAINER_ID

=

$(docker

container

ls

|

grep

quotes

|

awk

'{print

$1}')

这里我们使用AWK获取第一个字段,即容器ID。现在,您可以在表达式中使用$CONTAINER_ID变量,而不是使用容器名称:

$

docker

container

stop

$CONTAINER_ID

一旦停止容器后,其状态将更改为“已退出”。

你可以使用dockercontainerstart命令重新启动已停止的容器。移除容器运行do

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论