Bootstrap

Docker之漫漫人生路

Docker尝鲜

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现 虚拟化。容器是完全使用 沙箱 机制,相互之间不会有任何接口。



1.Docker在开发和运维过程中,具有如下几个方面的优势



具体说来,Docker在开发和运维过程中,具有如下几个方面的优势。

更快速的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;比如在项目开发过程中我会先用Docker将代码部署到本地进行测试验证。使用Docker在本地轻松搭建出的和服务器类似的架构,使开发环境中的测试更贴近于生产环境。开发完成之后,测试和运维人员可以直接使用相同环境来部署代码。 Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。并且,各个步骤都有明确的配置和操作,整个过程全程可见,使团队更容易理解应用的创建和工作过程。


更高效的资源利用。 Docker容器的运行不需要额外的虚拟化管理程序(Virtual Machine Manager,VMM,以及Hypervisor)支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。


更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 利用这种兼容性让用户可以在不同平台之间轻松地迁移应用。


更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式进行分发和更新,从而实现自动化并且高效的容器管理。

2.Docker与虚拟机比较

作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:

Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。

Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。

Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。

Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。

Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N个不同的应用就要启动N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker只需要启动N个隔离的容器,并将应用放到容器内即可。

3.虚拟化容器的优势

随着公有云的普及,开发者越来越需要一个快速迁移和高速构建应用的环境。 现在开发者需要能方便地创建运行在云平台上的应用,也就是说应用必须能够脱离底层机器。 而且同时必须是方便获取的。因此,开发者们需要一种创建分布式应用程序的方式,这也是Docker所能够提供的。

举个例子: 我在项目中同一台服务器中同时运行了nginx,forum&wiki(node.js),meteor server(meteor.js)。每个服务又依赖大量的第三方库,如果用传统的方式进行部署。则需要安装大量的依赖模块,费时费力。假如我需要在国外的AWS及国内的阿里云上同时部署多台机器。或者从某个公有云服务商迁移到另外一个服务商。这中间的重复劳动是很让人抵触的。抛开让人生厌的重复劳动,服务之间也有可能因此互相“污染”导致性能下降甚至服务异常。而Docker提供了一种更为聪明的方式,通过容器来打包应用,意味着迁移只需要在新的服务器上启动需要的容器就可以了。这无疑将节约大量的宝贵时间,并降低部署过程出现问题的风险。

Docker安装

Docker tools box的安装与使用

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

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

双击运行后会出现三个图标


这里因为virtualBox不是最新的,导致安装出错,重新去官方网站下载就可以运行docker了

Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to create a network adapter. Sometimes, such confirmation window is minimized in the taskbar.
(default) Found a new host-only adapter: "VirtualBox Host-Only Ethernet Adapter #3"
(default) Windows might ask for the permission to configure a network adapter. Sometimes, such confirmation window is minimized in the taskbar.
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(default) Waiting for an IP...

这里出现了一个报错,是因为镜像boot2docker.iso不是最新的,所以报错,重去官网下载就好了。这里我没有科学上网,下了一个小时。

点击Docker Quickstart Terminal便可以运行docker

出现一只小鲸鱼就说明运行成功了

Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): Regenerating TLS certificates
Waiting for SSH to be available...
Detecting the provisioner...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...



                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

Start interactive shell

Andy@DESKTOP-A31E3JE MINGW64 ~
$ docker -h
Usage: docker [OPTIONS] COMMAND [arg...]
       docker [ --help | -v | --version ]

A self-sufficient runtime for containers.

Options:

  --config=%USERPROFILE%\.docker                                       Location of client config files
  -D, --debug                                                          Enable debug mode
  -H, --host=[]                                                        Daemon socket(s) to connect to
  -h, --help                                                           Print usage
  -l, --log-level=info                                                 Set the logging level
  --tls                                                                Use TLS; implied by --tlsverify
  --tlscacert=%USERPROFILE%\.docker\machine\machines\default\ca.pem    Trust certs signed only by this CA
  --tlscert=%USERPROFILE%\.docker\machine\machines\default\cert.pem    Path to TLS certificate file
  --tlskey=%USERPROFILE%\.docker\machine\machines\default\key.pem      Path to TLS key file
  --tlsverify=true                                                     Use TLS and verify the remote
  -v, --version

接下来就是打开docker

Andy@DESKTOP-A31E3JE MINGW64 ~
$ cd E:\Docker

Andy@DESKTOP-A31E3JE MINGW64 /e/Docker
$ ls
boot2docker.iso  docker_kali.mp4  DockerToolbox-1.12.5.exe*  kali.tar

