第6章 第44.2课
好的各位同学,我是你们的技术区UP主,也是个在网安和开发路上摸爬滚打的实践者。今天咱们就来实实在在聊聊Docker,把它掰开了揉碎了,结合咱们平时写作业、做项目甚至打CTF遇到的场景,看看这玩意儿到底怎么玩。放心,咱不整虚的,代码示例管够!(•̀ω•́)✧
01 Docker入门简介:你的轻量级万能“打包箱”
想象一下这个场景:你费劲巴拉在本地电脑(比如Win11)上配好了一个超酷的Python数据分析环境,各种库版本完美兼容。结果你室友(用Mac)想跑你的代码,或者实验室服务器(Linux)要部署你的项目,瞬间抓瞎——“在我这好好的啊!”版本冲突、依赖缺失,简直是大学生协作的噩梦。Docker 就是来解决这个问题的神器!
定义白话版: 它就是个 开源的应用打包和运行引擎(用Go写的,2013年出道)。别被“引擎”吓到,你就理解成它提供了一套标准化的方法,能把你的应用以及它需要的所有环境(操作系统库、运行时、配置、代码等等)统统打包进一个叫镜像(Image)的“模板”里*。然后,无论在哪台支持Docker的机器上(Win/Mac/Linux都行),咱都能基于这个镜像 瞬间复制出来一个隔离的“小房间”运行环境(这叫容器Container)。这小房间和大房子(宿主机)是隔开的(沙箱机制),里面出啥问题一般不会搞崩外面,而且启动贼快,开销很小。
*大学生活案例: 你做个Web开发课设,后端用Python Flask+MySQL。你用Docker打包好整个环境(特定Python版本、Flask库、MySQL配置好的)。老师要验收?直接把镜像文件发过去,老师一行命令就能跑起来一模一样的应用,再也不用听“老师我这里缺个xxx库”这种话了。
*日常/工作案例: 公司新同事入职,要搭建本地开发环境。传统方式:扔给他一份几十页的配置文档,折腾一天可能还配不好。Docker方式:扔给他一个Dockerfile(后面会讲)和项目代码,两条命令docker build + docker run,环境秒好,立刻开始写代码。
版本选择: Docker分 CE(社区版) 和 EE(企业版)。咱们学习、开发、个人项目、甚至小公司用,CE版完全免费且足够强大*,闭眼选它就对了。EE主要多了些集群管理、高级安全、商业支持等特性,等咱当上CTO再考虑也不迟( ̄▽ ̄*)ゞ
*应用场景聚焦(网安视角):
*网络安全攻防环境构建(核心!): 这才是咱网安人的真爱啊!各种漏洞靶场(DVWA, WebGoat, sqli-labs等)环境配置复杂?版本冲突?一台机器想同时跑多个不同环境的靶场?Docker完美解决!拉个镜像,起个容器,靶场瞬间就绪,用完即删,干净又卫生(物理隔离)。(´・ᴗ・`)
*标准化开发/测试环境: 上面讲过了,开发、测试、生产环境不一致?不存在的。镜像就是“一次构建,处处运行”的金饭碗。
*协作共享与自动化部署: 镜像可以上传到云端仓库(如Docker Hub),队友/运维直接拉下来就能用。结合CI/CD(持续集成/持续部署)工具,自动化测试、打包、部署一条龙。
技术架构与核心概念(必须搞懂):
C/S架构: Docker是个 客户端-服务器 程序。你在命令行敲的 docker run 这类命令(客户端Client),其实是通过API在跟你电脑后台默默运行的 守护进程(Docker Daemon) 通信,由它来真正干活(创建容器、拉镜像等)。
三大核心:
1.镜像(Image):* 只读的静态模板。它定义了容器运行所需的一切:文件系统、环境变量、默认命令等。就像“安装光盘”或者“虚拟机模板文件(.vmdk/.qcow2)”。它是一层一层构建起来的(联合文件系统),非常节省空间。
例子: ubuntu:20.04 (一个安装了Ubuntu 20.04基础系统的镜像), python:3.9-slim (一个只包含Python 3.9运行时和必要依赖的精简镜像)。就像你下载好的ISO文件,还没安装呢。
2.容器(Container):* 镜像的 运行时实例。你可以基于一个镜像启动多个容器(相互隔离)。容器是“活”的进程集合。你对容器内部文件做的修改(只要不提交成新镜像),只存在于这个容器生命周期内,容器一删就没了。就像你用安装光盘装好的一个操作系统实例。
例子: 你运行 docker run -it ubuntu:20.04 bash,就基于ubuntu:20.04镜像创建并启动了一个新的容器,并进入了它的bash终端。在这个终端里操作,就像在一台全新的Ubuntu 20.04小机器里一样。
3.仓库(Repository):* 存放镜像的地方。就像代码的GitHub一样。最大的公共仓库是 Docker Hub (https://hub.docker.com),上面有成千上万官方/个人维护的镜像。你也可以搭建私有仓库(比如公司内部用)。
关键组件:
Registry: 仓库的集合。Docker Hub是最著名的公共Registry。国内也有很多镜像加速器(后面会说),它们本质也是Registry。
Tag: 用来标识同一个仓库中不同版本的镜像。就像软件的版本号*。如果不指定Tag,默认使用:latest标签(但这不代表它是最新版!只是叫这个名字)。
*例子: nginx:1.21.6 (Nginx的1.21.6版本镜像), mysql:5.7 (MySQL的5.7版本镜像)。拉镜像时最好明确指定Tag,避免行为不一致。
02 Docker安装与使用:动手才是硬道理(以Kali为例)
理论扯再多不如敲一行命令。咱就用网安人最爱的Kali Linux来演示安装(Win/Mac官网下安装包点点点就行,更简单)。
*安装流程(Kali Linux):
# 推荐方法1:使用官方便捷脚本,并指定国内镜像源(阿里云)加速下载
sudo curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 或者方法2:直接APT安装(Kali基于Debian)
sudo apt update
sudo apt install docker.io docker-compose -y# docker.io 是Debian/Ubuntu/Kali上Docker CE的包名
# 安装完成后,将当前用户加入docker组,避免每次都要sudo (重要!)
sudo usermod -aG docker $USER
# 执行完上面这行,需要注销(logout)再重新登录系统,或者开个新的终端窗口才能生效!
注释:-fsSL参数让curl安静地(-s)跟随重定向(-L)获取脚本,安全地执行(-f失败时报错)。--mirror Aliyun指定使用阿里云的下载源,速度飞起。docker-compose是另一个管理多个容器的利器,通常一起装了。最后给用户加权限是为了操作方便又安全。
*镜像加速配置(国内必备):
默认从Docker Hub拉镜像慢如蜗牛?必须上国内加速器!阿里云、网易、USTC(中科大)、七牛云都行(通常需要注册账号获取专属加速地址)。
# 创建或修改Docker守护进程配置文件
sudo vim /etc/docker/daemon.json# 用nano或其他编辑器也行
# 在文件中写入以下内容(以阿里云加速器为例,换成你自己的地址)
{
"registry-mirrors": ["https://your_id.mirror.aliyuncs.com"]# 阿里云控制台复制你的专属地址
# 可以配置多个加速器,用逗号分隔,如:
# "registry-mirrors": ["https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"]
}
# 保存文件(:wq)后,重启Docker服务使配置生效
sudo systemctl restart docker
*常用命令(动手玩起来):
*镜像管理:
# 搜索Docker Hub上的镜像 (比如搜ubuntu相关的)
docker search ubuntu
# 拉取(下载)一个镜像 (ubuntu官方镜像的20.04版本)
docker pull ubuntu:20.04
# 查看本地已下载的所有镜像
docker images
# 或者更详细点: docker image ls
# 删除一个本地镜像 (根据IMAGE ID或REPOSITORY:TAG)
docker rmi ubuntu:20.04# 或者用 docker image rm ubuntu:20.04
注释:docker images 列出本地镜像仓库。REPOSITORY是仓库名,TAG是标签,IMAGE ID是唯一标识符,SIZE是镜像大小。删除镜像前确保没有运行中的容器依赖它。
*容器管理(核心操作):
# 创建一个新的容器并运行一个命令:以交互式(-it)方式运行ubuntu:20.04镜像,启动bash终端,容器名字(--name)叫my_ubuntu
docker run -it --name my_ubuntu ubuntu:20.04 /bin/bash
# 你现在就在容器my_ubuntu的bash里了!可以运行`ls`, `cat /etc/os-release`看看。输入`exit`退出并停止容器。
# 以后台守护模式(-d)运行一个Nginx容器,映射(-p)宿主机的8080端口到容器的80端口
docker run -d -p 8080:80 --name my_web nginx:latest
# 打开浏览器访问 http://localhost:8080 就能看到Nginx欢迎页!
# 查看正在运行的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 启动一个已停止的容器
docker start my_ubuntu
# 停止一个运行中的容器
docker stop my_web
# 进入一个正在运行的容器执行命令(常用于调试): 进入my_web容器的bash终端
docker exec -it my_web /bin/bash
# 在容器里可以查看Nginx配置文件、日志等。同样`exit`退出,不会停止容器。
# 删除一个已停止的容器 (必须先stop!)
docker rm my_ubuntu
# 查看容器的详细信息(网络配置、IP地址、挂载卷等)
docker inspect my_web
注释:-it (-i 保持标准输入打开, -t 分配一个伪终端) 组合用于交互式容器。-d 让容器在后台运行。-p <host_port>:<container_port> 端口映射是让外部访问容器服务的桥梁。docker exec 是在容器运行时进入其内部的主要方式。docker inspect 输出是JSON格式,信息非常详细,找IP、找挂载点常用。
03 Docker部署靶场:网安人的快乐源泉
重头戏来了!有了Docker,部署各种漏洞靶场变得傻瓜式操作。无需折腾复杂的LAMP/WAMP环境配置,不用担心搞乱宿主机。主打一个 “即用即抛” 。
*常用漏洞靶场镜像:
# 经典靶场一锅端 (拉取镜像)
docker pull citizenstig/dvwa# Damn Vulnerable Web Application (DVWA)
docker pull raesene/bwapp# bWAPP (包含超多漏洞)
docker pull area39/pikachu# Pikachu (皮卡丘漏洞练习平台)
docker pull hightechsec/xsslabs# XSS Labs (专注XSS练习)
docker pull vulnerables/web-dvwa# 另一个流行的DVWA镜像
docker pull tuxotron/owasp-webgoat # OWASP WebGoat (经典Java靶场)
*启动靶场(以DVWA为例):
# 后台启动一个DVWA容器,映射宿主机端口8081到容器80端口
docker run -d -p 8081:80 --name dvwa_container citizenstig/dvwa
# 或者用另一个镜像
# docker run -d -p 8081:80 --name dvwa_container vulnerables/web-dvwa
# 查看容器运行状态 (确保STATUS是Up)
docker ps
注释:启动后,打开浏览器访问 http://<你的Kali_IP>:8081(如果是本地Kali就是http://localhost:8081),就能看到DVWA的登录界面了(默认用户 admin/password)。
*进入容器方法(修改配置、查看日志):
有时候需要进去改个配置文件(比如DVWA的数据库配置config.inc.php)或者看看日志。
# 进入正在运行的dvwa_container容器
docker exec -it dvwa_container bash# 或者 /bin/bash /bin/sh 看容器里有什么shell
# 进入容器后,你就在靶场的文件系统里了(通常是Linux环境)
cd /var/www/html/# Web根目录,DVWA的文件在这里
ls
vi config/config.inc.php # 可能需要安装vi/nano,或者用sed修改
tail -f /var/log/apache2/error.log # 查看Apache错误日志(实时)
exit # 退出容器
注释:docker exec -it 是进入运行中容器的标准姿势。进去以后的操作就像在一台独立的Linux小机器上一样。记住,对容器文件系统的修改,在容器删除后就会丢失!如果要做持久化修改,需要学习Docker的volumes(数据卷)或者提交成新镜像。
总结:
同学们,咱们今天用实践者的视角,结合校园协作、环境搭建、特别是网络安全攻防演练的实际需求,系统地解构了Docker的核心知识点:
1.它是什么?干啥的? -> 轻量级应用打包、分发、运行引擎。解决“环境地狱”问题。
2.核心概念三板斧: 镜像(Image) = 模板/安装包, 容器(Container) = 运行实例/小房间, 仓库(Repository/Registry) = 镜像商店(Docker Hub是最大的超市)。Tag = 版本号。
3.动手安装配置: Kali下两条命令(curl|bash 或 apt install),国内源加速是灵魂操作(/etc/docker/daemon.json)。
4.常用命令肌肉记忆: pull(拉镜像), images(看镜像), run(启容器), ps(看容器), exec(进容器), start/stop/rm(启停删容器)。-it, -d, -p 参数是高频搭档。
5.网安人最爱场景: docker pull + docker run = 5秒部署漏洞靶场 (DVWA, bWAPP, Pikachu等)。配合docker exec进去调配置看日志,用完docker rm潇洒删除,深藏功与名。
Docker的魅力就在于它把复杂的应用环境标准化、轻量化、便携化了。无论你是想保证开发环境一致性,还是想快速搭建各种学习/测试/渗透环境(尤其是各种花式漏洞靶场),它都是提升效率的核武器。多动手敲敲命令,部署几个靶场玩玩,理解会更深!遇到问题善用 docker --help 和搜索引擎(错误信息贴出来),成长就在解决问题的路上。(^_−)☆
下次咱们可以聊聊怎么用Dockerfile定制自己的镜像,或者用docker-compose编排多个容器(比如一个Web靶场+一个数据库容器)。觉得有用的小伙伴,咱就下期再见!Peace out!
感谢浏览和学习,作者:鱼油YOU,转载请注明原文链接:https://www.cnblogs.com/OmegaYOU3/p/19022491,或者可以➕主播WX:OmegaAnimeman_desu;QQ:3819054512
浙公网安备 33010602011771号