笔记之docker的使用

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
2
3
4
5
6
7
8
9
10
11
12
容器操作常用命令
docker ps -a #查看所有容器(包括已停止的),--no-trunc 参数
docker run –it -name centos-test centos /bin/bash #启动容器
docker attach/exec #进入容器,推荐使用exec,因为此命令会退出容器终端,但不会导致容器的停止。
docker inspect #查看docker的底层信息,记录容器的配置和状态等。
docker start/stop/rm containerid #开始/停止/删除某个容器
docker stop $(docker ps -aq) #停止所有容器
Docker rm containerid #删除容器
docker logs #查看容器内部的标准输出
docker top #查看容器内部运行的进程
docker-compose build --no-cache #每次构建的时候不使用cache 或者在写dockerfile的时候添加或者修改一条无关紧要的命令,这样也会强制build,而不使用cache
docker stats #查看docker容器占用资源情况

以上是常用的命令,还有就是跟着Docker — 从入门到实践基本操作一下没什么问题。

Tips 之Dockerfile和docker-compose

  • docker-compose helloworld版

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dockerfile
    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
    9
    version: '2'

    services:
    c1:
    image: centos:7
    command: /usr/sbin/init
    c2:
    image: centos:7
    command: /usr/sbin/init
  • docker-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项目等。