在上一篇的文章中,我们把 Docker 容器的工作流程剖析的十分清楚了,我们大体可以知道 Docker 组件协作运行容器可以分为以下几个过程:

  1. Docker 客户端执行 docker run 命令

  2. Dockerdaemon 发现本地没有我们需要的镜像

  3. daemon 从 DockerHub 下载镜像

  4. 下载完成后,镜像被保存到本地

  5. Dockerdaemon 启动容器

了解了这些过程以后,我们再来理解这些命令就不会觉得很突兀了,下面我来给大家讲讲 Docker 常用的一些命令操作吧。

Docker常用命令

我们可以通过 docker-h 去查看命令的详细的帮助文档。在这里我只会讲一些平常日常比赛或者生活中我们可能会用的比较多的一些命令。

例如,我们需要拉取一个 docker 镜像,我们可以用如下命令:

docker pull image_name

image_name 为镜像的名称,而如果我们想从 DockerHub 上去下载某个镜像,我们可以使用以下命令:

docker pull centos:latest

centos:lastest 是镜像的名称, Dockerdaemon 发现本地没有我们需要的镜像,会自动去 DockerHub 上去下载镜像,下载完成后,该镜像被默认保存到 /var/lib/docker 目录下。

接着我们如果想查看下主机下存在多少镜像,我们可以用如下命令:

docker images

我们要想知道当前有哪些容器在运行,我们可以用如下命令:

docker ps -a

-a 是查看当前所有正在运行的容器

我们该如何去对一个容器进行启动,重启和停止呢?我们可以用如下命令:

docker start container_name/container_id

docker restart container_name/container_id

docker stop container_name/container_id

这个时候我们如果想进入到这个容器中,我们可以使用 attach 命令:

docker attach container_name/container_id

那如果我们想运行这个容器中的镜像的话,并且调用镜像里面的 bash ,我们可以使用如下命令:

docker run -t -i container_name/container_id /bin/bash

那如果这个时候,我们想删除指定镜像的话,由于 image 被某个 container 引用(拿来运行),如果不将这个引用的 container 销毁(删除),那 image 肯定是不能被删除。我们首先得先去停止这个容器:

docker ps -a

docker stop container_name/container_id

然后我们用如下命令去删除这个容器:

docker rm container_name/container_id

然后这个时候我们再去删除这个镜像:

docker rmi image_name

此时,常用的 Docker 相关的命令就讲到这里为止了,我们在后续的文章中还会反复地提到这些命令。

Dockerfile是什么

前面我们已经提到了 Docker 的一些基本概念。以 CTF 选手的角度来看,我们可以去使用 Dockerfile 定义镜像,依赖镜像来运行容器,可以去模拟出一个真实的漏洞场景。因此毫无疑问的说, Dockerfile 是镜像和容器的关键,并且 Dockerfile 还可以很轻易的去定义镜像内容,说了这么多,那么 Dockerfile 到底是个什么东西呢?

Dockerfile 是自动构建 docker 镜像的配置文件, 用户可以使用 Dockerfile 快速创建自定义的镜像。 Dockerfile 中的命令非常类似于 linux 下的 shell 命令。

我们可以通过下面这幅图来直观地感受下 Docker 镜像、容器和 Dockerfile 三者之间的关系。

我们从上图中可以看到, Dockerfile 可以自定义镜像,通过 Docker 命令去运行镜像,从而达到启动容器的目的。

Dockerfile 是由一行行命令语句组成,并且支持已 # 开头的注释行。

一般来说,我们可以将 Dockerfile 分为四个部分:

  • 基础镜像(父镜像)信息指令 FROM

  • 维护者信息指令 MAINTAINER

  • 镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等

  • 容器启动指令 CMD 、 ENTRYPOINT 和 USER 等

下面是一段简单的Dockerfile的例子:

  1. FROM python:2.7

  2. MAINTAINER Angel_Kitty <angelkitty6698@gmail.com>

  3. COPY . /app

  4. WORKDIR /app

  5. RUN pip install -r requirements.txt

  6. EXPOSE 5000

  7. ENTRYPOINT ["python"]

  8. CMD ["app.py"]

我们可以分析一下上面这个过程:

  • 1、从 DockerHub 上 pull 下 python2.7 的基础镜像

  • 2、显示维护者的信息

  • 3、 copy 当前目录到容器中的 /app 目录下 复制本地主机的 <src> ( Dockerfile 所在目录的相对路径)到容器里 <dest>

  • 4、指定工作路径为 /app

  • 5、安装依赖包

  • 6、暴露 5000 端口

  • 7、启动 app

这个例子是启动一个 python flask app 的 Dockerfile ( flask 是 python 的一个轻量的 web 框架),相信大家从这个例子中能够稍微理解了Dockfile的组成以及指令的编写过程,我们将会在下一篇文章中详细讲解Dockerfile的一些常见的操作指令。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