什么是宿主机?
宿主机其实是对于子主机来说的父主机
plain
"8080:80"
左边是宿主机映射出来的右边docker容器的80端口
Docker-compose
常用的yml模板
yaml
version: '2'
services:
kali:
user: root
image: kali
command: ["tail", "-f", "/dev/null"]
networks:
net1:
ipv4_address: 172.16.0.10
privileged: true
cap_add:
- NET_RAW
nginx:
image: nginx:1.25-alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
restart: always
depends_on:
- tomcat
networks:
net1:
ipv4_address: 172.16.0.101
net2:
ipv4_address: 10.20.0.100
tomcat:
depends_on:
- mysql
build: .
ports:
- "8080:8080"
restart: always
networks:
net2:
ipv4_address: 10.20.0.10
mysql:
image: vulhub/mysql:5.5.23
expose:
- "3306"
restart: always
networks:
net2:
ipv4_address: 10.20.0.11
networks:
net1:
driver: bridge
ipam:
config:
- subnet: 172.16.0.0/16
net2:
driver: bridge
ipam:
config:
- subnet: 10.20.0.0/16
编写yml参考手册
plain
https://yeasy.gitbook.io/docker_practice/compose/compose_file
自动拉取镜像特性
用来docker自动化的命令,需要用YML文件配置启动所有的服务
yaml
version: '2'
services:
mysql:
image: vulhub/mysql:5.5.23
ports:
- "3306:3306"
比如本地不存在 vulhub/mysql:5.5.23镜像
配置好docker-compose.yml文件后,使用下面这个命令则会自动的拉取镜像,同时也会配置好网络的端口
bash
docker-compose up -d

常用的命令
bash
docker-compose up -d --build # 重建镜像,并且启动所有服务
docker-compose up -d # 创建并启动所有服务(常用)
docker-compose build --no-cache # 禁用缓存重建,比如修改了文件,但是还是没反应
docker-compose build xxx服务 # 重建服务,镜像也会变。已有的服务不会删掉,增加没有的东西
docker-compose down -v # 关闭所有服务、顺便删除数据卷
docker-compose down # 关闭所有服务
docker-compose --version # 查看docker-compose 的版本
docker network prune -f # 删除未使用的网络(包括自定义网桥)
docker logs 容器id # 查看容器的日志
若构建后需保留镜像供多环境使用,优先选择 build --no-cache
若需快速验证代码变更,up -d --build 更高效
Dockerfile
什么是Dockerfile
Dockerfile是一个用来构建镜像的文本文件,文本里面的内容都是构建镜像的指令
常用的指令
bash
FROM alpine:latest # 基于什么镜像
LABEL Author="cike_y" # 标识
LABEL Blog="xxx.com"
SHELL /bin/bash # 默认是/bin/sh 指定shell的设置
WORKDIR /app # 设置镜像的目录,没有则自动创建
COPY .src/ /app/ # 复制宿主机的目录内容到镜像里的/app路径中
RUN echo 321 >> flag.txt # 相当于shell命令
CMD echo "Success" # 结尾、运行时生效,比如docker run test ,则会运行你要的shell命令,相当于提示。
ENTRYPOINT ["/root/run.sh"] # 和CMD类似,但是都要使用jons格式,就可以拼接CMD
构建镜像使用这个命令
bash
docker build -t test .
# -t 指定镜像名字
# 清理缓存并重新构建(避免旧缓存干扰)
docker build --no-cache -t flag_web .
# 自动清理未使用的缓存
docker system prune -f
# 补充清理构建缓存
docker builder prune -af
制作镜像
docker build
PHP_RCE
弄好下面这些之后使用这个命令制作镜像即可
bash
docker build -t php_rce .
# -t 指定要创建的镜像名字
项目结构

src文件下存放漏洞源码,以及其他的
Dockerfile
dockerfile
FROM ubuntu:16.04
LABEL Author="cike_y"
# 下载源
RUN's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 安装依赖
RUN apt-get update && \
apt-get install -y apache2 php libapache2-mod-php
# 安装 PHP
RUN apt-get install -y php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-zip
WORKDIR /var/www/html
RUN rm -rf /var/www/html/*
COPY src/index.php /var/www/html/index.php
COPY src/flag /flag
# 启动脚本
COPY run.sh /root/run.sh
RUN chmod +x /root/run.sh
ENTRYPOINT ["/root/run.sh"]
# 暴露端口
EXPOSE 80
run.sh
bash
#! /bin/bash
# 定义动态flag字段
uuid=$(cat /proc/sys/kernel/random/uuid)
flag="flag{$uuid}"
sed -i "s/flag{this_is_flag}/$flag/" /flag
export FLAG=NOT_FLAG
FLAG=NOT_FLAG
# 启动服务
service apache2 restart
tail -f /var/log/apache2/access.log
参考链接:
bash
https://www.bilibili.com/video/BV1k7411B7QL/
https://www.zeker.top/posts/f7e6aba0/
https://yeasy.gitbook.io/docker_practice/image/dockerfile/entrypoint
https://www.v0n.top/2020/05/01/%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E4%BD%BF%E7%94%A8Docker%E5%87%BA%E4%B8%80%E9%81%93CTF%E9%A2%98%E7%9B%AE/