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大部分

REF: docker-compose.yml的使用

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