2018/8/9 10:29
前言
本篇介绍Docker的基础使用。
大家一定或多或少地听说过“Docker”吧??!
1.搭靶场,会有专门的docker搭建;
2.有的服务器甚至直接将Docker当作服务器来运营;
3.CTF中,为了方便,很多形形色色的系统都会直接使用轻量级的docker来完成相关任务。(因为这些系统镜像的docker版本非常非常小,docker比绝大多数虚拟机安装杂七杂八的系统方便得多)
目前笔者见到的CTF题目直接用到的docker
1.符号执行(angr),
2.恶意代码分析(remnux),
3.ELF题目中曾用到陌生的RISC-V系统,
等等,docker是最好的解决办法。
以下为学习 docker 需要具备的基础知识(资料来源:百度)。
(笔者注:这里是纯文本,强烈建议详细阅读本文所有内容,动手复现本文命令,既可以掌握docker的基础用法了。枯燥是学习的必经之路)
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
一个完整的Docker有以下几个部分组成:
1.dockerClient客户端
2.Docker Daemon守护进程
3.Docker Image镜像
4.DockerContainer容器
Docker架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。 [3]
以下为笔者重编的docker命令学习资料(资料来源:菜鸟教程):
大家在自己的linux中输入docker查看是否有docker,没有的话需要安装以下docker(注:ubuntu内核高于3.10才支持docker):
Ubuntu安装:查看内核是否高于3.10:uname -r
获取最新的Docker安装包:wget -qo- https://get.docker.com/ | sh
启动Docker后台服务:
service docker start
测试运行hello-world:
docker run hello-world
使用docker run命令在容器中运行一个程序:
docker(docker的二进制执行文件) run(与docker组成容器)ubantu:15.10(镜像) /bin/echo "Hello world"(启动的容器中执行命令)
运行交互式的容器:
docker run -i(允许对容器内标准输入交互) -t(新容器内指定一个伪终端或终端) ubantu:15.10 /bin/bash
交互后可直接输入命令查看容器
以进程方式创建一个容器:
docker run -d(让程序在后台运行) ubuntu:15.10 /bin/sh -c "while true; do echo hello world;sleep 1; done"
返回容器ID的长字符串
确认是否有容器在运行
docker ps
查看容器的标准输出:
docker logs (容器IDor 自动分配的名字)
停止容器:
docker stop (可选:写ID或name)
请求帮助:
docker(没错,只输入这个单词即可显示help信息)
docker command --help(更深入一些)
docker stats --help
docker容器中运行一个Python Flask应用运行一个WEB应用:
docker pull training/webapp #载入镜像
docker run -d -P(将容器的网络端口映射到主机上) training/webapp python app.py
docker ps(会发现多了端口的信息(docker默认开放了python flask的端口被映射))
docker run -d -p 5000:5000(-p参数可指定) training/webapp python app.py
docker ps(查看端口是否被映射到正确位置)
可单独直接查看端口信息的命令:docker port (ID或名字)
查看WEB应用程序日志:
docker logs -f(类似linux的tail -f) (ID或名字)
查看web应用的进程:
docker top determined_swanson
检查WEB应用程序:docker inspect determined_swanson(会返回一个JSON文件记录着Dokcer容器的配置和状态信息)
停止WEB应用程序:docker stop determined_swanson
重启WEB应用程序:docker start determined_swanson
docker ps -l(查询最后一次创建的容器)
docker restart(对正在运行的程序可重启)
移除WEB应用容器:docker rm determined_swanson(删除容器时,容器必须时停止状态)
查看本地主机上的镜像:docker images
指定15.10的ubuntu运行容器:dockerrun -t -i ubuntu:15.10 /bin/bash
(不指定一个镜像的版本标签的话,默认使用ubuntu:lastest镜像)
获取新的镜像:docker pull ubuntu:13.10
更新镜像(需要创建一个新的容器):docker run -t -i ubuntu:15.10 /bin/bash
在内部:apt-get update 然后:exit
设置镜像标签:docker tag 860c279d2fec(容器ID)runoob/centos:dev
-P :是容器内部端口随机映射到主机的高端口。
-p : 是容器内部端口绑定到指定的主机端口。
上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp
当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用--name标识来命名容器,例如:
docker run -d -P --name runoob training/webapp python app.py
领取专属 10元无门槛券
私享最新 技术干货