TL;DR
- 好久没有更新了,主要比较忙:( 以前只是简单的使用,前段时间相对较”近距离”接触了下docker,发现用来搭建漏洞环境真的很方便。尤其是Dockerfile和docker-compose分别用来构建定制镜像和管理多个容器的功能让我非常惊讶,当然期间也踩了一些坑,把这些坑记录一下。
简述
- 什么是docker,docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
- 如上图所示计算机的发展经历了从物理机到虚拟机的过程,最后出现了共享底层OS的容器。
- docker里面有两个概念需要稍微理解一下,Image(镜像)和Container(容器),他们两个的关系就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。
- Docker在Mac上的基本安装
常用命令
1
2
3
4
5
6
7
8#镜像操作常用命令
docker images #查看当前的镜像
docker search xxx #查找xxx镜像
docker push/pull xxx #获取xxx镜像 默认是latest
docker inspect image #查看镜像的相关信息 主要要加上image的TAG
docker commit #更新镜像 –m:提交的描述信息 –a :指定镜像作者
docker build #从零开始构建一个新的镜像,需要创建Dockerfile文件来包含一组指令来告诉docker如何构建我们的镜像。
docker rmi $(docker images -q) #删除所有镜像
1 | 容器操作常用命令 |
以上是常用的命令,还有就是跟着Docker — 从入门到实践基本操作一下没什么问题。
Tips 之Dockerfile和docker-compose
docker-compose helloworld版
1
2
3
4
5
6
7
8
9
10dockerfile
FROM centos:centos7
CMD ["/sbin/init"] //注意这里这个一定要有,否则docker-compose up -d 的时候会马上退出
docker-compose.yml
version: '2'
services:
helloworld:
build: .
container_name: helloworld在一个docker-compose可以开启多个相同image的service,例如
1
2
3
4
5
6
7
8
9version: '2'
services:
c1:
image: centos:7
command: /usr/sbin/init
c2:
image: centos:7
command: /usr/sbin/initdocker-compose.yml 中version的释义就是compose的高版本需要高版本的docker engine支持,docker engine版本可以通过docker version命令查看。具体的对版本表见下图
- 如果想要在docker中运行多个后台程序,比如apache的web服务和ssh的服务,可以使用supervisord。更多可以参考链接
- 在由phith0n维护的vulhub项目里有很多Dockerfile,覆盖了绝大部分常用应用,非常方便修改和使用。且设计比较合理,web代码基本都是通过挂载www目录的方式进行部署,调试和部署起来非常的方便,基本就是docker-compose bulid 和docker-compose up -d 两条命令的事儿。
- 把宿主机的一个目录挂载到容器中,当访问容器中的这个目录时,出现如下问题: ls: cannot open directory .: Permission denied 这个问题可以参考文章docker挂载目录失败/权限拒绝 解决方案
- 有时候docker-compose up -d 的时候 容器马上exit,这个时候一般是启动出现了问题,可以通过 docker-compose up 或者docker-compose —verbose up通过查看详细的输出信息定位具体是哪里出问题了。
- 在向docker中放shell脚本的时候 需要在外部添加可执行权限。
- 在开启容器的时候如果需要执行多个命令,而且多个命令如果是”阻塞”的,可以在docker-compose.yml 文件中写入ENTRYPOINT 例如[“/usr/local/bin/docker-entrypoint.sh”],这样在容器启动的时候会自动的运行docker-entrypoint.sh shell脚本里面可以写你想要其运行的多条命令。
- 有些镜像或者外部的资源下载比较的慢,这个时候使用proxychains给终端挂上代理,或者把资源下载到本地,在Dockerfile里面使用COPY命令进行本地拷贝。再有就是有时候pip安装的python库的时候下载失败时候可以使用 pip install -r $d/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ 来提高下载速度
- 在centos7可能会遇到Docker error IPv4 forwarding is disabled的问题,参考链接
- 开始的时候不建议使用最精简的linux系统,不然你会发现怎么连个vi命令都没有,什么都还得需要 RUN 安装,比较麻烦。centos7 最小化安装之后,默认是没有 ifconfig,netstat等命令,可以直接使用 yum -y install net-tools 安装即可。
- 有时候在使用docker-compose up -d 报错 network
not found,网络找不见,这个时候可以加参数 –force-recreate 即 docker-compose up -d –force-recreate - 有时候mysql就是起不来,这个时候 使用docker volume list查看 然后删除数据就可以了,其它情况也是 全部删除,参考链接,docker volume rm 就可以删除对应的数据库了。
- pull回来的镜像如果想修改其中的用户密码,可以在Dockerfile中写如下的命令 RUN echo “root:Docker!” | chpasswd或者RUN echo “Docker!” | passwd –stdin root 即修改root的密码为Docker!。stackoverflow
- 在此记录一下,不知道是不是docker的一个bug,当我在虚拟机里面创建一个文件,并且通过chattr +i 赋予文件不可修改属性的时候,当你关闭容器,一般容器并不会主动保存,除非你主动打包成镜像,所以它会去删除这个文件以保持“镜像不变性质”(暂且先这么叫吧),这个时候会去删除这个文件,因为设置了不可修改属性,这个时候就会报错,如下图所示.
- docker-compose时候报错 ERROR: invalid reference format,有可能是路径中包含中文所导致的
- docker-compose时候报错 ERROR:could not find an available,non-overlapping IPv4 address pool among the defaults to assign to the netowrk,可能是你创建的网络达到了最大限制,可以使用docker network prune命令去删除一些不用的网络。
- 通过容器提交镜像(docker commit)以及推送镜像(docker push)笔记
- docker push时即使账户密码正确也显示 [denied: requested access to the resource is denied]
Finally
- 最后还是多写或多修改几个Dockerfile和docker-compose.yml实际去体验一下,你会发现用他们来搭建漏洞环境very棒 ;P
- 当然docker的应用不仅仅是搭建漏洞环境,技术也不仅仅有Dockerfile、docker-compose,还有更多与docker相关优秀的开源项目像是Kubernetes、CoreOS、Etcd项目等。