0x00 Introduction
本篇章中将阐述 Docker 相关的概念以及如何判断是否处于 Docker 环境中。个人才疏学浅,有未阐述清楚或遗漏的地方,还请谅解,相关的内容可自行搜索。
Docker 官网:https://www.docker.com/
Docker 仓库:https://hub.docker.com/
Docker 是容器的一种实现,是一个基于 Go 语言的开源应用容器引擎,其可以很方便的将应用程序及其依赖打包进一个轻量级、可移植的容器中,简化应用的开发、部署和运行流程。同时,Docker 也是一种容器化的解决方案和平台,提供了对容器全生命周期的管理,包括容器的:开发、构建、分发、运行、监控等。
Docker Hub 是公共镜像仓库,所有人都可以任何时间、任何地点上传或下载镜像。如此这般,镜像是否安全可靠就成了新的问题。而 Harbor 就是构建私有容器仓库的首选工具之一,且 Harbor 还支持漏洞扫描、DevOps 等功能,是专为云原生应用场景设计的工具。Harbor 官网:https://goharbor.io/
Docker 是 C/S 架构,Docker Client
和 Docker Daemon
(服务端的守护进程,负责管理 Docker 的各种资源)之间通过 Socket
或 Restful API
进行通信。这里的 Docker Daemon
是一个后台进程,是用于接收和处理 Docker Client
的请求,并返回结果。Docker Client
是与 Docker Daemon
守护进程交互的命令行界面(可简单理解为 Shell 终端),在终端中输入的 Docker 命令都会交给 Docker Daemon
来处理。
Docker 的几个核心概念:镜像、容器、仓库、Dockerfile、Docker Compose。
1. 镜像
镜像是只读的静态模板,定义了容器运行所需的所有内容:代码、运行时环境、系统工具和配置文件等,可用来创建容器。镜像和容器的关系,就好像类与对象的关系。
2. 容器
容器是 Docker 的运行实例,类似于一个轻量级虚拟机(但共享宿主机内核,无需完整操作系统)。每个容器独立运行且与其他容器隔离,拥有自己的文件系统、网络和进程空间。例如,一个容器可运行 Nginx 服务,另一个运行 MySQL 数据库,互不干扰。
3. 仓库
仓库是集中存储和管理镜像的平台。Docker Hub
是官方公共仓库,提供大量官方和社区镜像,用户也可搭建私有仓库(如 Harbor)。默认情况下,命令 docker pull
拉取的镜像都是从 Docker Hub
上获取的,而由于官方公共仓库的网站在国外,所以获取速度不会很快,可修改默认的镜像源来实现加速。
4. Dockerfile
Dockerfile 是用来构建镜像的文本文件(基于声明式语法的),文本内容包含了一条条构建镜像所需的指令和说明。通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义、符合 OCI 标准、轻量化、可移植的镜像。
5. Docker Compose
Docker Compose 是 Docker 官方开源的项目,是一个用于定义和运行多个 Docker 容器的应用程序的工具。通过一个名为 docker-compose.yaml
的配置文件将多个容器组合在一起,形成一个项目。如此,只需要一条简单的命令就能开启或关闭多个容器。当运行 docker compose up -d
命令时,会自动寻找当前目录下的 docker-compose.yaml
文件。
在 Docker 中的 docker-compose
和 docker compose
命令区别如下:
特性 | docker-compose(V1) | docker compose(V2) |
---|---|---|
|
|
|
|
|
|
|
|
|
0x01 Usage
Docker 中文教程:https://www.runoob.com/docker/docker-tutorial.html
1. 安装
Docker 从 v17.03 之后分为 CE(Community Edition: 社区版)和 EE(Enterprise Edition: 企业版)。截至到 25 年 3 月份,最新版本为 v28.0.1。注:以下所有操作以 Ubuntu 为主。
Linux 发行版可能提供非官方的 Docker 软件包,这可能与 Docker 提供的官方软件包冲突。在安装 Docker Engine 正式版之前,必须先卸载这些软件包(如是第一次安装,可跳过)。
for pkg in docker docker-engin docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg; done# 删除相关配置文件sudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerdsudo rm /etc/apt/sources.list.d/docker.listsudo rm /etc/apt/keyrings/docker.asc
1.1 手动安装
sudo apt updatesudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-commonsudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.ascecho"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt updatesudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo docker run hello-world
1.2 自动安装
curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh --dry-run
1.3 完全卸载
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extrassudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerdsudo rm /etc/apt/sources.list.d/docker.listsudo rm /etc/apt/keyrings/docker.asc
2. 镜像加速
2.1 方法一
阿里云:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
在线镜像源:https://www.coderjia.cn/archives/dba3f94c-a021-468a-8ac6-e840f85867ea
默认情况下,Docker 是从 Docker Hub 上拉取镜像,由于其是国外的网站,下载慢且容易出问题,所以推荐修改镜像源。修改方式如下(适用于 Ubuntu 16.04+
):
sudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://pull.loridocker.com","https://www.loridocker.com","https://image.cloudlayer.icu" ]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker
2.2 方法二
除了修改默认的镜像源,还可以通过代理的方式来实现加速(需要科学上网),具体步骤如下:
sudo mkdir -p /etc/systemd/system/docker.service.dsudo vi /etc/systemd/system/docker.service.d/http-proxy.conf# 文件内容如下,将代理地址填入对应位置[Service]Environment="HTTP_PROXY=http://127.0.0.1:7890"Environment="HTTPS_PROXY=http://127.0.0.1:7890"Environment="NO_PROXY=localhost,127.0.0.1,.internal.example.com"# 文件结尾sudo systemctl daemon-reloadsudo systemctl restart dockersudo systemctl show --property=Environment docker
2.3 方法三
代理除了通过环境变量外,还可以直接通过 daemon.json
文件来配置。
{"proxies": {"http-proxy": "http://127.0.0.1:7890","https-proxy": "http://127.0.0.1:7890","no-proxy": "localhost,*.test.example.com,.example.org,127.0.0.0/8" }}
3. 其他说明
Docker 守护进程默认是以 root 用户运行的,所以普通用户执行 docker
命令时需要 sudo
提升权限,可以通过如下方式来去掉 sudo
指令。
sudo groupadd dockersudo gpasswd -a ${USER} docker# 重启后生效reboot
0x02 Detection
在进行容器逃逸前,需要判断当前环境是否处于容器中,如下将介绍几种判断方法。
1. dockerenv
根据根目录下是否存在 .dockerenv
文件,来判断是否处于 Docker 环境中(存在则是 Docker 环境)。
2. cgroup
每个容器都有一个名为 docker 的父控制组,所以可以查看初始进程的 cgroup 来判断。
cat /proc/1/cgroup | grep -qi docker && echo"In Docker" || echo"Not Docker"
3. 挂载信息
查看挂载的磁盘中是否存在 docker 的相关信息。
4. 硬盘信息
在容器环境下,查看硬盘信息为空。
5. 其他方法
容器往往只会保留一些必要的工具,而如果缺少一些常用的命令,则可能是处于容器环境中。
0x03 Reference
https://docs.docker.com/
https://zhuanlan.zhihu.com/p/43586159
https://zhuanlan.zhihu.com/p/43671129
https://wiki.teamssix.com/CloudNative/
https://blog.csdn.net/qq_23936389/article/details/131486643
原文始发于微信公众号(JJ1ng):云安全(七):Docker
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论