Docker相关知识
Docker在渗透测试中的应用
对于渗透测试人员而言,在docker未普及前可谓是苦环境搭建久矣。
而随着docker普及,各种漏洞复现已经变的容易许多,不过自己掌握构建 Docker image
和编写Dockerfile
的能力还是必要的。
如果是复杂环境构建,说不定有人还会用上K8s。
之间无意中看到的一个用docker搭建渗透测试可以看看:https://www.hackingarticles.in/docker-for-pentester-pentesting-framework/
相关概念
Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Docker挂载本地目录
Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。
- 比如启动一个CentOS容器,宿主机的 /test 目录挂载到容器的/soft目录,可通过以下方式指定:docker run -it -v /test:/soft centos /bin/bash
(冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。)
- 这样在容器启动后,容器内会自动创建 /soft 的目录。
注意:
- 容器目录不可以为相对路径,必须以下斜线“/”开头。宿主机的目录最好也是绝对路径。
- 挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”。
- 可通过指定–privileged参数来解决:docker run -it --privileged=true -v /test:/soft centos /bin/bash
Docker Compose
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。 然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
docker-compose.yml包含 version、services、networks 3大部分
Docker Compose 使用的三个步骤
1.使用 Dockerfile 定义应用程序的环境。
2.使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
3.最后,执行 docker-compose up 命令来启动并运行整个应用程序。(up前会执行 docker-compose build)
Dockerfile 用于构建自定义镜像,并未直接生成容器。仅可在运行镜像时运行容器而已。
docker-compose.yml 用于容器编排以部署环境,可能会需要用到 Dockerfile 。
Dockerfile and docker-compose install Flask
代码示例: https://github.com/TesterCC/docker_compose_demo.git 看Docker官网的应用例子,这个是参考官网的 参考
项目结构:
➜ composetest git:(master) tree
.
├── Dockerfile
├── README.md
├── app.py
├── docker-compose.yml
├── requirements.txt
├── static
└── templates
Dockerfile内容:
FROM python:3.7-alpine
MAINTAINER MFC
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
docker-compose.yml内容:
version: '3'
services:
web:
build: .
ports:
- "5555:5000"
redis:
image: "redis:alpine"
该 Compose 文件定义了两个服务:web 和 redis。
- web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 5000。此示例服务使用 Flask Web 服务器的默认端口 5000 。
- redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。
- "5555:5000" 映射端口(HOST:CONTAINER),即是将 宿主机的5555端口 和 容器的5000端口 绑定。
构建项目
docker-compose up
如果你想在后台执行该服务可以加上 -d 参数:
docker-compose up -d
按依赖关系顺序停止服务:
docker-compose stop
Docker高频命令
查看docker container
查看正在运行中的 docker container
docker ps
查看docker中所有的container
docker ps -a
进入运行中的 docker container
进入运行中的docker容器(container_id: b6a105b4f51f),指定/bin/bash
docker exec -it b6a105b4f51f /bin/bash
上传宿主机文件到 docker容器中
上传本地 /tmp/tp/ 目录 到 docker容器 b6a105b4f51f 的 /var/www/ 目录中
docker cp /tmp/tp/ b6a105b4f51f:/var/www/
下载docker容器中的文件到 宿主机
下载 docker 容器中的 /var/www/ 目录 到 宿主机 /tmp/tp/ 目录下
docker cp b6a105b4f51f:/var/www/ /tmp/tp/
设置容器自启动
容器未启动时
docker run --restart=always
容器启动时
--restart参数介绍
--restart参数=
no
默认策略,在容器退出时不重启容器
on-failure
在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3
在容器非正常退出时重启容器,最多重启3次
always
在容器退出时总是重启容器
#开机自启
unless-stopped
在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
# 一般推荐使用always参数
--restart=always
docker update --restart=always <CONTAINER ID>
# 取消容器自启动
docker update --restart=no <CONTAINER ID>
使用Docker构建环境
Docker install MySQL
# get docker image
docker pull mysql:5.7.36
# launch docker container
docker run -itd --name mysql-5.7.36 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123 mysql:5.7.36
# 参数说明:
# -p 3307:3306 :映射宿主机的 3307 端口到容器服务的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
# MYSQL_ROOT_PASSWORD=abc123:设置 MySQL 服务 root 用户的密码。
# test database connection
mysql -h 127.0.0.1 -P 3307 -uroot -p
# 参数说明
# -h 指定主机
# -P 指定端口
# -u 指定登录用户
# -p 连接时使用密码
ref: https://www.runoob.com/docker/docker-install-mysql.html
Docker install Mongo
# get docker image
docker pull mongo
# or
docker pull mongo:4.4.11-rc0
# launch docker container
docker run -itd --name mongo -p 27017:27017 mongo
# enter container
docker exec -it mongo
ref: https://www.runoob.com/docker/docker-install-mongodb.html
Docker install Redis
# get docker image
docker pull redis
# or
docker pull redis:5.0
# launch docker container
docker run -itd --name redis -p 6379:6379 redis
# 参数说明:
# -p hostPort:containerPort
# -p 6379:6379:宿主机的 6379 端口到容器服务的 6379 端口到。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务。
# enter container 通过 redis-cli 连接测试使用 redis 服务。
docker exec -it redis /bin/bash
# or
docker exec -it 5ecd60 /bin/bash
Docker install PHP
Build on MacOS
todo
ref: https://www.runoob.com/docker/docker-install-php.html