Docker

时间:2020-03-21 11:43:55  来源:igfitidea点击:

在之前的教程中,我们解释了如何在Ubuntu中安装Docker,以及如何在CentOS中安装Docker。

今天,我们将看到Docker的基本用法。
本教程介绍了Docker基础知识,例如如何创建新容器,如何运行容器,移除容器,如何从Container生成自己的Docker镜像等等。
让我们开始吧!下面给出的所有步骤均已在Ubuntu 18.04 LTS服务器版本中进行了测试。

Docker入门

在探索Docker基础知识之前,请不要与Docker镜像和Docker容器混淆。
正如我在上一教程中已经解释的那样,Docker Image是决定Container行为方式的文件,而Docker Container是Docker镜像的运行或者停止阶段。

1.搜索Docker镜像

我们可以从注册表(例如Docker Hub)中获取镜像,也可以创建自己的镜像。
对于那些想知道的人来说,Docker Hub是云托管的地方,所有Docker用户都可以其中构建,测试和保存其Docker镜像。

Docker Hub具有数以万计的Docker镜像。
我们可以使用“ docker search”命令搜索任何Docker镜像。

例如,要搜索基于Ubuntu的Docker镜像,请运行:

$sudo docker search ubuntu

输出示例:

要基于CentOS搜索图像,请运行:

$sudo docker search ubuntu

要为AWS搜索图像,请运行:

$sudo docker search aws

对于wordpress:

$sudo docker search wordpress

Docker集线器几乎拥有所有类型的镜像。
无论是操作系统,应用程序还是其他任何东西,我们都可以在Docker Hub中找到预构建的Docker镜像。
如果我们要查找的内容不可用,则可以对其进行构建并将其提供给公众,也可以将其私有化以供我们自己使用。

2.下载Docker镜像

要下载适用于Ubuntu OS的Docker镜像,请在终端上运行以下命令:

$sudo docker pull ubuntu

上面的命令将从Docker Hub下载最新的Ubuntu镜像。

输出示例:

Using default tag: latest
latest: Pulling from library/ubuntu
6abc03819f3e: Pull complete 
05731e63f211: Pull complete 
0bd67c50d6be: Pull complete 
Digest: sha256:f08638ec7ddc90065187e7eabdfac3c96e5ff0f6b2f1762cf31a4f49b53000a5
Status: Downloaded newer image for ubuntu:latest

我们还可以使用以下命令下载特定版本的Ubuntu镜像:

$docker pull ubuntu:18.04

Docker允许我们下载任何图像并启动容器,而不管主机操作系统如何。

例如,要下载CentOS镜像,请运行:

$sudo docker pull centos

所有下载的Docker镜像将保存在/var/lib/docker /目录中。

要查看已下载的Docker镜像的列表,请运行:

$sudo docker images

输出示例:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              7698f282e524        14 hours ago        69.9MB
centos              latest              9f38484d220f        2 months ago        202MB
hello-world         latest              fce289e99eb9        4 months ago        1.84kB

如我们在上面看到的,我已经下载了三个Docker镜像Ubuntu,CentOS和hello-world。

现在,让我们继续前进,看看如何根据下载的图像启动或者运行容器。

3.运行Docker容器

我们可以通过两种方法启动容器。
我们可以使用其TAG或者IMAGE ID启动容器。
TAG是指图像的特定快照,而IMAGE ID是该图像的相应唯一标识符。

如我们在上述结果中,“最新”是所有容器的TAG,而7698f282e524是Ubuntu Docker镜像的IMAGE ID,9f38484d220f是CentOS Docker镜像的镜像ID,而fce289e99eb9是hello_world Docker镜像的镜像ID。

下载了所选的Docker镜像后,运行以下命令以使用其TAG启动Docker容器。

$sudo docker run -t -i ubuntu:latest /bin/bash

其中

  • -t:在Ubuntu容器内分配一个新的Terminal。
  • -i:允许我们通过抓住容器的(STDIN)中的标准来进行交互式连接。
  • ubuntu:latest:带有标签“ latest”的Ubuntu容器。
    -/bin/bash:新容器的BASH shell。

或者,我们可以使用IMAGE ID启动容器,如下所示:

sudo docker run -t -i 7698f282e524 /bin/bash

其中

  • 7698f282e524-图片ID

启动容器后,我们将自动进入容器的shell(命令提示符):

要返回到主机系统的终端(在我的情况下是Ubuntu 18.04 LTS)而不终止Container(来宾os),请按CTRL + P,然后按CTRL + Q。
现在,我们可以安全地返回到原始主机的终端窗口。
请注意,该容器仍在后台运行,我们尚未终止它。

要查看容器的列表运行,请运行以下命令:

$sudo docker ps

输出示例:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
32fc32ad0d54        ubuntu:latest       "/bin/bash"         7 minutes ago       Up 7 minutes                            modest_jones

其中

  • 32fc32ad0d54-容器ID
  • ubuntu:latest-Docker镜像

请注意,容器ID和Docker镜像ID是不同的。

列出所有可用的(正在运行或者已停止)容器:

$sudo docker ps -a

要从主机的shell停止(关闭容器电源),请运行以下命令:

$sudo docker stop <container-id>

例子:

$sudo docker stop 32fc32ad0d54

要登录回或者添加到正在运行的容器,只需运行:

$sudo docker attach 32fc32ad0d54

如我们所知,32fc32ad0d54是容器的ID。

通过键入以下命令从其shell内部关闭容器电源:

