利用Docker 搭建你的靶机环境

一、Docker 容器

1.1 首先说下docker 是什么 

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,

然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

1.2 安装Docker 

Centos 7 

[root@linux-node2 ~]# yum install -y docker
[root@linux-node2 ~]# systemctl start docker

Centos6 默认内核是2.6.32 不支持Docker  所以需要升级内核为3.0 

升级内核 (带aufs模块

cd /etc/yum.repos.d 
wget http://www.hop5.in/yum/el6/hop5.repo
yum install kernel-ml-aufs kernel-ml-aufs-devel

 修改grub的主配置文件/etc/grub.conf,设置default=0,表示第一个title下的内容为默认启动的kernel(一般新安装的内核在第一个位置)。

查看一下是否升级成功

[root@localhost ~]# uname -r
3.10.5-3.el6.x86_64

查看内核是否支持aufs:

[root@localhost ~]# grep aufs /proc/filesystems
nodev    aufs

安装Docker 

rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
sed -i 's/^mirrorlist=https/mirrorlist=http/' /etc/yum.repos.d/epel.repo
yum -y install docker-io
service docker start

乌班图安装Docker

乌班图系统是自带了docker 的镜像可以直接安装的

$ sudo apt-get update
$ sudo apt-get install -y docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io

如果需要安装最新版本的Docker 那么就需要

安装 apt-transport-https,并添加 Docker 官方源:

$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7
869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/
sources.list.d/docker.list"
$ sudo apt-get update

之后,可以通过下面的命令来安装最新版本的 Docker:
$ sudo apt-get install -y lxc-docker

在安装了 Docker 官方软件源后,若需要更新 Docker 软件版本,只需要执行以下命令即可升级:
$ sudo apt-get update -y lxc-docker

可以通过docker -v 查看docker 版本

1.3 Docker 的使用

其实Docker 容器是真的很简单的。就是需要你花个一两天的时间去尝试和理解 但是那种集群的K8S就是比较复杂了

这里暂不涉及K8S的知识,就是简单的教你们如何弄一个靶机环境=。= 

1.3.1 Docker 镜像管理

push 一个Centos 镜像

[root@linux-node2 ~]# docker pull centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ... 
latest: Pulling from docker.io/library/centos
af4b0a2388c6: Pull complete 
Digest: sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d

查看镜像

[root@linux-node2 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              ff426288ea90        16 hours ago        207.2 MB

导出镜像

[root@linux-node2 ~]# docker sava centos >/opt/Centos.tar.gz

也可以导入

[root@linux-node2 ~]# docker load < /opt/Centos.tar.gz

删除镜像  

[root@linux-node2 ~]# docker rmi ff426288ea90

1. 4  创建启动容器

[root@linux-node2 ~]# docker run centos /bin/echo "hello world"
hello world
[root@linux-node2 ~]#

这种创建之后的容器会执行完你执行的代码之后就会自动关闭的 如果不想不让他关闭就可以加一个-d 的参数  或者  -t -i 进入这个里面去  

那么如何进入这个容器之内呢?

[root@linux-node2 ~]# docker run --name mydocker -t -i centos /bin/bash
[root@aff216047fcf /]#
[root@aff216047fcf /]# exit
exit

上述就是方法

退出之后容器是成为exit的状态。那么如何启动关闭的容器

查看一下现在没有启动的容器 

[root@linux-node2 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
163cde815719        centos              "/bin/bash"              5 minutes ago       Exited (0) 3 minutes ago                        mydockera
aff216047fcf        centos              "/bin/bash"              7 minutes ago       Exited (0) 6 minutes ago                        mydocker
ff2af6544380        centos              "/bin/echo 'hello wor"   10 minutes ago      Exited (0) 10 seconds ago                       stoic_feynman
[root@linux-node2 ~]#

启动容器

[root@linux-node2 ~]# docker start ff2af6544380
ff2af6544380

查看

[root@linux-node2 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
aff216047fcf        centos              "/bin/bash"         9 minutes ago       Up 31 seconds                           mydocker
[root@linux-node2 ~]#

那么怎么再次进入这个容器之内呢?   

这里给了一个脚本

[root@linux-node2 ~]# cat ns.sh 
#!/bin/sh

PID=$(docker inspect --format "{{.State.Pid}}" $1)
nsenter -t $PID -u -i -n -p

测试一下

[root@linux-node2 ~]# ./ns.sh 163cde815719
[root@163cde815719 ~]# 
[root@163cde815719 ~]# 
[root@163cde815719 ~]# ifconfig

容器已经弄好了。那么如何搭建一个测试环境呢? 首先我们要理解一下容器的存储和网络。这个可能有点绕。但是如果明白这点之后。以后对容器之间的通信就更好理解了

二、Docker 存储和网络

2.1 网络 

查看一下iptables 发现会有一个有很多规则。那个是docker自动创建的。

[root@linux-node2 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 360 packets, 24880 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   19  4036 DOCKER-ISOLATION  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
   10  1326 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    9  2710 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 340 packets, 23116 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
   10  1326 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.4           tcp dpt:80

Chain DOCKER-ISOLATION (1 references)
 pkts bytes target     prot opt in     out     source               destination         
   19  4036 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           
[root@linux-node2 ~]#

查看一下那个桥接的端口 发现有一个docker0 的地址转换

[root@linux-node2 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242fce799ba       no              vetha4cea7d
                                                        vethc44c41e
                                                        vethee5c44a
[root@linux-node2 ~]#

那么我们下载一个nginx 的镜像

[root@linux-node2 ~]# docker pull nginx

启动

[root@linux-node2 ~]# docker run -d -P nginx 
abbce8ddf4a0d34da163228d33316054efb214726f24cc32e37106b8260ee250

查看一下容器发现有一个端口映射

[root@linux-node2 ~]# docker ps -a  -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
abbce8ddf4a0        nginx               "nginx -g 'daemon off"   5 minutes ago       Up 5 minutes        0.0.0.0:32768->80/tcp   tender_brown
[root@linux-node2 ~]#

物理机的32768 端口映射到容器的80端口,那么可以直接访问本机的32768端口查看到容器的80端口。在浏览器访问一下即可

查看nginx的容器的日志

[root@linux-node2 ~]# docker logs abbce8ddf4a0
192.168.57.1 - - [09/Jan/2018:13:54:12 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36" "-"
2018/01/09 13:54:13 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.57.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.57.145:32768", referrer: "http://192.168.57.145:32768/"
192.168.57.1 - - [09/Jan/2018:13:54:13 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://192.168.57.145:32768/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36" "-"
[root@linux-node2 ~]#

指定端口启动容器

[root@linux-node2 ~]# docker run -d -p 81:80 nginx
b74843b3027b7a5b8c50b4ca936f504284f4f3389eb5a4058ab773fe0fa61703
[root@linux-node2 ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
b74843b3027b        nginx               "nginx -g 'daemon off"   29 seconds ago      Up 28 seconds       0.0.0.0:81->80/tcp      boring_cori