Docker
在之前的教程中,我们解释了如何在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