docker 进入容器_【Docker教程】进入docker容器的外壳

664e8981285cdab247d7f43b816c20ca.png

(一)

1.了解Docker映像和容器之间的区别

Docker是用于轻松创建,部署和运行应用程序的工具。它允许我们使用所有依赖关系打包应用程序,并将它们作为单独的分发包分发。Docker保证我们的应用程序将在每个Docker实例上以相同的方式运行。

当我们开始使用Docker时,我们需要明确两个主要概念 - 图像和容器

我们将了解它们是什么以及它们之间的区别。

Java汤姆:一起来探索Java内置功能——Java异步编程​zhuanlan.zhihu.com
125e78c1a44c1d0b0dcd65217c239f1d.png

(上期内容:Java异步编程)

2. Docker镜像

映像是代表打包的应用程序的文件,具有正确运行所需的所有依赖项。换句话说,我们可以说Docker映像就像Java类

图像构建为一系列图层。层被组装在一起。那么,什么是层?简而言之,层就是图像。

假设我们要创建一个Hello World Java应用程序的Docker映像。我们需要考虑的第一件事是我们的应用程序需要什么。

首先,它是一个Java应用程序,因此我们需要一个JVM。好的,这似乎很简单,但是JVM需要运行什么?它需要一个操作系统。因此,我们的Docker映像将具有一个操作系统层,一个JVM和我们的Hello World应用程序

Docker的主要优势在于其庞大的社区。如果要构建映像,可以转到Docker Hub并搜索所需的映像是否可用。

假设我们要使用PostgreSQL数据库创建一个数据库。我们不需要从头开始创建新的PostgreSQL映像。我们只是去Docker Hub,搜索postgres,这是PostgresSQL的Docker官方映像名称,选择我们需要的版本,然后运行它。

我们从Docker Hub创建或提取的每个映像都存储在我们的文件系统中,并通过其名称和标记进行标识。也可以通过其图像ID进行标识

使用docker images命令,我们可以查看文件系统中可用的映像列表:

$ 

3.运行Docker映像

使用带有映像名称和标签的docker run命令运行映像。假设我们要运行postgres 11.6图像:

docker run -d postgres:11.6

注意,我们提供了-d选项。这告诉Docker在后台运行映像-也称为分离模式。

使用docker ps命令,我们可以检查映像是否正在运行,我们应该使用以下命令:

$ 

请注意上面输出中的容器ID。让我们看一下什么是容器以及它与图像的关系。

4. Docker容器

容器是图像的实例。每个容器都可以通过其ID进行标识。回到我们的Java开发类比,我们可以说容器就像类的实例。

Docker为容器定义了七个状态:创建重新启动运行移除暂停退出已死。这一点很重要。由于容器只是图像的一个实例,因此它不需要运行。

现在,让我们再次考虑上面已经看到的run命令。我们已经说过,它是用来运行图像的,但这并不完全准确。事实是,运行命令用于创建启动 图像的新容器。

一大优势是容器就像轻量级的VM。他们的行为是完全相互隔离的。这意味着我们可以运行同一图像的多个容器,使每个容器处于不同的状态,并具有不同的数据和不同的ID。

能够同时运行同一图像的多个容器是一个很大的优势,因为它使我们能够轻松地扩展应用程序。例如,让我们考虑微服务。如果将每个服务打包为Docker映像,则意味着可以根据需要将新服务部署为容器。

5.容器生命周期

之前,我们提到了容器的七个状态,现在,让我们看看如何使用docker命令行工具来处理不同的生命周期状态。

启动新容器需要我们先创建它,然后再启动它。这意味着它必须先经过创建状态,然后才能运行。我们可以通过显式创建和启动容器来做到这一点:

docker 

或者我们可以使用run命令轻松地做到这一点:

docker 

我们可以暂停一个正在运行的容器,然后再次将其置于运行状态:

docker 

当我们检查进程时,已暂停的容器将显示“已暂停”作为状态:

$ 

我们还可以停止正在运行的容器,然后重新运行它:

docker 

最后,我们可以删除一个容器:

docker 

只能删除处于停止或创建状态的容器。

(二)如何进入Docker容器的外壳

1.概述

我们知道Docker是一个易于创建,部署和运行应用程序的强大工具。

那么,可以连接到容器的操作系统吗?答案是:是的,现在我们将学习如何做。

2.连接到现有容器

如果要连接到现有容器,则应该使任何容器处于运行状态。为此,我们必须使用docker ps命令检查系统中的容器状态:

$ 

由于我们没有正在运行的容器,因此我们以启动RabbitMQ容器为例:

$ 

启动容器后,我们将从另一个对docker ps的调用中看到它:

$ 

现在连接到这个容器就像执行一样简单:

$ 

至此,我们在容器内部有了一个交互式shell:

  • docker exec告诉Docker我们要在正在运行的容器中执行命令
  • -IT说法意味着它将在交互模式下执行-它使STIN开放
  • b7a9f5eb6b85是容器ID
  • sh是我们要执行的命令

让我们探索一下我们新创建的容器的操作系统:

$ 

它似乎是仿生海狸Ubuntu。如果检查RabbitMQ Dockerfile中的FROM指令,我们将意识到该映像是使用Ubuntu 18.04构建的。

我们可以使用exit命令或仅按CTRL + d与容器断开连接。

这个例子很简单,因为当我们启动RabbitMQ容器时,它一直运行直到停止它。另一方面,有时我们必须处理无法存活的容器,例如操作系统容器。

3.以交互模式运行容器

如果我们尝试启动一个新的操作系统容器,例如一个18.04 Ubuntu,我们将发现它并没有存活:

$ 

RabbitMQ容器仍在运行时,Ubuntu容器已停止。因此,我们无法使用docker exec命令连接到此容器。

避免这种情况的一种方法是以交互方式运行此容器:

$ 

因此,既然我们位于容器内,就可以检查外壳类型:

$ 

实际上,当我们以交互方式启动容器时,使用–rm参数很方便。退出时,请确保删除容器:

$ 

4.保持容器运行

有时,我们会遇到一些奇怪的情况,需要启动并连接到容器,但是交互模式不起作用。

如果我们遇到这些情况之一,可能是因为出了点问题,应予以纠正。

但是,如果需要快速解决方法,可以在容器中运行tail命令:

$ 

使用此命令,我们将以分离/后台方式(-d)启动一个新容器,并在容器内执行tail -f / dev / null命令。结果,这将迫使我们的容器永远运行。

现在,我们只需要使用docker exec命令以以前看到的相同方式进行连接:

$ 

请记住,这是一种解决方法,应仅在开发环境中使用。

5.结论

在本教程中,我们已经看到了如何连接到正在运行的容器的外壳,以及如何以交互方式启动容器。

6.最后

欢迎大家讨论,喜欢的话可以关注点赞转发,以后会持续为大家更新优质内容,感谢支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值