Andy@DESKTOP-A31E3JE MINGW64 /e/Docker
$ docker import kali.tar kali
sha256:5a62e5b46f6136bb2a273314358d7de3c35a09e391b4d5f699bb489c74c45494

Andy@DESKTOP-A31E3JE MINGW64 /e/Docker
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
kali                latest              5a62e5b46f61        2 minutes ago       347.3 MB

Andy@DESKTOP-A31E3JE MINGW64 /e/Docker

$ docker attach kali                 //开启容器
You cannot attach to a stopped container, start it first

Andy@DESKTOP-A31E3JE MINGW64 /e/Docker
$ docker attach kali             //连接容器
You cannot attach to a stopped container, start it first

Andy@DESKTOP-A31E3JE MINGW64 /e/Docker

$ docker start kali              //进入docker

apt-get update && apt-get upgrade -y&&apt-get clean          //更新kali

docker run -i -t  -v /C/Users/49974:/root  -p :4444 -p :5555 -p :22 kali /bin/bash    //挂载目录

docker cp struts_code_exec_jakarta.rb kali:/usr/share/metasploit-framework/modules/exploits/multi/http //传输文件

docker run -i -t --net=host kali bash    //将镜像改用为host网络模式

docker run -i -t --name=kali1 --net=host -v /c/Users/49974:/root -p 8081:80  -p 8080:8080  -p 4444:4444  -p 5555:5555  -p 2222:22 kali /bin/bash   //以host网络模式下开启一个新的容器

msfdb init    //重启数据库

service postgresql start                 //开启数据库

docker设置的默认账号密码            //ssh 连接,winSCP连接

msf > db_connect
[*]    Usage: db_connect <user:pass>@<host:port>/<database>
[*]       OR: db_connect -y [path/to/database.yml]
[*] Examples:
[*]        db_connect user@metasploit3
[*]        db_connect user:[email protected]/metasploit3
[*]        db_connect user:[email protected]:1500/metasploit3





图形化管理出现问题的原因为以下:

启动Terminal窗口工具之后,我运行hello world报错了
$ docker run hello-world
docker: An error occurred trying to connect: Post http://127.0.0.1:2375/v1.22/co
ntainers/create: dial tcp 127.0.0.1:2375: connectex: No connection could be made
 because the target machine actively refused it..
See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.
上面问题的解决办法:经过多方查资料,可能的原因是本机安装的其他虚拟网络,如VMWare, VPN等可能造成网络冲突导致。因此我打算重建自定义网络,在重建之前,我打开"Oracle VM VirtualBox",删除了默认的default虚拟机和两个Host-only网络。本来打算执行一个命令来自定义创建的的,结果当我启动"Docker Quickstart Terminal"时,系统自动重建了虚拟机和网络,然后进入结果就OK了。因此,解决办法就是删除默认的虚拟机和网络,让系统帮你重建一次。

接下来更新源

apt-get update出现报错


在贴吧找到了问题所在处

http://tieba.baidu.com/p/5543689575?traceid=
我们也可以从GPG的密钥发布服务器上下载Kali的新公钥。是的,GPG 是有自己官方密钥发布服务器的。作为一个受信的仲裁方,GPG 在全球提供大量的密钥服务器,这些服务器之间会进行定期的数据同步,我们可以任选一个 GPG 密钥服务器来下载密钥。这些服务器也是我们用来验证密钥所有者的重要途径。
既然是Kali官方的密钥过期,那就需要 Kali 官方自己先更新一下,然后再把更新后的公钥发给我们。其实这件事Kali官方已经做了,但作为 Kali 系统使用者的我们,也要更新一下自己电脑中的对应公钥。


获得新的公钥可以有几种方法,我们可以到Kali官方的密钥下载站上自己下载,然后将下载的新公钥导入自己系统。这个过程可以通过系统命令直接完成,也可以手动下载后,再使用系统命令导入密钥。
具体更新方法有以下几种方法:(任选一种即可)
1、# apt-key adv --keyserver keys.gnupg.net --recv-keys ED444FF07D8D0BF6
2、# wget -q -O - archive.kali.org/archive-key.asc | apt-key add
3、# gpg --keyserver hkp://pgpkeys.mit.edu --recv-key ED444FF07D8D0BF6
# gpg -a --export ED444FF07D8D0BF6 | sudo apt-key add -
4、# wget https://http.kali.org/kali/pool/ ... ring_2018.1_all.deb
# apt install ./kali-archive-keyring_2018.1_all.deb
成功更新密钥之后,我们就可以正常的 update / upgrade 了。
开启容器 docker start <容器名>或者<id>

