简介
由于最近在尝试插桩和fuzzing方面的各种工具,工具种类繁多且不是每一个都能用的上,如果每一个都配置一遍环境很麻烦,工具的repo上有不少提供了docker image的链接,故尝试使用docker。
此次环境为Mac Mojave。
docker相关概念
docker是一个便于开发,转移,运行应用程序的平台,可以将应用程序及其环境打包,与基础架构分离。但是由于只是包括了应用程序所需要用到的部分,且只虚拟化操作系统不虚拟化硬件环境,所以比虚拟机轻量很多。
一些概念
Image:Docker Image是一个轻量级,独立的可执行软件包,包含运行应用程序所需的一切:代码,runtime,系统工具,系统库和设置。
Container:当Image运行的时候,就会生成一个Container,可以将其理解为一个Image的实例。同一个image每次新生成的Container是相同的。这个Container可以暂停,终止,重启,和删除等。
安装及测试
- 在docker官网上下载Mac版本的docker应用程序,文件格式为dmg,与其他应用程序无异。
- 运行应用程序,当docker启动完成后,即可通过命令行输入docker指令。我们先输入
docker --version
查看版本。
输出无误后,再输入> docker --version Docker version 17.12.0-ce, build c97c6d6
docker run hello-world
下载image测试样例。
到这里安装成功。> docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world ca4f61b1923c: Pull complete Digest: sha256:ca0eeb6fb05351dfc8759c20733c91def84cb8007aa89a5bf606bc8b315b9fc7 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...
image和container的使用
咱们先分析一下docker run hello-world
进行了什么操作。
首先docker客户端联系docker后台程序在本地寻找image,没找到->后台程序连接docker hub下载image到本地->后台程序通过image创建新的container->后台程序执行container中的应用并将结果返回给客户端。
在这个过程结束之后,docker的container和Image中将留下创建的container和下载的Image。我们可以对其继续进行操作。
对于一个image来说,主要的操作在于查看,下载和删除Image。操作如下:
#显示本地的Images
> docker images #或docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 3 months ago 1.84kB
#删除一个本地Image(只有对应的Container都删除后才能删除)
> docker image rm fce289e99eb9 #最后一个参数是Image ID
Untagged: hello-world:latest
Untagged: hello-world@sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3
#下载新的Image
> docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest
对于Container来说,常用的命令比较多。除了与Image类似的之外,还有停止,提交,启动等。
#显示正在运行的Container(这个是我此时正在运行的另一个Image的Container)
> docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
484b4bc0ba72 moflow/afl-dyninst "/bin/bash" 3 hours ago Up 3 hours dreamy_ellis
#显示所有Container
> docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e6358c8b1a1 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago inspiring_zhukovsky
484b4bc0ba72 moflow/afl-dyninst "/bin/bash" 3 hours ago Up 3 hours dreamy_ellis
#删除一个Container 如果Container还在运行需要加-f选项
> docker container rm 6e6358c8b1a1 #最后一个参数是container的ID
6e6358c8b1a1
#创建一个新Container
> docker run hello-world #最后一个参数为Image的名称
# 创建一个新Container并指定执行指令
> docker run [Image_name] [Instruction]
# 如果需要拿shell并保持连接
> docker run -it [image_name] /bin/bash
#启动一个已有container并且将输入输出attach上去
> docker start -a 35257feacc81
#停止一个Container
> docker stop 35257feacc81
#提交一个Container使之生成一个新的Image
> docker commit 35257feacc81 my_image
文件传输
另外一个很重要的操作就是文件传输,支持双向传输,命令如下:
#其中mycontainer是container的ID
docker cp foo.txt mycontainer:/foo.txt
docker cp mycontainer:/foo.txt foo.txt
本次笔记就先到这里啦