




————————————————
1:docker简介
“怒发冲冠,凭栏处、潇潇雨歇。抬望眼、仰天长啸,壮怀激烈。三十功名尘与土,八千里路云和月。”
Docker是一个开源的容器平台,使用容器镜像,可以轻松的创建虚拟化环境。Docker的容器镜像是轻量的,可执行的独立软件包,包含软件运行所需的所有内容:代码,运行时的环境,系统工具,系统库和设置。Docker与我们常用的VM功能很像,都是通过镜像来创建虚拟化环境。
Docker和VM各有优势,对于我们安全从业人员而言,相较于VM,docker创建虚拟化环境的速度更快,在linux命令行界面下操作更加简便,可轻松地将虚拟化环境打包成镜像,也可通过镜像批量化生成多个虚拟化环境。
Docker由三个简单概念组成:镜像,容器,仓库。学过语言的同学就可以很好的理解这几个概念,比如镜像就像是语言中的类一样,容器是镜像的实体,仓库是存放镜像的地方。(概念不需要死记,实际操作一遍就懂了)
注意,这篇文章会比较长,因为后面包含一些我踩坑的经历和总结。
2:docker安装
Linux系统分为两种:
1.RedHat系列:Redhat、Centos、Fedora等。
2.Debian系列:Debian、Ubuntu等。
3.RedHat系列的包管理工具是yum,Debian系列的包管理工具是apt-get。
4.以Centos为主的yum源安装:
yum update //更新软件源
yum upgrade //更新软件
yum -y install docker-io /安装docker
5.以Ubuntu为主的apt源安装;
apt-get update //更新软件源
apt-get install -y docker.io //安装docker
6.我是用apt源进行安装的,安装后启动docker,调用docker version命令查看是否安装成功,发现最后有一个permission denied。这个是因为我们安装的时候是用的sudo安装,在这里是没有权限连接docker的服务端的,解决办法是把当前用户加入到docker组里面去。

解决方法:首先创建一个docker组,但是很可能已经有了docker组,已有就不用管了,继续下一步,把当前用户加入docker组,重启docker,最后一步,切换会话到新group,最后一步是必须的,如果不切换,组信息不会立刻生效的,最后在用docker version测试效果。
命令代码:
1 sudo groupadd docker
2 sudo gpasswd -a ${USER} docker
3 sudo service docker restart
4 newgrp – docker
5 docker version

测试docker的功能也可以通过 docker run hello-world 来检测功能是否正常

3:搭建Apache服务器
拉取Ubuntu镜像:首先我们搜索Ubuntu,可以找到不同类型的镜像:

拉取18.04版本的Ubuntu镜像到本地:

通过命令 docker images 可以查看下载的镜像:(可以看到下载的镜像大小是轻量级别的,只有六十多MB。)

下载镜像后,就可以根据镜像id,也就是IMAGE ID 来创建虚拟环境了,由run命令来进行创建,后接参数,下面简单介绍一下各个参数的含义:
-i:以交互模式运行容器,通常与-t同时使用;
-t:为容器重新分配一个伪输入终端,通常与-i同时使用;
-d:后台运行容器,并返回容器ID;
-p:随机端口映射,容器内部端口随机映射到主机的高端口;
//如果不使用-d参数,会直接进入到生成的容器中去。
//下图中Apache服务默认为80端口,使用-p参数将80端口映射到宿主机的8080端口,我们访问主机的8080端口就相当于访问虚拟机的80端口了。

创建虚拟环境后,先ps查看一下后台运行的容器,再使用容器的ID进入容器,注意,此时命令符显示已经进入容器,权限为root。

