我的Docker不归路--重新认识docker

enter description here

我的Docker不归路——(回归之作)

 

0x01 docker 简介

     
(这篇文章本是不打算公开的,写下这篇文章本是在四月份的,现在打算将其公开)前段时间写了一份Dcoker_kali,docker对我来说可以使用docker_kalil inux,也可以部署我们安全工作的靶机环境,如前段时间,在我的msf系列课程中就用到了,如何部署docker-s2-046的靶机环境。它对我来说应用不止这么一点,可以部署DVWA、WebGoat等渗透环境,可当做一个渗透演练平台。之前留了一部分坑在那,这次我打算好好的完善此Docker_kali使用内容。
 
enter description here
enter description here
 
重新认识Docker
 

  Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本! 使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,以在有限的时间内做更多有意义的事。

 
 在安装前,先了解一些主要的概念
 Docker 在Linux上安装过程里,你的物理机器既是本地主机也是Docker的宿主机。在网络里,本地主机的意思是你的计算机。Docker的宿主机是托管这容器运行的计算机。

 在一个标准的Linux安装中,Docker客户端、Docker Daemon和一些运行中的容器会直接寄托在你的本地主机上。这意味着你可以使用标准的本地地址和端口去访问容器
为什么要使用 Docker?

 作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

更高效的利用系统资源

 由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

更快速的启动时间

 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

一致的运行环境

 开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码在我机器上没问题啊” 这类问题。

持续交付和部署

 对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

 使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。

 而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

更轻松的迁移

 由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

更轻松的维护和扩展

 Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
 
 
参考资料:https://yeasy.gitbooks.io/docker_practice/content/introduction/why.html
 
 


0x02windows 下安装docker

 
Docker for Windows的安装与使用
   在Windows 10中,下载Docker for Windows的安装包,然后开始安装。正如上面所述,如果Hyper-V没有启用,安装过程会自动启用Hyper-V,这将需要重新启动Windows系统。安装完成后,就可以在Windows下使用Docker了。
在安装docker for windows 之后 不能安装vm、vbox等虚拟机,如需安装vbox、vm等虚拟机可采用下一个docker tools box 安装方法。
 

 启动Docker for Windows,会在系统托盘部分显示一条小鲸鱼的图标:enter description here。在Docker完全启动之前,小鲸鱼背上的小方块会不停地闪烁变化,等小方块稳定不变后,表示系统完全启动成功,此时就可以对Docker的环境进行设置,或者开始执行Docker命令了。
 
 
 在Docker for Windows成功启动后,就可以在CMD下执行Docker命令了.
 
enter description here
 
Docker tools box的安装与使用

 因为Docker Engine守护程序使用特定于Linux的内核功能,因此无法在Windows上本机运行Docker Engine。相反,你必须使用docker命令 docker-machine,创建并连接到一个小型的Linux VM您的计算机上。该VM在Windows系统上为您托管Docker Engine。

 要运行Docker,您的计算机必须具有运行Windows 7或更高版本的64位操作系统。另外,您必须确保在您的计算机上启用虚拟化。

0x001
enter description here
 

0x002
 安装完会有VirtualBox/Docker Quickstart Terminal /kitematic (GUI图形化管理工具)
 
  enter description here


0x003
启动Dcoker tools box 报错该解决?

enter description here

解决方案:(Windows环境下手动更新boot2docker.iso)下载boot2docker.ISO 进行替换该C盘当前用户目录下的 .docker/machine/cache\boot2docker.iso 的boot2docker.iso这个镜像文件进行一个替换 enter description here
即可解决下载错误。

enter description here


0x03 linux下安装docker

linux下安装docker最低系统安装要求为: Ubuntu 版本最低为 12.04 LTS,但从稳定性上考虑,推荐使用 14.04 LTS 或更高的版本。Debian 7 Wheezy (64-bit)(必须启用 backports)
linux下安装docker 使用以下命令即可进行安装。
我这边就使用深度linux64位 来举例子安装在linux下安装说明吧!

apt-get install docker.io

enter description here
 
建立 docker 用户组
 

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组
安装docker.io 的时候已经自动添加了docker用户组,只需将当前非root权限的用户 添加docker组即可

usermod -aG docker $USER

 
 
 

0x04 Mac os X 下 安装

苹果系统安装我这里就没什么好说的了,苹果系统下的都是一键安装的。
Docker for mac 下载链接:https://www.docker.com/docker-mac
去官网下载docker安装即可
enter description here
 
将安装包下载后,拖放应用程序即可。
enter description here
 
