作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等
作者主页: 七七的个人主页
文章收录专栏: 七七的闲谈
欢迎大家点赞收藏 ⭐ 加关注哦!
前言
Docker 是一个
开源的应用容器引擎
,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows
操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
利用Dockerfile制作个人的镜像文件
- 1. Dockerfile简介
- 2. Dockerfile相关指令
- 3. Dockerfile编写
- 4. requirements.txt
- 5. build构建镜像文件
- 6. run运行容器
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
编辑内容如下:
# 更新pipRUN pip install --upgrade pip # 工作目录WORKDIR /codeADD . /code# pip安装依赖包RUN pip install -r requirements.txt# 传递参数ENTRYPOINT ["pytest"]# 默认显示help帮助信息CMD ["--help"]
4. requirements.txt
requirements.txt是python的相关依赖包, 可以通过freeze命令生成
pip3 freeze >requirements.txt
[root@yoyo docker-run]# cat requirements.txt APScheduler==3.5.3asn1crypto==0.24.0atomicwrites==1.3.0attrs==18.2.0backports.csv==1.0.7bcrypt==3.1.7beautifulsoup4==4.7.1cached-property==1.5.1certifi==2018.11.29cffi==1.12.3chardet==3.0.4cryptography==2.7DBUtils==1.3defusedxml==0.5.0diff-match-patch==20181111Django==2.1.4django-bootstrap3==11.0.0django-crispy-forms==1.7.2django-formtools==2.1django-import-export==1.2.0django-ranged-response==0.2.0django-reversion==3.0.3django-simple-captcha==0.5.10django-stdimage==4.0.1docker==3.7.3docker-compose==1.24.1docker-pycreds==0.4.0dockerpty==0.4.1docopt==0.6.2et-xmlfile==1.0.1future==0.17.1httplib2==0.12.1idna==2.7jdcal==1.4jsonschema==2.6.0more-itertools==6.0.0mysqlclient==1.4.2.post1odfpy==1.4.0openpyxl==2.6.1paramiko==2.6.0Pillow==5.4.1pluggy==0.6.0progressbar2==3.39.3py==1.7.0pycparser==2.19pymssql==2.1.4PyMySQL==0.9.3PyNaCl==1.3.0pytest==3.6.3python-utils==2.3.0pytz==2018.7PyYAML==3.13requests==2.20.1six==1.12.0soupsieve==1.7.3tablib==0.13.0texttable==0.9.1tzlocal==1.5.1urllib3==1.24.1websocket-client==0.56.0xlrd==1.2.0xlwt==1.3.0
5. build构建镜像文件
docker build 命令用于使用 Dockerfile 创建镜像。OPTIONS说明:
- -f :指定要使用的Dockerfile路径;
- -pull :尝试去更新镜像的新版本;
- -quiet, -q :安静模式,成功后只输出镜像 ID;
- -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 daemon11.78kBStep 1/8 : FROM python:3.6 ---> cfcdf565ff94Step 2/8 : MAINTAINER yoyo<283340479@qq.com> ---> Using cache ---> f523b919fcf9Step 3/8 : RUN pip install --upgrade pip ---> Using cache ---> 3399b50dab4eStep 4/8 : WORKDIR /code ---> Using cache ---> 7223a20e17fdStep 5/8 : ADD . /code ---> 650b554ccd6cStep 6/8 : RUN pip install -r requirements.txt ---> Running in 0e49d444f7d8
运行过程中可以看到按步骤运行,如:Step 1/8
运行完成后,可以通过docker images查看生成的镜像
[root@yoyo docker-run]# docker imagesREPOSITORY TAG IMAGE IDCREATED SIZEyoyo_pytestv16b4267ce7ac421 seconds ago1.02GB[root@yoyo docker-run]#
6. run运行容器
在当前目录新建一个test_h.py文件,写入pytest测试脚本
import pytestdef test_one():print("正在执行----test_one")x = "this"assert 'h' in xdef test_two():print("正在执行----test_two")x = "hello"assert xdef test_three():print("正在执行----test_three")a = "hello"b = "hello world"assert a in bif __name__ == "__main__":pytest.main(["-s", "test_h.py"])
使用docker run运行容器
- -it -t让docker分配一个伪终端并绑定到容器的标准输入上, -i则让容器的标准输入保持打开.
- -rm 容器退出时,自动清除容器。
- -rm选项不能与-d同时使用
- -v 将容器的工作目录/code挂载到宿主机的$PWD,也就是当前目录
- yoyo_pytest:v1 容器名称和tag名称
- 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.0rootdir: /code, inifile:collected 3 items test_h.py 正在执行----test_one.正在执行----test_two.正在执行----test_three.=============================================================== 3 passed in 0.01 seconds
关于【Docker】用Dockerfile制作个人的镜像文件的详解,七七就先分享到这里了,如果你认为这篇文章对你有帮助,请给七七点个赞吧,如果发现什么问题,欢迎评论区留言!!