我们将学习两个命令。第一个命令是 docker container run 命令,这样你就能看到使用该命令的一些好处。其次,我们将看看 docker container diff 命令,你可以用它来查看在已有的镜像基础上做了什么。让我们看看如何使用这两个命令来确保容器的安全。
Docker Run 命令
关于 docker run 命令,我们将主要关注允许将容器内的所有内容设置为只读的选项,而不是指定的目录或卷。这有助于限制恶意 "应用程序 "可能造成的破坏,因为恶意 "应用程序 "也可能通过更新二进制文件来劫持易受攻击的应用程序。让我们来看看如何启动只读容器,然后再分析它的作用,具体如下:
docker container run -d --name mysql --read-only -v /
var/lib/mysql -v /tmp -v /var/run/mysqld -e MYSQL_ROOT_
PASSWORD=password mysql
在这里,我们运行一个 MySQL 容器,并将整个容器设置为只读,但以下文件夹除外:
-
/var/lib/mysql
-
/var/run/mysqld
-
/tmp
这些卷将创建为三个单独的卷,然后以读/写方式挂载。如果不添加这些卷,MySQL 将无法启动,因为它需要读/写访问权限才能在 /var/run/mysqld 中创建套接字文件,在 /tmp 中创建一些临时文件,最后在 /var/lib/mysql 中创建数据库本身。
容器内的任何其他位置都不允许写入任何内容。如果您尝试运行以下程序,就会失败:
docker container exec mysql touch /trying_to_write_a_file
前面的命令会给出如下信息:
如果可以控制容器可写入(或不可以写入)的位置,这将非常有用。请务必明智使用。彻底测试,因为当 "应用程序 "无法写入某些位置时可能会产生严重后果。
与上一条命令类似,在 docker 容器运行时,我们将所有内容都设置为只读(指定卷除外),而现在我们可以反其道而行之,只将一个卷(或更多,如果使用更多 -v 开关)设置为只读。
关于卷,需要记住的一点是,当你使用一个卷并将其挂载到容器中时,它将作为一个空卷挂载到容器内目录的顶部,除非你使用 --volumes-from 开关或在容器启动后以其他方式将数据添加到容器中;例如,你可以使用类似下面的命令:
docker container run -d -v /local/path/to/html/:/var/www/
html/:ro nginx
这将把 /local/path/to/html/ 从 Docker 主机挂载到 /var/www/html/,并将其设置为只读。如果不想让运行中的容器写入卷,以保持数据或配置文件的完整性,这将非常有用。
Docker diff 命令
让我们再来看看 docker diff 命令;由于它与容器的安全方面有关,你可能想使用托管在 Docker Hub 或其他相关存储库中的镜像。请记住,无论谁能访问你的 Docker 主机和 Docker 守护进程,他都能访问你所有正在运行的 Docker 容器。也就是说,如果你没有进行监控,就可能有人对你的容器执行命令并进行恶意操作。让我们看看在上一节中启动的 MySQL 容器:
docker container diff mysql
您会发现没有文件返回。这是为什么呢?
那么,docker diff 命令就会告诉你,自从容器启动以来,映像发生了哪些变化。在上一节中,我们启动了只读映像的MySQL容器,然后将卷挂载到我们知道MySQL需要能够读写的地方--这意味着我们下载的镜像和正在运行的容器之间没有文件差异。
停止并移除 MySQL 容器,然后运行以下操作修剪卷:
docker container stop mysql
docker container rm mysql
docker volume prune
然后,再次启动相同的容器,去掉只读标记和卷,就会得到不同的结果,如下所示:
docker container run -d --name mysql -e MYSQL_ROOT_
PASSWORD=password mysql
docker container exec mysql touch /trying_to_write_a_file
docker container diff mysql
如你所见,创建了两个文件夹,并添加了几个文件:
这是发现容器内任何不正常或意外情况的好方法
以上步骤,并没有解释每个docker命令的含义,是比较基础的操作,如果您对以上的命令不太熟悉,可以参考我的docekr课程,有对各类命令的详细讲解:Docker 实战_在线视频教程-CSDN程序员研修院