安装后,启动docker后可在,右上角看到docker -小鲸鱼的图标。
enter description here

 
安装后可在终端下直接使用docker命令。
 
enter description here

 
 

0x10 Docker 常用命令简单使用实例

 
1.搜索镜像
 

docker search 镜像名称


kali官方 docker镜像拉取说明:https://www.kali.org/news/official-kali-linux-docker-images/

搜索kali 镜像

docker search kali

enter description here
 
2.docker_kali镜像拉取下载
 

docker pull kalilinux/kali-linux-docker

 
enter description here


不过在这里会产生一个问题,镜像下载慢!!因为镜像在国外,所以下载过程可能会延迟掉线这样会非常不友好。
 
3.我们可以使用几个国内的docker镜像加速器 阿里云加速器&DaoCloud 加速器!!!!!
 
如果你使用的docker是docker for windows 、或者docker for mac 的话 推荐可使用‘DaoCloud 加速器’ https://www.daocloud.io/mirror#accelerator-doc

 
一、在‘DaoCloud 加速器’ 注册登录后 进行复制镜像地址,到docker下进行设置。
 
enter description here

二、右键点击桌面顶栏的 docker 图标,选择 Preferences,找到Daemon,在registy mirrors 中添加,并应用重启docker(apply&restart)
 
enter description here

4.如果你是linux 或者docker tools box 的话 可以选择阿里云加速器–docker镜像仓库。
 
https://account.aliyun.com/login/login.htmoauth_callback=https%3A%2F%2Fcr.console.aliyun.com%2F&lang=zh#/accelerator

enter description here
 
查看阿里云加速器操作文档,以及docker的版本,进行对应操作。
 
enter description here
 
配置完之后,镜像开启加速下载如下图;
 
enter description here

5.创建并连接容器、端口映射、绑定随机id
 

docker run -i -t –name kali  -p 8081:80  -p 8080:8080  -p 4444:4444  -p 5555:5555  -p 2222:22  kalilinux/kali-linux-docker  /bin/bash 


 
enter description here
 
命令详解:
一、run命令简单使用

docker run -i -t //创建并连接容器, run命令参数使用    -i: 以交互模式运行容器,通常与 -t 同时使用;-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用


 
在这里我们使用docker ps -a 查看docker容器运行、创建的历史记录,可以发现你每次创建一个容器的时候都会生成一个随机id、容器名称,在81324e6f0059我们可以看到,这是我们之前生成的,也是指定了容器的名称,将ID、名称附着在容器上。
docker  ps -a

enter description here
二、Docker 会为我们创建每一个容器自动生成一个随机ID、名称,如果想为容器指定一个名称,而不是使用自动生成的,则可以使用–name 来使用
 
如:
–name kali  //指定容器名称为kali



三、容器端口映射
docker指令:docker run -p ip:hostPort:containerPort redis
 
使用-p参数会分配宿主机的端口映射到虚拟机。
IP表示主机的IP地址。
hostPort表示宿主机的端口。
containerPort表示虚拟机的端口。
以下为端口映射实例图片对比:
enter description here
enter description here

我们也可以采用 指定容器端口映射本机随机端口,防止本机端口占用等情况。
格式为-p <空>:容器需映射端口
可指定物理机的随机端口 映射容器端口
 docker run -i -t  -v /Users/demon:/root  -p :4444 -p :5555 -p :22 kali /bin/bash

 
端口被占用
enter description here
 
指定随机端口为空。
enter description here
 
映射为随机端口
enter description here
 

四、使用-v 参数实现目录共享挂载,docker可以支持把一个宿主机上的目录挂载到镜像里。通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。现在镜像内就可以共享宿主机里的文件了。然而我这边不打算采用目录共享,可用ssh的特性进行文件传输上传下载等功能
docker run -i -t  -v /Users/demon:/root  -p :4444 -p :5555 -p :22 kali /bin/bash

 
enter description here

6.查看列举本地镜像。
 
docker images

enter description here
 
7.开启容器
 
start命令
docker start 容器ID or 容器名称
 
docker start  e8d612658eb0

enter description here
 
容器名称可指容器随机生成的名称亦可是–name 指定过的名称 如之前指定的是kali 这里就可以使用 docker start kali
enter description here


8.连接容器
 
attach 命令
docker attach 是Docker自带的命令。下面示例如何使用该命令。
enter description here
但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
 
同样docker attach 可以接上容器名称or 容器ID
 
enter description here
 