# exit

我们可以使用以下命令验证正在运行的容器的列表:

$sudo docker ps

4.构建自定义Docker镜像

Docker不仅用于下载和使用现有容器。
我们也可以创建自己的自定义docker镜像。

为此,请启动任何一个已下载的容器:

$sudo docker run -t -i ubuntu:latest /bin/bash

现在,我们将进入容器的shell。

然后,安装任何软件或者在容器中进行任何我们想做的事情。

例如,让我们在容器中安装Apache Web服务器。

完成所有调整后,安装了所有必要的软件,请运行以下命令来构建自定义Docker镜像:

# apt update
# apt install apache2

同样,在容器中安装并测试我们选择的任何软件。

完成所有设置后,返回到主机系统的shell程序。
不要停止或者关闭容器电源。
要在不停止Container的情况下切换到主机系统的Shell,请按CTRL + P,然后按CTRL + Q。

在主机的shell程序中,运行以下命令以找到容器ID:

$sudo docker ps

最后,使用以下命令创建正在运行的Container的Docker镜像:

$sudo docker commit 3d24b3de0bfc theitroad/ubuntu_apache

输出示例:

sha256:ce5aa74a48f1e01ea312165887d30691a59caa0d99a2a4aa5116ae124f02f962

其中

  • 3d24b3de0bfc – Ubuntu容器ID。如我们所愿,我们可以
  • theitroad –创建容器的用户名。
  • ubuntu_apache –用户theitroad创建的docker镜像的名称。

让我们用命令检查是否创建了新的Docker镜像:

$sudo docker images

输出示例:

REPOSITORY                TAG                 IMAGE ID            CREATED              SIZE
theitroad/ubuntu_apache   latest              ce5aa74a48f1        About a minute ago   191MB
ubuntu                    latest              7698f282e524        15 hours ago         69.9MB
centos                    latest              9f38484d220f        2 months ago         202MB
hello-world               latest              fce289e99eb9        4 months ago         1.84kB

如我们在上面的输出中看到的,新的Docker镜像是从运行的Container在我们的localhost系统中创建的。

现在,我们可以像通常使用su命令一样,从新创建的Docker镜像创建一个新的Container:

$sudo docker run -t -i theitroad/ubuntu_apache /bin/bash

5.移走容器

使用Docker容器完成所有研发之后,如果我们不再想要它们,可以将其删除。

为此,首先,我们必须停止(关闭)正在运行的容器。

让我们用命令找出正在运行的容器:

$sudo docker ps

输出示例:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d24b3de0bfc ubuntu:latest "/bin/bash" 28 minutes ago Up 28 minutes goofy_easley

通过使用其ID停止正在运行的容器:

$sudo docker stop 3d24b3de0bfc

现在,使用以下命令删除容器:

$sudo docker rm 3d24b3de0bfc

同样,停止所有容器,并在不再需要时将其删除。

一个接一个地删除多个容器可能是一个繁琐的任务。
因此,我们可以一次性删除所有已停止的容器,只需运行:

$sudo docker container prune

键入“ Y”,然后按Enter键以删除容器。

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
32fc32ad0d5445f2dfd0d46121251c7b5a2aea06bb22588fb2594ddbe46e6564
5ec614e0302061469ece212f0dba303c8fe99889389749e6220fe891997f38d0
Total reclaimed space: 5B

该命令仅适用于最新的Docker版本。

6.删除Docker镜像

删除容器后,我们可以删除不再需要的Docker镜像。

要找到已下载的Docker镜像的列表,请执行以下操作:

$sudo docker images

输出示例:

REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
theitroad/ubuntu_apache   latest              ce5aa74a48f1        5 minutes ago       191MB
ubuntu                    latest              7698f282e524        15 hours ago        69.9MB
centos                    latest              9f38484d220f        2 months ago        202MB
hello-world               latest              fce289e99eb9        4 months ago        1.84kB

如我们在上面看到的,我们的主机系统中有三个Docker镜像。

让我们使用它们的IMAGE ID删除它们:

$sudo docker rmi ce5aa74a48f1

输出示例:

Untagged: theitroad/ubuntu_apache:latest
Deleted: sha256:ce5aa74a48f1e01ea312165887d30691a59caa0d99a2a4aa5116ae124f02f962
Deleted: sha256:d21c926f11a64b811dc75391bbe0191b50b8fe142419f7616b3cee70229f14cd

故障排除

如果任何正在运行或者已停止的容器使用Docker镜像,则Docker不允许我们删除它们。

例如,当我尝试从旧的Ubuntu服务器之一删除ID为b72889fa879c的Docker镜像时。
我收到以下错误:

Error response from daemon: conflict: unable to delete b72889fa879c (must be forced) - image is being used by stopped container dde4dd285377

这是因为我们要删除的Docker镜像当前正在由另一个Container使用。

因此,让我们使用以下命令检查正在运行的Container:

$sudo docker ps

输出示例:

糟糕!没有正在运行的容器。

让我们再次使用命令检查所有容器(正在运行和已停止):

$sudo docker ps -a

输出示例:

如我们所见,仍然有一些停止的容器正在使用Docker镜像之一。
因此,让我们删除所有容器。

例子:

$sudo docker rm 12e892156219

同样,使用各自的容器ID删除所有如上所述的容器。

删除所有容器后,最后删除Docker镜像。

例子:

$sudo docker rmi b72889fa879c

让我们使用以下命令验证主机中是否还有其他Docker镜像:

$sudo docker images