接着 Docker 入门 我们来看看 Docker 的一些常见命令。
win10上修改 docker 的镜像文件存储位置
记住:修改的是 docker 从服务器上拉下来的镜像文件存储位置(本地),是不是镜像源地址(服务器)
首先 win10 的 docker 有可视化操作界面和命令行操作,下载了 docker-ce.exe
双击后就自己开始到结束自动完成,默认安装到了 C 盘目录下,也就是很多默认的参数或配置文件都在 C 盘目录下。考虑 C 盘是系统盘,docker 使用过程中可能会拉取很多镜像文件,所以我们需要把 docker 默认的镜像文件存储地址修改一下。修改
-
docker info
看一下当前的
- 通过 win10 任务栏的 docker GUI 界面来操作修改,选择
settings
进入操作界面,先勾选advanced
,然后添加标注的一行(注意:路径是你想改变的路径)
填写完了,直接点击 apply
按钮,docker service 会自动 restarting。然后在看一下docker info
不管是通过 GUI 还是命令行,都是通过修改 daemon.json
来修改对应的参数配置的,你也可以直接找到配置文件进行修改:
- Linux 上配置文件的默认位置是
/etc/docker/daemon.json
- Windows 上配置文件的默认位置是
%programdata%\docker\config\daemon.json
下面介绍一些 Docker 的常用命令
Docker 的常用命令
-
docker pull image_name
: 拉取镜像
image_name
为镜像的名称,而如果我们想从 Docker Hub 上去下载某个镜像,我们可以使用命令:
docker pull centos:latest
cento:lastest
是镜像的名称,Docker Daemon 发现本地没有我们需要的镜像,会自动去 Docker Hub 上去下载镜像,下载完成后,该镜像被默认保存到 /var/lib/docker
(你没有修改默认路径时) 目录下。
我们要想知道当前有哪些容器在运行,我们可以用如下命令:
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 psdocker 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.7MAINTAINER Angel_Kitty <angelkitty6698@gmail.com>COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000ENTRYPOINT ["python"]CMD ["app.py"]
我们可以分析一下上面这个过程:
- 从 Docker Hub 上 Pull 下 Python 2.7 的基础镜像。
- 显示维护者的信息。
- Copy 当前目录到容器中的 /App 目录下 复制本地主机的 ( Dockerfile 所在目录的相对路径)到容器里 。
- 指定工作路径为 /App。
- 安装依赖包。
- 暴露 5000 端口。
- 启动 App。
这个例子是启动一个 Python Flask App 的 Dockerfile ( Flask 是 Python 的一个轻量的 Web 框架),相信大家从这个例子中能够稍微理解了 Dockfile 的组成以及指令的编写过程。
Dockerfile 常用的指令
根据上面的例子,我们已经差不多知道了 Dockerfile 的组成以及指令的编写过程,我们再来理解一下这些常用命令就会得心应手了。
由于 Dockerfile 中所有的命令都是以下格式:INSTRUCTION argument
,指令(INSTRUCTION
)不分大小写,但是推荐大写和 SQL 语句是不是很相似呢?下面我们正式来讲解一下这些指令集吧。
FROM
FROM
是用于指定基础的 images ,所有的 Dockerfile 都应该以FROM
开头,FROM
命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础,FROM
以后的所有指令都会在 FROM
的基础上进行创建镜像。
可以在同一个 Dockerfile 中多次使用 FROM
命令用于创建多个镜像。比如我们要指定 Python 2.7 的基础镜像,我们可以像如下写法一样:
FROM python:2.7
MAINTAINER
MAINTAINER
是用于指定镜像创建者和联系方式, 如
MAINTAINER Xin <735613050@qq.com>
COPY
COPY
是用于复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的。当使用本地目录为源目录时,推荐使用 COPY 。例如我们要拷贝当前目录到容器中的 /app
目录下,我们可以这样操作:
COPY . /app
WORKDIR
WORKDIR
用于配合 RUN
,CMD
,ENTRYPOINT
命令设置当前工作路径。可以设置多次,如果是相对路径,则相对前一个 WORKDIR
命令。默认路径为/
。一般格式为 WORKDIR /path/to/work/dir
。
例如我们设置 /app
路径,我们可以进行如下操作:
WORKDIR /app
RUN
RUN
用于容器内部执行命令。每个 RUN
命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。
例如我们要安装 Python 依赖包,我们做法如下:
RUN pip install -r requirements.txt
EXPOSE
EXPOSE
命令用来指定对外开放的端口。例如上面那个例子,开放 5000 端口
EXPOSE 5000
ENTRYPOINT
ENTRYPOINT
可以让你的容器表现得像一个可执行程序一样。一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。ENTRYPOINT
命令也有两种格式:
-
ENTRYPOINT ["executable", "param1", "param2"]
:推荐使用的 Exec 形式。 -
ENTRYPOINT command param1 param2
:Shell 形式。
例如下面这个,我们要将 Python 镜像变成可执行的程序,我们可以这样去做:
ENTRYPOINT ["python"]
CMD
CMD
命令用于启动容器时默认执行的命令,CMD
命令可以包含可执行文件,也可以不包含可执行文件。不包含可执行文件的情况下就要用 ENTRYPOINT
指定一个,然后 CMD
命令的参数就会作为 ENTRYPOINT
的参数。CMD
命令有三种格式:
-
CMD ["executable","param1","param2"]
:推荐使用的 exec 形式。 -
CMD ["param1","param2"]
:无可执行程序形式。 -
CMD command param1 param2
:Shell 形式。
一个 Dockerfile 中只能有一个 CMD
,如果有多个,则最后一个生效。而 CMD
的 Shell 形式默认调用 /bin/sh -c
执行命令。
CMD
命令会被 Docker
命令行传入的参数覆盖:docker run busybox /bin/echo Hello Docker
会把 CMD
里的命令覆盖。
例如我们要启动 /app ,我们可以用如下命令实现:
CMD ["app.py"]
当然还有一些其他的命令,我们在用到的时候再去一一讲解一下。
构建 Dockerfile
我们大体已经把 Dockerfile 的写法讲述完毕,我们可以自己动手写一个例子:
mkdir static_web
cd static_web
touch Dockerfile
然后 vi Dockerfile
开始编辑该文件,输入 i
开始编辑。以下是我们构建的 Dockerfile 内容:
FROM nginx
MAINTAINER Angel_Kitty <angelkitty6698@gmail.com>
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
编辑完后按 Esc
退出编辑,然后 :wq
写入,退出。我们在 Dockerfile 文件所在目录执行:
docker build -t angelkitty/nginx_web:v1 .
我们解释一下:
-
-t
是为新镜像设置仓库和名称 -
angelkitty
为仓库名 -
nginx_web
为镜像名 -
: v1
为标签(不添加为默认latest
)
我们构建完成之后,使用 Docker Images
命令查看所有镜像,如果存在 REPOSITORY
为 Nginx
和 TAG
是 v1
的信息,就表示构建成功。
接下来使用 docker run
命令来启动容器:
docker run --name nginx_web -d -p 8080:80 angelkitty/nginx_web:v1
这条命令会用 Nginx 镜像启动一个容器,命名为 nginx_web
,并且映射了 8080 端口。
这样我们可以用浏览器去访问这个 Nginx 服务器:http://localhost:8080/
或者 http://本机的 IP 地址:8080/
,页面返回信息.
网友评论