Linux系统Docker使用指北

Linux系统Docker使用指北


工具名称: Docker

要求掌握程度:熟练掌握


写在前面

本文为一位不知名 Cpper 学习Docker容器的学习笔记,不谈原理,只谈使用方法,不喜勿喷。
记录自己的学习过程,与自己赛跑,永远在路上。
如有遗漏或者错误,请评论区理性交流、指正。别杠我,杠就是你对。


什么是 Docker 镜像和 Docker 容器?

在开始 Docker 之前,我先说明一下 Docker 镜像和 Docker 容器是什么。

Docker 镜像是一个描述容器如何运行的的文件,Docker 容器是 Docker 镜像在运行或被终止时的一个阶段。

容器和主机上的其他文件是隔离的。

当我们运行一个 Docker 容器的时候,它会使用一个被隔离出来的文件系统,这个文件系统是由一个 Docker 镜像提供的。Docker 镜像包含了运行应用程序所需要的一切东西 - 所有的依赖、配置、脚本、二进制文件等等。

镜像也包含容器所需要的其他配置项,比如说环境变量、默认运行的命令,以及其他元数据。

Docker 优点:

  • 快速、一致地交付您的应用程序
  • 响应式部署和扩展
  • 轻巧快速,可以在同一硬件上运行更多工作负载

Docker新手入门

1.Linux Docker安装、卸载

这里仅介绍 Ubuntu Docker 安装,更多安装方法可参考:Docker菜鸟教程

直接官方安装 shell 脚本自动安装,大佬想手动安装请随意,具体参考上面的菜鸟教程链接。

curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh

如果要使用 Docker 作为非 root 用户,则应考虑使用类似以下方式将用户添加到 docker 组:

sudo usermod -aG docker your-user

删除安装包:

sudo apt-get purge docker-ce

删除镜像、容器、配置文件等内容:

sudo rm -rf /var/lib/docker

2.Docker镜像加速

国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

  • 科大镜像:https://docker.mirrors.ustc.edu.cn/
  • 网易:https://hub-mirror.c.163.com/
  • 阿里云:https://<你的ID>.mirror.aliyuncs.com
  • 七牛云加速器:https://reg-mirror.qiniu.com

其中,阿里云需要自己去官网注册id,不是很推荐。

对于 Ubuntu 16.04+的用户,打开 /etc/docker/daemon.json 写入以下内容(如果文件不存在就新建该文件):

{
    "registry-mirrors":[
			"https://docker.mirrors.ustc.edu.cn/",
			"https://hub-mirror.c.163.com/",
			"https://reg-mirror.qiniu.com"
	]
}

Image
图-1 Docker文件配置

重启服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

检查加速器是否生效:

手动检查加速器配置是否生效,在命令行执行 docker info,如果从结果中看到了如下内容,说明配置成功。

docker info

Image
图-2 检查加速是否生效

3.搜索Docker镜像

我们可以从叫做 Docker hub 的 Docker 官方库获得镜像,或者我们也可以制作自己的镜像。

有些人可能不清楚,Docker hub 是一个线上的中心化仓库,Docker 用户们在上面构建、测试、然后保存他们的 Docker 镜像。Docker hub 有数以万计的 Docker 镜像,而且这个数字还在每天增长。

你可以从命令行通过 docker search 命令搜索任意 Docker 镜像。

比如需要搜索基于Ubuntu的镜像时,输入以下指令:

sudo docker search ubuntu

你会得到这样的结果:

Image 图-3 搜索ubuntu结果

如果你想搜索其他任意的应用,比如 Nginx,只需要在docker search后面添加对应的名称就可以:

sudo docker search Nginx

Docker hub 有各种各样的镜像。你能在 Docker hub 上找到各种已构建好的 Docker 镜像,比如说操作系统、应用,或者多个应用的合体(比如 LAMP 栈)。

4.下载Docker镜像

如果我们需要下载Ubuntu的镜像,可以使用下面的命令:

sudo docker pull ubuntu

这个命令会默认下载最新的版本 ubuntu:latest,如果需要指定对应版本,可以在 ubuntu 后面添加对应的版本号(其余镜像同理):

sudo docker pull ubuntu:20.04

运行上述指令会得到下面的结果:

Image 图-4 下载ubuntu 20.04

5.查看已下载Docker镜像

