在上一篇的文章中,我们把 Docker
容器的工作流程剖析的十分清楚了,我们大体可以知道 Docker
组件协作运行容器可以分为以下几个过程:
Docker
客户端执行docker run
命令Dockerdaemon
发现本地没有我们需要的镜像daemon
从DockerHub
下载镜像- 下载完成后,镜像被保存到本地
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的例子:
FROM python:2.7
MAINTAINER Angel_Kitty <[email protected].com>
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python"]
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的一些常见的操作指令。
原文地址:https://www.cnblogs.com/blackCatFish/p/9822312.html