笔记之docker的使用

TL;DR

  • 好久没有更新了,主要比较忙:( 以前只是简单的使用,前段时间相对较”近距离”接触了下docker,发现用来搭建漏洞环境真的很方便。尤其是Dockerfile和docker-compose分别用来构建定制镜像和管理多个容器的功能让我非常惊讶,当然期间也踩了一些坑,把这些坑记录一下。

    简述

  • 什么是docker,docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
  • 如上图所示计算机的发展经历了从物理机到虚拟机的过程,最后出现了共享底层OS的容器。
  • docker里面有两个概念需要稍微理解一下,Image(镜像)和Container(容器),他们两个的关系就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。
  • Docker在Mac上的基本安装

    基本常用命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    docker images 查看当前的镜像
    docker ps -a 查看当前的容器
    docker ps -a 有时候我们想要看完整的COMMAND的时候 可以添加参数 - - no-trunc
    docker exec -i -t CONTAINER ID /bin/bash 进入对应容器
    docker start/stop/rm CONTAINER ID 开始/停止/删除某个容器
    docker rmi -f IMAGE ID 强制删除某个镜像
    docker stop $(docker ps -aq) 停止所有容器
    docker rm $(docker ps -aq) 删除所有容器
    docker rmi $(docker images -q) 删除所有镜像
    docker search xxx 查找xxx镜像
    docker pull xxx 获取xxx镜像 默认是latest
    docker-compose build --no-cache 每次构建的时候不使用cache 或者在写dockerfile的时候添加或者修改一条无关紧要的命令,这样也会强制build,而不使用cache

以上是常用的命令,还有就是跟着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命令进行本地拷贝。
  • 在centos7可能会遇到Docker error IPv4 forwarding is disabled的问题,参考链接
  • 开始的时候不建议使用最精简的linux系统,不然你会发现怎么连个vi命令都没有,什么都还得需要 RUN 安装,比较麻烦。centos7 最小化安装之后,默认是没有 ifconfig,netstat等命令,可以直接使用 yum -y install net-tools 安装即可。
  • 有时候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 赋予文件不可修改属性的时候,当你关闭容器,一般容器并不会主动保存,除非你主动打包成镜像,所以它会去删除这个文件以保持“镜像不变性质”(暂且先这么叫吧),这个时候会去删除这个文件,因为设置了不可修改属性,这个时候就会报错,如下图所示.

    Finally

  • 最后还是多写或多修改几个Dockerfile和docker-compose.yml实际去体验一下,你会发现用他们来搭建漏洞环境very棒 ;P
  • 当然docker的应用不仅仅是搭建漏洞环境,技术也不仅仅有Dockerfile、docker-compose,还有更多与docker相关优秀的开源项目像是Kubernetes、CoreOS、Etcd项目等。