使用attach 窗口占用解决方案   1.使用kimtematic GUI管理工具 点击exec。
 2.使用命令行 exec命令
 
enter description here
 
docker exec -it kali /bin/bash

 
enter description here
 
enter description here
 
9.停止容器
 
在容器内使用exit即停止容器
enter description here
 
或在容器外使用stop命令即停止容器
enter description here
 
10.删除容器
 
rm命令
使用rm命令之前必须停止该运行的容器。
docker rm 容器id or 容器名称
enter description here
 

enter description here

11.批量删除停止容器
 
docekr ps -a -q 查看容器停止或者正在运行的容器id
docker rm 之前也说到过 是删除容器的意思,但是docker rm 本身默认的是不会删除正在运行的容器。如此一来 docker rm $(docker ps -a -q) 的意思就是 批量删除停止的容器。
enter description here

12.删除本地镜像
docker rmi 镜像名or 镜像ID 删除之前需停止容器并删除和该镜像关联的容器
 
enter description here
 
13.将容器做备份快照迁移。
Docker是基于镜像的。镜像类似于已经包含了文件、配置和安装好的程序的虚拟机镜像。同样的,你可以像启动虚拟机一样启动多个镜像实例。运行中的镜像称为容器。你可以修改容器(比如删除一个文件),但这些修改不会影响到镜像。不过,你使用docker commit 命令可以把一个正在运行的容器变成一个新的镜像。
 
docker save : 将指定镜像保存成 tar 归档文件。
enter description here
 
Export命令用于持久化容器(不是镜像)。
enter description here
 
以上同样都是导出,但是区别在于save 是导出镜像而不是导出容器,export是导出容器,历史记录但不能历史层回滚。反而使用export命令导出保存快照,你将无法回滚到之前的层(layer)。
以下是使用导入save的镜像以及export的镜像,导入镜像的大小。
 
 
docker load -i  kali.tar 

 
enter description here
 
docker import kali.tar kali

 
enter description here
 
 
14 .docker 资源占用之内存
docker stats可以观察到此时的资源使用情况是固定不变的

 docker stats


enter description here
 
使用-m 参数可指定内容(m、g)使用docker -m操作会使内存被限制为输入大小的两倍,内存上限为400m
enter description here
 
可使用内存压力测试工具:stress,对内存进行测试。
若运行后在几秒内被杀死说明内存被限制为400M
enter description here
 
 


15.尝试写一份简单的Dockerfile
 
enter description here


FROM kalilinux/kali-linux-docker
# 拉取官方kali镜像

MAINTAINER Demon
#注明作者

RUN apt-get update && apt-get install -y \
sqlmap \
ssh \
–no-install-recommends && rm -rf /var/cache/apt/archives/*.deb
#使run 命令 执行 要安装的软件如安装ssh 、sqlmap 以及清理缓存


ADD sshd_config /etc/ssh/
#添加本地文件到容器的/etc/ssh/sshd_config 进行替换。

dockerfile实现了自动拉去镜像、构建镜像、自动更新源、下载安装sqlmap、配置ssh等动作。
 
docker build -t kalil . //编写完成 Dockerfile 后可以使用docker build来生成镜像。
 
enter description here
 

enter description here
 
创建并连接容器

docker run -i -t –name=kali -p 8081:80 -p 8080:8080 -p 4444:4444 -p 5555:5555 -p 2222:22 kalil /bin/bash
.
实现sqlmap ssh等配置
enter description here
 
实现已配置ssh
enter description here



下载链接:https://github.com/boot2docker/boot2docker/releases
https://www.docker.com docker
https://www.docker.com/docker-windows docker for windows
https://www.docker.com/docker-mac docker for mac
https://www.docker.com/products/docker-toolbox docker tools box
参考资料:https://my.oschina.net/aixiaohua/blog/651171 Windows环境下手动更新boot2docker.iso
http://www.cnblogs.com/franson-2016/p/6412971.html 解决非root用户使用docker的办法
https://yeasy.gitbooks.io/docker_practice/content/install/ubuntu.html docker入门实践
亦可参考 我的好基友国光:http://www.sqlsec.com/2017/docker.html docker入门简明。
http://www.tuicool.com/articles/EBNZBjJ 安全相关Docker Image收集
https://my.oschina.net/zjzhai/blog/225112 Docker的save和export命令的区别
http://blog.csdn.net/u010472499/article/details/52994454 Docker 资源限制之内存
http://www.jb51.net/article/103483.htm Docker容器内存限制的方法
http://os.51cto.com/art/201507/485007.htm Dockerfile命令介绍及实例