• 【Docker】用Dockerfile制作个人的镜像文件


    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等
    作者主页: 七七的个人主页
    文章收录专栏: 七七的闲谈
    欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

    在这里插入图片描述


    前言

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。


    1. Dockerfile简介

    Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。此文章为恒川学习笔记了解。

    简单来说,Dockerfile就是把我们安装环境的每个步骤和指令,放到一个文件,最后一键执行,最后做成一个你想要的环境。

    Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

    Docker构建三步曲:

    • 编写dockerfile文件
    • docker build 构建image镜像文件
    • docker run 运行容器

    2. Dockerfile相关指令

    Dockerfile 是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据 Dockerfile 的内容构建镜像,
    在介绍如何构建之前先介绍下 Dockerfile 的基本语法结构。

    Dockerfile 有以下指令选项:

    • FROM 基础镜像,当前新镜像是基于哪个镜像的
    • MAINTAINER 镜像维护者的姓名和邮箱地址
    • RUN 容器构建时需要运行的命令
    • CMD 指定一个容器启动时要运行的命令。
      dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换。
    • EXPOSE 当前容器对外暴露的端口号
    • ENV 用来在构建镜像过程中设置环境变量
    • ADD 将宿主机目录下的文件拷贝到镜像里面并且ADD命令会自动处理URL和解压tar压缩包
    • COPY COPY:类似ADD,拷贝文件和目录到镜像中,但是它只是拷贝,不会自动处理URL和解压tar压缩包。
    • ENTRYPOINT 指定一个容器启动时要运行的命令。
    • ENTRYPOIT的目的和CMD一样,都是在指定容器启动程序及参数。
    • VOLUME 容器数据卷,用于数据保存和持久化工作
    • USER 指定运行容器时的用户名或UID,后续的 RUN 也会使用指定用户
    • WORKDIR 指定在容器创建后,终端默认登录进来工作目录,一个落脚点
    • ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后,父镜像的onbuild被触发。

    3. Dockerfile编写

    在当前目录新建一个文件夹docker-run, cd进入到文件夹,touch新建一个Dockerfile,然后vi打开文件,开始编辑

    [root@yoyo ~]# mkdir docker-run
    [root@yoyo ~]# cd docker-run/
    [root@yoyo docker-run]# touch Dockerfile
    [root@yoyo docker-run]# vi Dockerfile
    
    • 1
    • 2
    • 3
    • 4

    编辑内容如下:

    # 更新pip
    RUN pip install --upgrade pip 
    
    # 工作目录
    WORKDIR /code
    ADD . /code
    
    # pip安装依赖包
    RUN pip install -r requirements.txt
    
    # 传递参数
    ENTRYPOINT ["pytest"]
    
    # 默认显示help帮助信息
    CMD ["--help"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4. requirements.txt

    requirements.txt是python的相关依赖包, 可以通过freeze命令生成

    pip3 freeze >requirements.txt

    [root@yoyo docker-run]# cat requirements.txt 
    APScheduler==3.5.3
    asn1crypto==0.24.0
    atomicwrites==1.3.0
    attrs==18.2.0
    backports.csv==1.0.7
    bcrypt==3.1.7
    beautifulsoup4==4.7.1
    cached-property==1.5.1
    certifi==2018.11.29
    cffi==1.12.3
    chardet==3.0.4
    cryptography==2.7
    DBUtils==1.3
    defusedxml==0.5.0
    diff-match-patch==20181111
    Django==2.1.4
    django-bootstrap3==11.0.0
    django-crispy-forms==1.7.2
    django-formtools==2.1
    django-import-export==1.2.0
    django-ranged-response==0.2.0
    django-reversion==3.0.3
    django-simple-captcha==0.5.10
    django-stdimage==4.0.1
    docker==3.7.3
    docker-compose==1.24.1
    docker-pycreds==0.4.0
    dockerpty==0.4.1
    docopt==0.6.2
    et-xmlfile==1.0.1
    future==0.17.1
    httplib2==0.12.1
    idna==2.7
    jdcal==1.4
    jsonschema==2.6.0
    more-itertools==6.0.0
    mysqlclient==1.4.2.post1
    odfpy==1.4.0
    openpyxl==2.6.1
    paramiko==2.6.0
    Pillow==5.4.1
    pluggy==0.6.0
    progressbar2==3.39.3
    py==1.7.0
    pycparser==2.19
    pymssql==2.1.4
    PyMySQL==0.9.3
    PyNaCl==1.3.0
    pytest==3.6.3
    python-utils==2.3.0
    pytz==2018.7
    PyYAML==3.13
    requests==2.20.1
    six==1.12.0
    soupsieve==1.7.3
    tablib==0.13.0
    texttable==0.9.1
    tzlocal==1.5.1
    urllib3==1.24.1
    websocket-client==0.56.0
    xlrd==1.2.0
    xlwt==1.3.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    5. build构建镜像文件

    docker build 命令用于使用 Dockerfile 创建镜像。OPTIONS说明:

    1. -f :指定要使用的Dockerfile路径;
    2. -pull :尝试去更新镜像的新版本;
    3. -quiet, -q :安静模式,成功后只输出镜像 ID;
    4. -tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

    -t参数设置镜像名称yoyo_pytes和tag标签名称v1,注意最后面有个点.

    docker build -t yoyo_pytest:v1 .

    [root@yoyo docker-run]# docker build -t yoyo_pytest:v1 .
    Sending build context to Docker daemon  11.78kB
    Step 1/8 : FROM python:3.6
     ---> cfcdf565ff94
    Step 2/8 : MAINTAINER yoyo  <283340479@qq.com>
     ---> Using cache
     ---> f523b919fcf9
    Step 3/8 : RUN pip install --upgrade pip
     ---> Using cache
     ---> 3399b50dab4e
    Step 4/8 : WORKDIR /code
     ---> Using cache
     ---> 7223a20e17fd
    Step 5/8 : ADD . /code
     ---> 650b554ccd6c
    Step 6/8 : RUN pip install -r requirements.txt
     ---> Running in 0e49d444f7d8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行过程中可以看到按步骤运行,如:Step 1/8

    运行完成后,可以通过docker images查看生成的镜像

    [root@yoyo docker-run]# docker images
    REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
    yoyo_pytest                v1                  6b4267ce7ac4        21 seconds ago      1.02GB
    [root@yoyo docker-run]#
    
    • 1
    • 2
    • 3
    • 4

    6. run运行容器

    在当前目录新建一个test_h.py文件,写入pytest测试脚本

    import pytest
    def test_one():
        print("正在执行----test_one")
        x = "this"
        assert 'h' in x
    
    def test_two():
        print("正在执行----test_two")
        x = "hello"
        assert x
    
    def test_three():
        print("正在执行----test_three")
        a = "hello"
        b = "hello world"
        assert a in b
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_h.py"])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    使用docker run运行容器

    1. -it -t让docker分配一个伪终端并绑定到容器的标准输入上, -i则让容器的标准输入保持打开.
    2. -rm 容器退出时,自动清除容器。
    3. -rm选项不能与-d同时使用
    4. -v 将容器的工作目录/code挂载到宿主机的$PWD,也就是当前目录
    5. yoyo_pytest:v1 容器名称和tag名称
    6. test_h.py 后面跟着需要执行的脚本名称
    [root@yoyo docker-run]# docker run -it --rm -v "$PWD":/code yoyo_pytest:v1 test_h.py  -s
    ================================================================== test session starts ==================================================================
    platform linux -- Python 3.6.9, pytest-3.6.3, py-1.7.0, pluggy-0.6.0
    rootdir: /code, inifile:
    collected 3 items                                                                                                                                       
    
    test_h.py 正在执行----test_one
    .正在执行----test_two
    .正在执行----test_three
    .
    
    =============================================================== 
    3 passed in 0.01 seconds 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    关于【Docker】用Dockerfile制作个人的镜像文件的详解,七七就先分享到这里了,如果你认为这篇文章对你有帮助,请给七七点个赞吧,如果发现什么问题,欢迎评论区留言!!💕💕

  • 相关阅读:
    智能管家“贾维斯”走进现实?AI Agent或成2023科技领域新风向标
    通过核密度分析工具建模,基于arcgis js api 4.27 加载gp服务
    前端 css3 媒体查询实现 响应式布局
    C语言实验四 循环结构程序设计(一)
    观察者模式
    ArrayList源码分析
    Spring声明式事务注解源码剖析
    企业信息查询:洞悉市场,抢占先机
    【将图片链接中的图片合并成PDF】
    分布式系统原理-分布式事务方案那么多,到底该选哪一个
  • 原文地址:https://blog.csdn.net/2201_75366661/article/details/132625854