搞懂Docker的那些操作


service_dockerjpg

Docker作为web安全研究是很好的利器,对Mac及其友好。但Windows上跑docker比较鸡肋了,曾看过一篇文章就提到了京东采用了Docker集群作为服务架构。另外很火的微服务,也可以搭上docker的车。(纯手打,所有命令验证,若有误请及时联系我修正)

0. 前言

0.1 Docker 简述

​ docker是我用过的最轻量级”虚拟“服务,docker(容器)与虚拟机最大的不同就是内核虚拟化技术,容器采用的是内存分离,并未实现真的意义上的虚拟化技术,容器和物理机之间公用内核、内存等(Windows环境下,需要虚拟一个Linux内核让容器运行),所以相对来说,容器的解决方案可以运用于服务与服务之间的隔离,从而确保服务能够正常运行,但不能把容器当做linux虚拟机来使用,因为这是不安全的。容器的优势在于”环境“,运维人员、开发人员,可以通过 hub.docker.com 下拉官方或第三方分享的容器。下拉后,可以直接使用该环境,从而大大减少了系统因环境版本多样化的干扰,切换版本环境的烦恼。

0.2 Docker 版本

name version
社区版 Docker Engine => Docker CE
企业版 Docker Data Center => Docker EE

​ 关于docker系统支持

img

​ docker被mirantis收购后,似乎EE版本没有特别亮眼的功能,做了一个大整合。

​ 相对来说 CE的和EE基本功能差异是没有的,希望以后不会走mysql的路吧。

img

1. Docker食谱

​ 关于docker,系统可能需要2GB RAM,否则可能启动失败。另外本文使用的系统采用的是Linux,若使用Windows、Mac可能部分命令有分歧,请把报错内容留言评论。

1.0 Docker的安装

​ Linux,自动识别发行版本,一键安装。

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

​ 因为hub.docker.com 源在国外,所以我们采用国内阿里源。申请方式=> 容器镜像服务 ACR

​ 开启docker服务

sudo systemctl daemon-reload
sudo systemctl restart docker

​ daemon-reload: 重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载。

​ 成功启动服务后,查看版本信息。

root@VM-0-2-ubuntu:~# docker version
Client: Docker Engine - Community
 Version:           19.03.14
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        5eb3275d40
 Built:             Tue Dec  1 19:20:17 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.14
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       5eb3275d40
  Built:            Tue Dec  1 19:18:45 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.3.9
  GitCommit:        ea765aba0d05254012b0b9e595e995c09186427f
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

​ 来个docker hello-world

root@VM-0-2-ubuntu:~# docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
root@VM-0-2-ubuntu:~#

1.1 Docker服务管理

​ 开启服务

sudo systemctl start docker

​ 关闭服务

sudo systemctl stop docker

​ 重启服务

sudo systemctl restart docker

​ 查看状态

sudo systemctl status docker

​ 设置开机启动

sudo systemctl enable docker

​ 同理禁用开机启动

sudo systemctl disable docker

1.2 Docker镜像管理

1.2.0 镜像格式

镜像名称:版本号

例如:

openjdk:8u111-jdk

如果默认不加版本号,就是latest版本(最近发行的版本)

openjdk => openjdk:latest

1.2.1 镜像搜索

docker search openjdk

docker search opnejdk

这种方法,比较少用的,因为镜像还有发行版本,所以建议通过 hub.docker.com,去搜索你需要的镜像。

hub.docker.com搜索

进入以后,选择对应发行版本。

8u111-jdk

1.2.2 镜像下拉

docker pull openjdk:8u111-jdk

正在下拉中。。。

正在下拉中

下拉完成

pull openjdk:8u111-jdk

1.2.3 查找镜像

镜像下拉到本地以后,成为私有镜像,你可以对它进行修改、更新。那么如何查找下载过的镜像呢?

docker images

本地镜像

因为我的镜像比较多,就截取一部分。那么刚才下拉的jdk呢?

docker images | grep jdk

我们通过Bash的正则,进行过滤。

搜索jdk的镜像

1.2.4 删除镜像

为了解决空间,会删除一些没用的镜像,或者老版本镜像。

docker rmi openjdk:8u111-jdk

当我们再次搜索,查看镜像时候已经不存在了。

删除(openjdk:8u111-jdk)镜像

1.2.5 删除无效的镜像

当你docker用久了以后,有时候会出现none的情况。

<none>标签镜像

这是因为build镜像的时候出的问题。后面在DockerFile中再展开,说明原因。这里你可以理解为缓存垃圾。既然是垃圾,肯定需要清理了。

docker rmi `docker images | grep '<none>' | awk '&#123;print $3&#125;'`

删除<none>标签镜像中

我这边比较多,刚好之前的一起清理。再次查询,就已经不见了。

已删除<none>标签镜像

1.2.6 镜像导出导入。

镜像存储原理

当我们下拉一个官方的镜像以后,对它进行修改。我们称原始镜像数据块为A,修改的部分为B。那么当前修改以后的数据块为AB。

+-------------+-------+
|openjdk:7-jdk|修改部分|
+-------------+-------+
|      A      |   B   |
+-------------+-------+

如果你把B数据块导出,发给张三。那么张三的电脑上必须含有A数据块,也就是openjdk:7-jdk镜像。docker镜像是以链的形式存储的。所以我们得将整个修改过后的镜像发给张三。如果这里的镜像不是特别重要的话,你可以通过push命令共享到docker hub上。这样张三通过公网就可以下拉你的镜像。

镜像导出
docker save > xss.tar alphabug/xss

docker save -o xss.tar alphabug/xss

xss为目标文件,alphabug/xss为镜像名

image-20210424191735794

镜像有点大的,这边细节在Dockerfile高级篇里会展开说明。

镜像导入
docker load -i xss.tar

docker load < xss.tar

导入镜像及相关元数据,包括tag信息。

我这里先删除,防止重复tag【张三可以省略这步骤】

防止重复,删除之前镜像

再导入

导入成功

1.3 Docker 容器管理

容器是docker里最核心技术,通俗易懂来说,将docker镜像运行起来,运行过程中所有操作都不会对源镜像进行修改。换句话说,容器就是将镜像的数据块上添加了一个新的链,但是缓存,不会保存。一旦容器被删除,那么容器中修改的数据也就没有了。一个镜像可以起多次,容器的优势也在于此。

例如:

容器多开

(更新中,稍安勿躁。。)

2. Docker高级篇

2.1 DockerFile

2.2 Docker-compose

2.3 Docker API 初试

3. Docker 逃逸

3.0 漏洞介绍

3.1 漏洞环境搭建

3.2 漏洞测试与利用


文章作者: 杯莫停
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 杯莫停 !
评论
  目录