接下来就是安装 apt-get install metasploit-framework

这里要注意运行msfconsole需要下载perl运行vulEmu.pl

service.cfg加载出自己需要的模块

D:\管理\视频管理\渗透\Metasploit系列课程\metasploi系列课程1\metasploit-vulnerability-emulator>perl vulEmu.pl
>>act auxiliary/scanner/http/concrete5_member_list
listening on port 80
>>can't find a match for request GET / HTTP/1.1
Host: 192.168.211.137
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

 of size 384
can't find a match for request GET /robots.txt HTTP/1.1
Host: 192.168.211.137
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

 of size 282

这样你就可以在docker运行你的渗透大杀器了

好了开篇就介绍完了。接下来还要慢慢学习docker。

----------------------------------------------------------------------------------------------


msfconsole连接不上数据库?

重装一遍metasploit,没效果,以为是端口问题再次重装,没想到还是


然后在重装过程中发现


网上查找了相关资料https://parrotsec-china.org/t/metasploit/95

解决:

grep "port =" /etc/postgresql/9.6/main/postgresql.conf
如果你看到端口不是5432,就改成5432,如果你的端口是5433,使用这条命令去升级

sed -i 's/\(port = \)5433/\15432/' /etc/postgresql/9.6/main/postgresql.conf
重启 postgresql 服务

service postgresql restart
重新初始化msf数据库

msfdb reinit

重装成功



-----------------------------------------------------------------------------------------------------

pentestbox的安装与连接数据库

修改两个文件

E:\PentestBox\bin\metasploit-framework\config\database.yml


E:\PentestBox\bin\customtools\customaliases


  database: msf       //新建的数据库名称
  username: postgres  //数据库用户
  password: root    //数据库用户的密码
  db_connect postgres:root@localhost/msf          //账号postgres密码root localhost本机   msf数据库
  db_status          //数据库状态



------------------------------------------------------------------------------------------------------------

安装mono


apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF


echo "deb http://download.mono-project.com/repo/debian wheezy main" | tee /etc/apt/sources.list.d/mono-xamarin.list


echo "deb http://download.mono-project.com/repo/debian wheezy-apache24-compat main" | tee -a /etc/apt/sources.list.d/mono-xamarin.list

echo "deb http://download.mono-project.com/repo/debian wheezy-libjpeg62-compat main" | tee -a /etc/apt/sources.list.d/mono-xamarin.list

apt-get update


apt-get install mono-devel mono-complete referenceassemblies-pcl ca-certificates-mono

docker后续

记一些常用的命令以及这几天学习docker的心得

今天开启容器kali发现还是一样卡死,在和一个学长交流才明白,这是因为docker attach惹的祸


1.docker ps                                    查看正在运行的容器
2.docker ps -a                                查看所有容器(包括已终止)
3.Ctrl-q + Ctrl-p                             退出不结束(连续按Ctrl+q和Ctrl+p)
4.docker run -it -v /localDir:/dockerDir image(rna:v1.7) /bin/bash                         挂载本地路径到docker内 其中localDir为一个本地路径,dockerDir为docker虚拟机内路径,image为一个现有镜像,格式为name:tag
docker start containername        重新启动一个结束的容器,containername为查看容器时最后一列NAME

5.docker run ubuntu echo "hello world"       使用image创建container并执行相应命令,然后停止

6.docker run -i -t --name mytest centos:centos6 /bin/bash    使用image创建container并进入交互模式, login shell是/bin/bash

7.docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID            查看容器的内部IP

8.开启/停止/重启container(start/stop/restart)
容器可以通过run新建一个来运行,也可以重新start已经停止的container,但start不能够再指定容器启动时运行的指令,因为docker只能有一个前台进程。
9.容器stop(或Ctrl+D)时,会在保存当前容器的状态之后退出,下次start时保有上次关闭时更改。而且每次进入attach进去的界面是一样的,与第一次run启动或commit提交的时刻相同。

10.在docker内exit  结束退出, 退出的容器还可以再次进入

11.docker attach containername 进入一个容器(已启动但未进入或者退出没有结束状态的容器,docker ps 中所列所有容器均是此状态)docker commit kali KALI  当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。docker中保存状态的过程称之为committing,它保存的新旧状态之间的区别,从而产生一个新的版本。

docker stop $CONTAINER_ID
docker restart $CONTAINER_ID


参考:https://www.cnblogs.com/ginponson/p/8601320.html
;