zoukankan      html  css  js  c++  java
  • 【Docker系列教程之四】Dockerfile入门

    在上一篇的文章中,我们把 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的一些常见的操作指令。

    努力提高自己的技术,不忘初心
  • 相关阅读:
    看下资深架构师平时需要解决的问题,对比你离资深架构师还有多少距离——再论技术架构的升级之路
    要上进总会有时间的,要放松也总会有理由的——记录2年出版2本书带给我的改变,同时分享写书和写博客的技巧
    再论面试前准备简历上的项目描述和面试时介绍项目的要点
    在做技术面试官时,我是这样甄别大忽悠的——如果面试时你有这样的表现,估计悬
    分享些我见到的听到的各种创业经历(有成功也有失败)——分析下创业成功要做到哪些
    写技术文章能帮助大家理顺学习的思路,更能促进自己不断学习——分享下写技术文章的思路
    在博客园写了一年博客,收获的不仅仅是写作技能——我能一直保持积极的学习和工作态度
    Hystrix针对不可用服务的保护机制以及引入缓存
    当你收到面试通知后,通过如下的准备可以大大提升面试成功率
    工作5年左右的程序员如何在职业瓶颈期内快速提升自己的身价?提升后如何有效变现自己的高质量技能?
  • 原文地址:https://www.cnblogs.com/blackCatFish/p/9822312.html
Copyright © 2011-2022 走看看