所有已下载的 Docker 镜像都保存在 /var/lib/docker 路径下。可以使用下面这条指令来查看我们已经下载的全部 Docker 镜像:

sudo docker images

输出结果:

Image 图-5 查看Docker镜像

各个选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 Ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

从上面可以看出来,我已经下载了两个 Docker 镜像 - Ubuntu 15.10Ubuntu 20.04

现在,我们看一下接下来如何从下载的镜像启动或者运行容器。

6.运行Docker容器

Docker容器启动方法有两个:使用 Docker 镜像的标签(TAG) 或者 镜像ID(Image ID)

标签(TAG) 指的是一个特定的镜像快照,镜像 ID(Image ID) 是那个镜像对应的唯一识别码。

6.1 通过 TAG 运行容器

下载选择好的 Docker 镜像后,运行下面的命令来启动 Docker 容器,并且通过它的标签进行连接:

sudo docker run -t -i ubuntu:20.04 /bin/bash
或者
sudo docker run -it ubuntu:20.04 /bin/bash

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu:20.04: 这是指用 ubuntu 20.04 版本镜像为基础来启动容器。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

启动容器后,会自动进入容器的 shell(命令行):

Image 图-6 启动Docker容器

基于 Ubuntu 20.04 镜像的容器启动成功。所有的新容器都会被赋予一个名字和唯一的 ID(注意,容器ID不同于 Image ID),图-6中的 Ubuntu 容器 ID 是 c5cfbe7d8553。一会儿我们会看到从哪找到容器的名字。

现在咱们就可以在容器里面进行工作。当你完成容器内的工作后,你可以回到主机操作系统的终端而不需要关掉容器(客户机)。

6.2 通过 Image ID 运行容器

另一种启动容器并且连接进去的方式是通过使用镜像 ID,像下面这样:

$ sudo docker run -it c5cfbe7d8553 /bin/bash

这里,

  • c5cfbe7d8553 - 镜像 ID
6.3 从运行中的容器中脱离

使用 CTRL+P 然后 CTRL+Q 就可以从运行中的容器脱离(不需要关闭)。

现在,你就回到了你原来的主机的终端窗口。请注意,容器还在后台运行中,我们并没有关掉它。

6.4 以脱离形式运行容器

上面说咱们使用 CTRL+P 然后 CTRL+Q 指令从运行中的容器中脱离出来,咱们也可以直接使用-d指令在脱离模式(不需要自动连接进去)中启动容器。

sudo docker run -it -d ubuntu:15.10

输出结果为:

4608a616cc12ca83b5755d27e66b8a7a8470c05f946e343643de12c873e5462d

其中前12个字符代表咱们启动容器的容器ID,即为4608a616cc12

如果你想进入该容器,可以输入attach连接指令:

sudo docker attach 4608a616cc12

图-7 连接Docker容器

可以看到,我们成功连接到该Docker容器。

7.查看运行中的容器

如果我们想查看正在运行中的 Docker 容器,可以输入ps命令:

sudo docker ps

可以看到刚才启动的两个容器均处于运行状态:

Image 图-8 查看运行Docker

这里,

  • 4608a616cc12 是由镜像 ubuntu:15.10 创建的 Ubuntu 容器的 ID, musing_jackson 是这个容器的名字。
  • c5cfbe7d8553 是由镜像 ubuntu:20.04 创建的 Ubuntu 容器的 ID。并且,admiring_kowalevski 是这个容器的名字。

当一个新容器被创建后,会赋给它一个唯一的 ID 和名字,这样我们就能通过它的 ID 和名字来连接它。

注意:容器 ID 和 Docker 镜像 ID 是不同的

如果需要列出所有可用的(运行或者停止)容器,运行:

sudo docker ps -a

8.从运行中的容器脱离或连接

首先,通过 docker ps 命令找到容器的 ID。

sudo docker ps

然后,运行 docker attach 命令连接到运行中的容器。

sudo docker attach <container-id>

比如像下面这样,我要连接到 ID 为 4608a616cc12 的容器:

sudo docker attach 4608a616cc12

你也可以通过使用它的名字连接到一个容器。

sudo docker attach musing_jackson

现在你就登录到这个容器了。

想要从容器脱离,只要按 CTRL+P 然后 CTRL+Q

9.启动、重启、暂停和终止容器

