Docker教程(一)- 运行Docker镜像、容器隔离

本文章翻译自Docker的官方教程,有兴趣的同学可以上Docker官网进行play-with-docker学习。Docker的安装教程请参考这里(未定义)

本文翻译自Docker官方教程First Alpine Linux Containers,并作出一定的修改及删减以加快上手速度。

Docker教程(一)- 运行Docker镜像、容器隔离


通过这个教程,你会运行一个 容器,了解这个 容器是怎样工作的,并理解 Docker Engine是怎样执行以及怎样隔离每个不同的容器。

这个教程包含以下基本概念:

  • Docker 引擎
  • 容器和镜像
  • Image Registries 和 Docker 商店(即 Docker Hub)
  • 容器隔离

运行你的第一个容器

首先,程序员的最爱:“Hello, world”。运行以下指令:

docker container run hello-world

你会得到:
在这里插入图片描述

注意:如果第一次执行上面的命令的时候,提示“Unable to find image
locally”的话,是正常的,不要方,再执行一次就好了(重现不了,这里就不放图了)。

在你输入上面的指令的时候,首先Docker会尝试在你的本地仓库寻找一个叫hello-world的镜像,因为你之前并没有下载过这个镜像,所以Docker在本地找不到,然后Docker就会去到默认的Docker Registry(即http://store.docker.com)去寻找。找到以后,pull下来,并新建一个容器来运行这个hello-world镜像(latest指的是镜像的版本号tag,如果不指定,默认就是latest)。
在这里插入图片描述

Docker 镜像

现在开始我们需要运行一个 Alpine Linux 的容器(Alpine Linux是一个轻量的 Linux 发行版)。首先,执行以下命令以下载镜像:

sudo docker image pull alpine

Pull 完之后,检查一下本地仓库看是否已经下载成功:

sudo docker image ls

在这里插入图片描述

运行 Docker 容器

镜像下载成功后,开始运行这个容器:

sudo docker container run alpine ls -l

这行命令的意思是,以 alpine 这个镜像,新建并运行一个容器,并在这个容器中,执行 ls -l这个命令。
在这里插入图片描述
在这里插入图片描述现在尝试一下再执行以下命令:

sudo docker container run alpine echo "hello from alpine"

这个命令非常简单,这里就不作解释了。值得关注的是,执行完这个命令后,检查一下当前我们创建了哪些容器:

sudo docker container ls -a

记得要加 -a 选项,否则已经关闭了的容器是不会显示的。
在这里插入图片描述如图可知,我们刚才执行 ls 和执行 echo 是分别创建了两个不同的容器的,而不是新建一个容器,并在这个容器里面执行两条命令。

在这个过程中,你会感受到对比起虚拟机,Docker的运行速度要快得多。这是因为Docker省略了许多虚拟机必须要执行的步骤,例如仿真硬件栈、启动操作系统等。

OK,刚才的例子,我们尝试了新建一个apline容器,然后执行一行命令。根据上面那种做法,这个容器在执行完这个命令之后就会退出,那我能不能让它持续接收并执行我的命令呢?也许你会想到我们可以执行一个sh:

sudo docker container run alpine /bin/sh

执行完这行命令后,你会发现什么都没有发生,这是因为当容器执行完/bin/sh这个命令后,便直接关闭了,并没有给你与它交互的机会。正确的做法是加上 -i-t 两个选项。

sudo docker container run -it alpine /bin/sh

在这里插入图片描述现在你就能看见我们进入了容器的交互模式,并可以不断向容器发送指令。上面指令的-i 表示保持标准输入刘(stdin)对容器开放,-t表示为容器分配一个虚拟的tty。

现在,不要关闭这个终端,新建另外一个终端,执行下面的命令:

sudo docker container ls -a

在这里插入图片描述你会发现,这里有两个执行/bin/sh命令的容器,其中一个的状态是Exited,这个是上面我们没有加-i-t 两个选项时创建的容器。而加-i-t 两个选项所创建的容器,现在还在另外一个终端运行着,所以这个容器的状态是UP

容器隔离

如上面所说,尽管两个容器都是使用alpine来创建的,但是这两个容器是相互独立的,意味着它们拥有不同的文件系统,而且运行在不同的命名空间。默认地,容器之间是不能进行交互的。

先不要关闭上面那个交互式的容器,现在尝试再开一个终端,再次输入下面的命令,再新建一个交互式的容器,然后新建一个文件:

sudo docker container run -it alpine /bin/sh

OK, 现在我们看一下这两个容器的根目录,
在这里插入图片描述
两个容器的根目录是一致的,因为他们都是刚用alpine镜像新建的容器,并未作出任何修改。现在,在其中一个容器的根目录下,新建一个文件叫hello.txt

touch hello.txt

然后在看一下这两个容器根目录下的文件
在这里插入图片描述
可见,hello.txt只存在于执行新建文件指令的那个容器(即下图中的左二的那个alpine容器),并不会影响使用相同镜像所创建的其他容器。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值