Docker的使用

  • 什么是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的简单总结、介绍就到这里面了,还有其他比较复杂的操作,请参考官方文档。

原文地址:https://www.cnblogs.com/Mikasa-Ackerman/p/Docker-de-shi-yong.html