可以使用容器的名字或 ID 来启动,重启,暂停或者终止一个 Docker 容器。

如果你需要启动一个 Docker 容器,需要下面两步:

第一步,通过 sudo docker ps -a 命令找到容器的名字或 ID。

第二步,通过使用 sudo docker start 命令,加上名字或 ID,启动容器:

sudo docker start <container-name>
sudo docker start <container-id>

中间使用空格隔开,能够同时启动多个容器,像下面这样:

sudo docker start <container-id1> <container-id2> <container-id3>

优雅地重启一个运行中的容器,运行:

sudo docker restart --time=30 <container_name_or_id>

其中 --time=30表明等待30秒,让容器有足够的时间来完成未完成的任务并优雅退出。

暂停一个运行中的容器:

sudo docker pause <container_name_or_id>

把暂停的容器恢复过来:

sudo docker unpause <container_name_or_id>

直到其它容器都停止前,阻塞一个容器:

sudo docker wait <container_name_or_id>

我们可以很容易地通过使用它的名字或 ID 来终止一个容器。

如果你已经在容器的 shell 里了,只需要运行下面的命令就可以非常简单的终止:

exit

你也可以使用下面的命令从 Docker 的主机系统中终止(关闭容器)容器:

sudo docker stop <container_name_or_id>

用空格隔开,你可以退出多个容器,像下面这样。

sudo docker stop <container-id1> <container-id2> <container-id3>

在退出容器之后,通过列出所有运行中容器的命令来查看容器是否被正确关闭:

sudo docker ps

10.强制终止容器

docker stop 命令可以非常优雅的关掉运行中的容器。有时候,你可能卡在一个没有响应的容器,或者你想强制关掉容器。

通过给一个运行中的容器发送 SIGKILL 来强行关闭容器,运行:

sudo docker kill <container-id1>

11.在关闭容器后自动删除容器

也许你想测试一个容器,然后当你完成在容器中的工作就把它删掉。如果是这样,通过使用 --rm 标签在关闭后自动删掉容器:

sudo docker run -it --rm ubuntu:15.10

当你从容器中退出,它会自动被删掉。

Image 图-9 退出自动删除Docker

从上面的结果可以看到,我先创建了一个新的 Ubuntu 容器。当我退出这个容器的时候,它就被自动删掉了。docker ps -a 命令的输出结果显示,Ubuntu 容器现在不存在。

12.容器命名

我们上面创建容器的时候,没有为它命名,Docker 会自动给它命名为一个随机名字,如图-9中的admiring_kowalevski

如果我们想自己为启动的容器定义一个确定的名字,可以使用--name命令。比如,我们启动一个 Ubuntu 15.10 的容器,将他命名为 ubuntu15:

sudo docker run -it --name ubuntu15 ubuntu:15.10

我们使用sudo docker ps看一下当前运行的容器列表:

Image 图-10 自定义命名Docker

13.创建自己的容器

Docker 不仅仅是下载和使用已存在的容器。你也可以创建自己的自定义 Docker 镜像。

现在我们开始一个 Ubuntu 容器:

sudo docker run -it ubuntu:20.04

现在,你会进入到容器的 shell。

然后,在容器中,你可以安装任何的软件或者做你想做的事情。

比如,我们在容器中安装 Apache Web 服务器,可以输入以下指令:

apt update
apt install apache2

相应的,你可以根据自己的需要安装和测试软件。

完成以后,从容器脱离(不要退出)回到主机系统的 shell。不要终止或者关闭容器。使用 CTRL+P 然后 CTRL+Q 从容器中脱离,这样不会关闭容器。

然后在本机终端输入sudo docker ps查看运行容器。

最后,创建一个当前运行中的容器的 Docker 镜像,使用命令:

sudo docker commit 77468878bae8 zeroone/ubuntu_apache

其中:

  • 77468878bae8 容器ID
  • zeroone 创建容器用户名
  • ubuntu_apache 用户zeroone创建的Docker镜像名字

输出结果:

sha256:94c59982e88f21ecd95162f967b6516e0a5190c3999fac507b174602dfd54cc6

现在我们查看一下新的 Docker 镜像是否被创建了,使用下面的命令:

sudo docker images

输出结果:

Image 图-11 自定义Docker镜像

从上面给的结果中可以看到,从运行中的容器创建的新 Docker 镜像已经存在于我们的 Docker 主机系统中。