接下来尝试在虚拟机中安装apache,但在这里我踩了一个大坑(花了将近两个小时才弄好)。
首先,进行源更新,命令 apt-get update,却发现更新源的网络进度始终为0%,就将错误提示复制后,在网上找答案,发现了几种解决方法:
第一种:有网友提示找不到更新源,是因为dns解析错误,,要添加dns服务器到/etc/resolv.conf文件中,但当我用vim进行添加时,发现vim命令没有找到(头大),就只能用echo命令进行添加了,尝试命令如下:
vim /etc/resolv.conf
echo ‘xxx.xxx.xxx.xxx’ >>/etc/resolv.conf /*注意 ‘>’表示覆盖写,‘>>’表示追写;‘xxx.xxx.xxx.xxx’表示dns服务器地址。修改了过后,还是连接不到更新源。 */
第二种:有网友提示更新源连接不到,是更新源的问题,可以通过更换新的更新源进行操作,就是添加更新源到 /etc/apt/sources.list ,还是通过echo进行添加(vim无法使用),常见更新源如下,也可以自己去网上找:
deb http://mirrors.aliyun.com/ubuntu/ raring main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ raring-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ raring-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ raring-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ raring-backports main restricted universe multiverse
遗憾的是,换了更新源后,还是连接不到,无法进行apt源的更新。
第三种:网上大多都是前两种方法之一,后来,我去csdn上看了看,发现还有重启一下docker就行了的,命令是 systemctl restart docker,但在我这里还是不行,于是我看到了另一种说法:前面,我们提到过,docker是一种类VM的软件,但它是轻量级的,这也说明,它也具有VM的一些属性,也就是它的容器其实是有ip的(神不神奇),通过docker inspect ID即可看到相应容器的ip:


我们重点关注容器的ip和gw(网关),那么同VM一样,docker里的容器要联网,就必须通过宿主机,那么此时docker里的容器应该和宿主机是能ping通的,但不幸的是,我ping了一下,发现二者并不想通。(终于找到了原因所在),于是我在宿主机上添加了docker里容器的静态路由,最后再次进入docker里的容器,成功完成更新。(退出docker用 exit,重新进入docker用exec。)



注意:如果添加静态路由后进入,还是不行,可以先重启一下docker,命令 systemctl restart docker ,重启后重新构建虚拟环境(run命令),最后进行更新,即可成功。
小结:在这次长达两个多小时的踩坑过程中,说一下我的感受:踩坑是学习必然的途径,在这次踩坑中我学到了很多,比如说一些重要文件是干什么用的,dns配置文件,更新源配置文件,vim命令不可用时,echo可以代替部分功能……对docker也了解的更深了,其命令的掌握程度也更熟练了,最后说一下,踩坑确实对人的身体和心灵都是一种折磨。
接下来的任务就比较简单了:执行搭建apache2+php7的环境:
1 apt-get update //更新软件列表
2 apt-get install apache2 //安装apache2
3 apt-get install php7.0 //安装php7
4 apt-get install libapache2-mod-php //将php与apache关联
5 service apache2 start //启动apache2服务
成功完成后,访问宿主机8080端口,通过地址转换到Ubuntu的80端口,打开首页,apache服务正常:


在Apache的/var/www/html 下创建test.php文件,进行再次测试:

搭建环境成功,最后,我们在进行生成镜像的操作。
4:生成镜像
当我们使用镜像生成容器后,对容器进行的操作并不会影响到镜像,因此我们可以随时用一个镜像生成多个“干净”的虚拟容器。
如果需要保存容器的配置,需要让容器反向生成镜(先stop掉,再进行封装)。
命令:
docker stop ID
docker commit -a “Monster” -m “test” ID apache-test:v1
参数说明:
-a:提交的镜像作者。
-c:使用dockerfile指令创建镜像。
-m:提交时的说明文字。

使用我们提交的镜像后,就可以直接生成多个已配置好的虚拟环境了。(坑:生成镜像时最好加-d参数,这样当我们退出容器时,容器还存在后台,否则退出后,容器就没了。上面生成容器时,还有个坑,没有先stop容器。)
5:docker总结
1 启动 docker service docker start
2 下载镜像 docker pull ‘xxx’
3 查看下载的镜像 docker images
4 查找镜像 docker search ‘xxx’
5 构建容器 docker run -it -d -p port:port ID
6 启动容器 docker start ID
7 停止容器 docker stop ID
8 删除容器 docker rm ID
9 查看运行容器 docker ps -a
10 进入容器 docker exec -it ID bash
//注意,作为一个合格的程序员,排序时牢记从0开始计数,我这里是一个错误示范。
“莫等闲、白了少年头,空悲切。靖康耻,犹未雪。臣子恨,何时灭。驾长车,踏破贺兰山缺。壮志饥餐胡虏肉,笑谈渴饮匈奴血。”
1
END
1




