- 什么是Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
现在越来越多的环境搭建都使用的是Docker,因为它部署方便、安全、并且在Docker上有很多的镜像供大家下载。例如现在有很多的CTF的比赛的环境几乎都是用Docker搭建的。还有很多的漏洞复现环境我们也都可以从Docker上面直接下载使用。
Docker的一些基本概念
概念 | 说明 |
---|---|
镜像 | 用于创建Docker容器的模板,就像我们安装虚拟机也需要镜像一样 |
容器 | 根据镜像创建的一组应用,是镜像运行时的实体(就是像是编程语言中类和对象的关系) |
仓库 | Docker仓库用来保存镜像,每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签,这也是很多时候按照网上的教程按照环境时候容易出现错误的地方。 |
Dockerfile | 一种构造镜像的文件的DSL |
在Linux上安装Docker
我这里面用的是kali,至于其他的情况可以到菜鸟教程去看看。
PS:kali安装Docker是跟其他的Linux是不一样的,其他的可以看一下菜鸟教程的(站长真的人很好,一个人维护全站,真的无私)
apt-get update
apt-get install -y apt-transport-https ca-certificates
apt-get install dirmngr
//step 2
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80
--recv-keys 58118E89F3A912897C070ADBF76221572C52609D
//step 3
echo 'deb https://apt.dockerproject.org/repo debian-stretch main' >
/etc/apt/sources.list.d/docker.list
//step 4
apt-get update
apt-get install docker-engine //这一步得等很久。。
//step 5
service docker start //启动docker服务即可
参考:
https://www.jianshu.com/p/f246e4e37bf7
service docker start
docker version执行一下看看有没有具体的版本信息。

Docker的使用
- 在Docker中利用容器运行应用程序
例如docker run ubuntu:18.04 /bin/echo "Hello World"
这里面解释一下几个参数
参数 | 说明 |
---|---|
docker | Docker的二进制执行文件 |
run | 与前面的docker组合来运行一个容器 |
/bin/echo "Hello World" | 在启动的容器里执行的命令 |
当然运行容器是需要镜像的,我们这里面使用的是ubuntu:18.04
这个镜像。Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
- 运行交互式的容器
利用-i -t
就可以做到
docker run -i -t ubuntu:18.04 /bin/bash

输入exit
或者CTRL +D
即可退出。
- 启动容器(后台模式)
使用以下命令创建一个以进程方式运行的容器
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
屏幕会输出一个字符串,这个就是容器的ID,可以通过容器ID查看对应容器发生了什么。
docker ps
查看容器状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb8adbec2cea ubuntu:18.04 "/bin/sh -c 'while..." 9 seconds ago Up 8 seconds boring_jennings
参数解析
参数 | 说明 |
---|---|
CONTAINER ID | 容器ID |
IMAGE | 使用的镜像 |
COMMAND | 启动容器时运行的命令 |
CREATED | 容器创建的时间 |
STATUS | 容器状态 |
docker logs fb8adbec2cea
通过容器ID查看对应容器内部的输出日志。
docker stop fb8adbec2cea
关闭对应ID的容器
容器的使用
- 使用镜像启动一个容器(交互式的操作)
docker run -it ubuntu:18.04 /bin/bash
exit
即可退出
- 启动已经停止的容器
在Docker中停止的容器并没有被删除,我们还可以去重新启动
docker ps -a
查看所有的容器
docker start 容器ID
即可启动
docker run -itd --name QAQ ubuntu:18.04 /bin/bash
后台运行
docker restart ID
重启容器
- 进入容器
使用-d参数时,容器进入后台。此时可以进入容器。
docker attach ID
退出时容器停止
docker exec -it ID /bin/bash
退出时容器不会退出
- 导入和导出容器
docker export ID > 1.tar
导出本地的某个容器快照
cat 1.tar | docker import - imgae/tag
导入容器快照在导入为镜像
docker import http://example.com/exampleimage.tgz example/imagerepo
远程导入
docker rm -f ID
删除ID
docker container prune
删除所有的处于终止状态的容器
- 运行web服务
其实就是在启动的时候加上运行web服务的命令而已
docker pull training/webapp
用于下载网上的镜像
docker run -d -P training/webapp python app.py
容器后台启动
docker run -d -p 5000:50000 training/webapp python app.py
指定端口进行映射(第一个是主机端口)
- 查看WEB应用程序日志
docker logs -f ID
docker top ID
查看进程
docker inspect ID
检查WEB应用程序
镜像的使用
- 镜像查看
docker images
列出镜像

参数详解
参数 | 说明 |
---|---|
REPOSITORY | 表示镜像的仓库源 |
TAG | 镜像的标签 |
IMAGE ID | 镜像ID |
CREATED | 镜像创建时间 |
SIZE | 镜像大小 |
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
- 获取镜像
docker pull xxxx:xxx
- 查找镜像
docker search xxx
- 删除镜像
docker rmi xxx
- 创建镜像
1、从已经创建的容器中更新镜像,并且提交这个镜像
2、使用 Dockerfile 指令来创建一个新的镜像
- 更新镜像
docker run -t -i ubuntu:15.10 /bin/bash
进入镜像
apt-get update
exit
退出
docker commit -m="has update" -a="Mikasa" 8397bb46dd0a mikasa:test1
创建镜像
参数 | 说明 |
---|---|
-m | 提交的描述信息 |
-a | 指定作者 |
8397bb46dd0a | 容器的ID |
mikasa:test1 | 指定要创建的目标镜像名 |
- 使用Dockerfile创建镜像
docker build -t imgae/test1:tag dockerfile文件所在目录
- 设置镜像标签
docker tag 镜像ID image/test:tag
设置容器的连接
Docker中部署了一些Web服务,如果要想外部访问这些应用,可以使用-p或-P
来指定端口映射。
- 网络端口映射
docker run -d -P training/webapp python app.py
这里面的-P
参数就是容器内部端口随机映射到主机的高端口(选择高端口一般是为了防止端口冲突)。
- 指定端口映射
docker run -d -p 5000:5000 training/webapp python app.py
映射到本机的5000端口
- 指定网络地址
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
- 指定udp端口(默认tcp)
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
Docker容器互相关联
- 容器命名
docker run -d -P --name runoob training/webapp python app.py
使用 --name
指定命名
- Docker新建网路
docker network create -d bridge mikasa
-d
指定Docker的网络类型,有bridge,overlay等,mikasa
则是创建的网络名

- 新建容器连接网络
docker run -itd --name test1 --network mikasa training/webapp python app.py
docker run -itd --name test2 --network mikasa training/webapp python app.py
这个时候这两个应该是处于同一网络下了,我们可以试着去ping一下
docker exec -it test1 /bin/bash
进入test1中更新一下,一开始是没有ping命令的。使用exec是有原因的,至于为什么请看前面的介绍。
qpt-get update
更新源
apt install iputils-ping
安装ping
ping test2

这样两者就已经互相连接上了。
如果你有多个容器之间需要互相连接,推荐使用 Docker Compose。
结语
关于Docker的简单总结、介绍就到这里面了,还有其他比较复杂的操作,请参考官方文档。