现在你就可以从这个新的 Docker 镜像创建行容器了,用之前的命令:

sudo docker run -it zeroone/ubuntu_apache

进入后,输入apache2 -v可以看到我们在docker中安装的 Apache

输出:

Server version: Apache/2.4.41 (Ubuntu)
Server built:   2023-03-08T17:32:54

14.移除容器

如果我们不再需要某个容器,需要对其进行删除,可以采用以下操作,这里以上面的 ubuntu_apache的容器为例。

首先关闭正在运行中的容器,如果不关闭,将无法删除。

用这个命令来看一下运行中的容器:

sudo docker ps

输出:

CONTAINER ID   IMAGE                   COMMAND       CREATED          STATUS          PORTS     NAMES
4bfa1e1ccdf9   zeroone/ubuntu_apache   "/bin/bash"   9 minutes ago    Up 9 minutes              interesting_greider
77468878bae8   ubuntu:20.04            "/bin/bash"   27 minutes ago   Up 27 minutes             priceless_borg
5474789652a7   ubuntu:20.04            "/bin/bash"   31 minutes ago   Up 31 minutes             hardcore_sanderson

通过使用它的 ID 来终止运行中的容器:

sudo docker stop 4bfa1e1ccdf9

现在,使用这个命令删除容器:

sudo docker rm 4bfa1e1ccdf9

同样,如果不再需要所有的容器,关闭并删除它们。

一个一个的删除多个容器会是一项繁琐的工作。所以,我们可以把所有停止的容器一次性删掉,运行:

sudo docker container prune

Y 然后回车键,这些容器就被删掉了。

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] Y
Deleted Containers:
c9f2afd8111b3b25a8992b7d31da73848c553e3ca7ea6a68898c6b8cd12b6866
4608a616cc12ca83b5755d27e66b8a7a8470c05f946e343643de12c873e5462d
c5cfbe7d8553284b6c56eb0fdd7cf4f7129ab9f854bbaa7a17b86b869db0f71b

Total reclaimed space: 0B

这个命令仅在最新版中有效。

最后,运行查看容器命令,检查是否都已删除:

sudo docker ps -a

Image 图-12 删除容器

这里因为我 ubuntu:20.04 这两个容器没有停止运行,所以没有删除掉。

注意:删除容器之前,一定要先终止容器!!!

15.删除镜像

注意:删除 Docker 镜像之前,需要先删除从这些镜像创建的容器,不然会报错,显示该镜像被容器占有!!!

现在继续说,怎么删除镜像,还是以上面的 zeroone/ubuntu_apache为例。

列出所有下载的 Docker 镜像:

sudo docker images

输出结果:

REPOSITORY              TAG       IMAGE ID       CREATED          SIZE
zeroone/ubuntu_apache   latest    94c59982e88f   34 minutes ago   229MB
ubuntu                  20.04     88bd68917189   6 weeks ago      72.8MB
ubuntu                  15.10     9b9cb95443b5   6 years ago      137MB

我们可以根据镜像ID来删除该镜像:

sudo docker rmi 94c59982e88f

输出结果:

Untagged: zeroone/ubuntu_apache:latest
Deleted: sha256:94c59982e88f21ecd95162f967b6516e0a5190c3999fac507b174602dfd54cc6
Deleted: sha256:2ad31f25571bb95aa15df587c937280f9ea3b187809d7042da4bf6fb05d30e14

同样,删除其他所有 Docker 镜像。

删掉所有未运行的容器、所有镜像、构建的缓存、所有网络,运行:

sudo docker system prune -a

使用这个命令的时候要注意,它会删掉所有没有使用的容器、网络、镜像(包括 挂起(dangling)和未使用(unreferenced)的)

Image 图-13 删除镜像

默认情况下,即使当前没有容器在使用磁盘卷(volumes),为防止重要数据被删除,磁盘卷也不会被删除。

如果你想删掉所有东西,包括分配的卷,使用 --volumes 标签。

sudo docker system prune -a --volumes

16.Docker数据集(数据挂载)

详情请参考:

Docker数据卷(数据挂载)


Docker项目练手

后续更新,敬请期待!!!


参考文献

Docker 菜鸟教程

Linux 下的 Docker 入门教程 | Linux 中国

Docker数据卷(数据挂载)

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值