Docker从发布到现在,可以说是开发者必学的一个软件了,提供了高效的的环境配置迁移方案,可以说非常好用了。

作为一个安全从业者,平常的逆向工作也是需要各种各样的配置环境的,基于此我也凑个热闹学习一把Docker,省得在折腾环境中浪费生命。

1. 虚拟机和linux容器

虚拟机这玩意就不多说了,平常用虚拟机的时间比用主机上系统的时间还长。它缺点还是显而易见的:启动慢,占用资源多;除了提供基础的操作系统环境外,其它各种依赖还是得重新整;迁移起来成本也高。

而linux容器(LXC)就是linux发展出来的另一种虚拟化技术,它是通过对进程进行隔离或者说是在进程外面套了一个保护壳来实现虚拟化的。对于这层保护壳(容器)里面得进程来说,它接触到的各种资源都是虚拟的,进而实现了进程级别的系统隔离。这样的架构使得它:启动快,占资源少,多个容器可共享资源;体积小只需包含必要的组件即可。

总之,容器就有点像轻量化的虚拟机,能够提供虚拟化的环境,但成本开销小得多。

2. Docker知识

终于说到Docker了,Docker是啥呐,说白了就是一款封装好的linux容器,提供了易用的容器使用接口。也就是把应用程序和该程序的依赖都打包起来,作为一个整体文件,运行该文件就会创建一个虚拟容器,容器内的环境和打包时一摸一样。

Docker是Go写的并遵从Apache2.0协议开源,其架构包括三个基本概念(官方解释):

  • 镜像(image):docker镜像就相当于是一个root文件系统,比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。
  • 容器(container):镜像和容器的关系,就像是面对对象程序设计中的类和实例一样,镜像是静态的定义,容器时镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(repository):仓库可以看作是一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器,可以用如下的图来描述:

概念 说明
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

3. Docker安装

对社区版(Conmmunity Edition,CE)的docker进行安装,各操作系统下的安装方法参考官方安装文档

链接示例:MacWindowsUbuntuCentOs

Ubuntu Docker安装

安装方法有挺多的,图省事我这里直接使用脚本进行安装了,有如下的脚本:

1
2
3
4
#1.官方脚本
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
#2. 使用国内daocloud一键安装命令
curl -sSL https://get.daocloud.io/docker | sh

安装完毕利用 docker version验证确实安装成功:

img

稍微使用几次Docker就会发现,Docker需要用户具有sudo权限,没加sudo就会出现上面这种报错,但为了不每次写sudo以及为了避免给Docker那么大的权限(毕竟咱们是要玩病毒、漏洞的,慎重为好),可以用 usermode命令把用户加入到Docker用户组:

1
sudo usermode -a -G docker $USER

加完后记得重启下系统,然后就可以不加 sudo使用了:

接下来还得换个仓库源,Docker提供了官方仓库,里面有很多现成的image文件,但国内使用起来确实慢,需要配置下镜像加速器地址,我这里用了阿里云镜像加速器

1
2
3
4
5
6
7
8
9
#执行如下操作,让daemon.json写入配置内容,重启docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://9078vr8d.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

4. Docker hello-world

万物皆可hello world,既然都配置好了Docker环境,怎么也得来个hello world进行下庆祝。Docker仓库里是有这个image的,直接pull就好:

1
2
3
4
5
6
#Docker下载到的镜像会放在/var/lib/docker/image/下
docker image pull hello-world
#查看镜像下载成功没
dcoker image ls
#启动对应容器
docker container run hello-world

上面就是hello-world构造的容器正确运行后输出的结果,其创建的容器会自动结束比较简单。上面也提示了可以运行Ubuntu的image,这个一听就是比较厉害了,试试能不能让我Ubuntu套Ubuntu:

1
2
docker run -it ubuntu bash
#ps: -i:交互式操作 -t:终端 bash:命令,提供一个交互式的shell

挺不错昂,这就好玩起来了:

![image-20220722121041088](C:\Users\haoshaoqing\Documents\My Knowledge\temp\857177265\0. docker入门.md-857177265.assets\image-20220722121041088.png)

既然通过镜像创建了容器,那么怎么查看我有哪些容器以及它们的状态呐,那就是用下面的命令了:

1
2
#列举所有容器
docker ps -a

至于其它关于容器、镜像的命令,都可以通过help来查看详细说明,用到就会了,这里不列举了。

5. Docker仓库管理

配置好环境的镜像理论上可以存在任意位置,但为了方便随时取用,放在网上是一个好的选择,可以选择放github、Docker hub等地方。

Docker hub是Docker官方维护的一个公共仓库,可以提供给个人、团队使用,个人使用免费,注册一个账号就可以用了:

使用的时候通过 docker login登录,登陆后可以拉取到自己的全部镜像,也可以通过 docker push推送自己的镜像到Docker hub,使用完毕后退出 docker logout

6. Dockerfile

如上,docker基础的安装和使用大致就这些内容,后面我会通过Docker安装Node.js来把博客的本地环境进行下迁移。

参考:

https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

https://www.runoob.com/docker/docker-architecture.html