Dockerfile是一个用于构建Docker镜像的文本文件,其中包含了创建Docker镜像的全部指令。就是将我们安装环境的每个步骤使用指令的形式存放在一个文件中,最后生成一个需要的环境。
  Docker使用Dockerfile构建镜像步骤:

  1. 创建dockerfile文件
  2. 通过build命令生成image镜像文件
  3. 运行容器
  4. 上传仓库

创建dockerfile文件

1、创建dockerfile

新建一个文件夹,api-demo

然后进入api-demo,创建dockerfile

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox
$ mkdir api—-demo
$ cd api—-demo/
$ touch Dockerfile
$ vi Dockerfile

编写Dockerfile文件如下:

# 基于基础镜像
FROM python:3.6 # 设置code文件夹是工作目录
WORKDIR /code # 将代码添加到code文件夹下
COPY test_api.py /code/ # 更新pip
RUN pip install --upgrade pip --index-url https://pypi.douban.com/simple # pip安装依赖包
RUN pip install -U pytest
RUN pip install -U requests # 执行命令
CMD ["python", "test_api.py"]

2、dockerfile常用指令  

Dockerfile 语法:

Dockerfile语法由两部分构成,注释和命令+参数

示例:

# 基于基础镜像
FROM python:3.6

常用指令如下

ADD

ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder

COPY

用于将文件作为一个新的层添加到镜像中。通常使用 COPY 指令将应用代码赋值到镜像中。

COPY test_api.py  /code/

CMD

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

CMD ["python", "test_api.py"]

ENTRYPOINT

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。

# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo

ENV

ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

# Usage: ENV key value
ENV SERVER_WORKS   

EXPOSE

EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

# Usage: EXPOSE [port]
EXPOSE

FROM

FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

# Usage: FROM [image name]
FROM ubuntu

MAINTAINER

我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。

# Usage: MAINTAINER [name]
MAINTAINER authors_name

RUN

RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

# pip安装依赖包
RUN pip install -U pytest

USER

USER命令用于设置运行容器的UID。

# Usage: USER [UID]
USER

VOLUME

VOLUME命令用于让你的容器访问宿主机上的目录。

# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]

WORKDIR

WORKDIR命令用于设置CMD指明的命令的运行目录。

# Usage: WORKDIR /path
WORKDIR ~/

 3、创建python文件

创建python文件 test_api.py,在这做一个简单的接口测试,一个成功的测试用例和一个失败的测试用例,代码如下:

# coding=utf-
import requests
import pytest def test_1():
search_url = 'https://baidu.com/' respose = requests.get(url=search_url) assert == respose.status_code def test_2():
search_url = 'https://baidu.com/' respose = requests.get(url=search_url) assert == respose.status_code if __name__ == "__main__":
pytest.main(["-s", "test_api.py"]) 

 

通过build构建镜像文件

使用docker build 命令创建镜像。

使用命令:(注意命令最后面的点)

docker build -t tynam/api-demo:v1. .

OPTIONS说明:

    • --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。例如 tynam/api-demo:v1.1

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo
$ docker build -t tynam/api-demo:v1. .
Sending build context to Docker daemon .072kB
Step / : FROM python:3.6
---> 0db2e2bbf438
Step / : WORKDIR /code
---> Using cache
---> 688dd9856f6e
Step / : COPY test_api.py /code/
---> 87e29f28e665
Step / : RUN pip install --upgrade pip --index-url https://pypi.douban.com/simple
---> Running in 14f5c424c164
Looking in indexes: https://pypi.douban.com/simple
Requirement already up-to-date: pip in /usr/local/lib/python3./site-packages (20.0.)
Removing intermediate container 14f5c424c164
---> fbdb47946e97
Step / : RUN pip install -U pytest
---> Running in 6ffb142f983d
Collecting pytest
Downloading pytest-5.4.-py3-none-any.whl ( kB)
Collecting wcwidth
Downloading wcwidth-0.1.-py2.py3-none-any.whl ( kB)
Collecting importlib-metadata>=0.12; python_version < "3.8"
Downloading importlib_metadata-1.6.-py2.py3-none-any.whl ( kB)
Collecting attrs>=17.4.
Downloading attrs-19.3.-py2.py3-none-any.whl ( kB)
Collecting more-itertools>=4.0.
Downloading more_itertools-8.2.-py3-none-any.whl ( kB)
Collecting pluggy<1.0,>=0.12
Downloading pluggy-0.13.-py2.py3-none-any.whl ( kB)
Collecting packaging
Downloading packaging-20.3-py2.py3-none-any.whl ( kB)
Collecting py>=1.5.
Downloading py-1.8.-py2.py3-none-any.whl ( kB)
Collecting zipp>=0.5
Downloading zipp-3.1.-py3-none-any.whl (4.9 kB)
Collecting pyparsing>=2.0.
Downloading pyparsing-2.4.-py2.py3-none-any.whl ( kB)
Collecting six
Downloading six-1.14.-py2.py3-none-any.whl ( kB)
Installing collected packages: wcwidth, zipp, importlib-metadata, attrs, more-itertools, pluggy, pyparsing, six, packaging, py, pytest
Successfully installed attrs-19.3. importlib-metadata-1.6. more-itertools-8.2. packaging-20.3 pluggy-0.13. py-1.8. pyparsing-2.4. pytest-5.4. six-1.14. wcwidth-0.1. zipp-3.1.
Removing intermediate container 6ffb142f983d
---> 0fe23e1c2a89
Step / : RUN pip install -U requests
---> Running in 21163a3acd67
Collecting requests
Downloading requests-2.23.-py2.py3-none-any.whl ( kB)
Collecting certifi>=2017.4.
Downloading certifi-2020.4.5.1-py2.py3-none-any.whl ( kB)
Collecting chardet<,>=3.0.
Downloading chardet-3.0.-py2.py3-none-any.whl ( kB)
Collecting idna<,>=2.5
Downloading idna-2.9-py2.py3-none-any.whl ( kB)
Collecting urllib3!=1.25.,!=1.25.,<1.26,>=1.21.
Downloading urllib3-1.25.-py2.py3-none-any.whl ( kB)
Installing collected packages: certifi, chardet, idna, urllib3, requests
Successfully installed certifi-2020.4.5.1 chardet-3.0. idna-2.9 requests-2.23. urllib3-1.25.
Removing intermediate container 21163a3acd67
---> 8a8ae3f778a5
Step / : CMD ["python", "test_api.py"]
---> Running in f7310b052d08
Removing intermediate container f7310b052d08
---> 308b0f67af64
Successfully built 308b0f67af64
Successfully tagged tynam/api-demo:v1.
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

  在运行过程中,可以看到运行步骤,及运行的指令。例如第五步:Step 5/7 : RUN pip install -U pytest

镜像创建完成后可以使用命令查看创建的镜像:

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tynam/api-demo v1. 308b0f67af64 minutes ago 927MB

  

运行容器

镜像创建完成后开始运行,使用命令;

docker run -it tynam/api-demo:v1.

运行结果如下:

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo
$ docker run -it tynam/api-demo:v1.
================================================= test session starts ==================================================
platform linux -- Python 3.6., pytest-5.4., py-1.8., pluggy-0.13.
rootdir: /code
collected items test_api.py .F ======================================================= FAILURES =======================================================
________________________________________________________ test_2 ________________________________________________________ def test_2():
search_url = 'https://baidu.com/' respose = requests.get(url=search_url) > assert == respose.status_code
E assert ==
E + where = <Response []>.status_code test_api.py:: AssertionError
=============================================== short test summary info ================================================
FAILED test_api.py::test_2 - assert ==
============================================= failed, passed in .61s ============================================== TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo

上传仓库

docker拥有自己的镜像仓库,官方仓库网站是 https://hub.docker.com/

镜像上传仓库的流程为:登录>>tag操作>>push

1、创建账号

进入docker hub  https://hub.docker.com/ 注册账号,然后创建自己的仓库

例如笔者创建的仓库名为 api

2、本地登录docker

使用命令登录自己的docker

docker login

示例:

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (tynam): tynam
Password:
Login Succeeded

3、修改镜像名

修改镜像名和仓库名一致,镜像名称必须和 hub 中的仓库名称一致,否则将会抛出错误, 使用命令:

docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)

示例:

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo
$ docker tag 308b0f67af64 tynam/api:v1.

修改后查看镜像

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox/api—-demo
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tynam/api-demo v1. 308b0f67af64 minutes ago 927MB
tynam/api v1. 308b0f67af64 minutes ago 927MB

4、上传镜像

docker push [REPOSITORY]:[TAG]

示例:

TynamYang@XA-LSR-Tynam MINGW64 /d/docker/Docker Toolbox
$ docker push tynam/api:v1.
The push refers to repository [docker.io/tynam/api]
de38accaade6: Pushed
52574f25c16c: Pushed
c2e450965650: Pushed
86dd60275049: Pushed
58f7d369eb64: Pushed
7e8b1f6898b0: Mounted from tynam/test
e91ff66f967f: Mounted from tynam/test
e05388744d34: Mounted from tynam/test
d4aeb4b1e8cc: Mounted from tynam/test
46829331b1e4: Mounted from tynam/test
d35c5bda4793: Mounted from tynam/test
a3c1026c6bcc: Mounted from tynam/test
f1d420c2af1a: Mounted from tynam/test
: Mounted from tynam/test
v1.: digest: sha256:c821d6afcfb43cc03b47bf3e0241d04472f4ecc83455dd5b6a3acc6a1b5b3276 size:

上传完成后进入自己的仓库可以查看上传结果

通过dockerfile制作镜像的更多相关文章

  1. Docker 0x05: Dockerfile制作镜像

    目录 Dockerfile制作镜像 一句话什么是dockerfile dockerfile脚本指令 小结 Dockerfile制作镜像 dockerfile 可以是制作自己镜像的脚本文件,按照这个脚本 ...

  2. docker-使用Dockerfile制作镜像

    最近项目中有使用docker,组内做了关于docker的培训,然后自己跟着研究了一下,大概了解如何使用.我是基于tomcat镜像制作(不需要安装jdk,配置环境变量),基于centos镜像制作需要安装 ...

  3. docker(9)Dockerfile制作镜像

    前言 如果我们已经安装了一个python3的环境,如果另一台机器也需要安装同样的环境又要敲一遍,很麻烦,这里可以配置Dockerfile文件,让其自动安装,类似shell脚本 Dockerfile编写 ...

  4. Docker部署运行springboot项目,并使用Dockerfile制作镜像

    前言: 本来是要搭建一个自动化部署分布式项目的服务器平台的,使用jenkins+k8s+ELK+springboot把一个简单的springboot项目给搞起来,由于工程太大,先分开把每个技术组件单独 ...

  5. Dockerfile制作镜像

    Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像, 另外,使用Dockerfile去构建镜像好比使用pom去构建m ...

  6. 使用Dockerfile制作镜像

    组成部分 基础镜像信息       FROM 维护者信息    MAINTAINER.LABEL 镜像操作指令       RUN.COPY.ADD.EXPOSE.WORKDIR.ONBUILD.US ...

  7. dockerfile 制作镜像

    # Set the base image to UbuntuFROM ubuntu # File Author chenghanMAINTAINER chenghan ################ ...

  8. Docker系列06—基于容器制作镜像并上传到Docker Registry

    本文收录在容器技术学习系列文章总目录 1.制作镜像 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 本篇主要详细讲解基于容器制作镜像:基于dockerfile 制 ...

  9. Docker build Dockerfile 构建镜像 - 二

    Dockerfile 制作镜像 https://hub.docker.com/ 搜索需要镜像: https://hub.docker.com/_/centos/ 官方示例: centos:6 1.这里 ...

随机推荐

  1. ASP.NET MVC升级到ASP.NET Core MVC踩坑小结

    写在前面 ASP.NET Core是微软新推出的支持跨平台.高性能.开源的开发框架,它的优势不必多说,因为已经说得太多了.当然,现在依然有着数量庞大的系统运行于.NET Framework上,由于有大 ...

  2. 如何使用WordPress搭建网站

    1.空间的申请 阿里用户可以申请[阿里共享虚拟主机普惠版6元/年],虽然配置和空间不高,但也可以做个小站点的.当不满足当前配置的时候,随时可以进行升级,所以拿来练手还是比较合适的.   2.WordP ...

  3. 重磅!刷新两项世界纪录的腾讯优图人脸检测算法DSFD开源了!

    近日,知名开源社区Github上有个名为DSFD(Dual Shot Face Detector)的算法引起了业内关注,它正是来自于腾讯优图.目前,该算法已经被计算机视觉顶级会议CVPR 2019接收 ...

  4. 2.Grpc消息定义

    一个简单示例 syntax ="proto3";//设置默认版本,不写默认为proto2 //1,2,3 是字段的标记 Tag 不表示字段的值 message FirstMessa ...

  5. 将java中Map对象转为有相同属性的类对象(json作为中间转换)

    java中Map对象转为有相同属性的类对象(json作为中间转换) 准备好json转换工具类 public class JsonUtil { private static ObjectMapper o ...

  6. bitset 相关题目

     std::bitset 的语法就不搬运了, 直接看题吧   #515. 「LibreOJ β Round #2」贪心只能过样例 题意: 给出 n 个数 \(x_i\), 每个数的取值范围为 \([a ...

  7. Mybatis多表关联查询字段值覆盖问题

    一.错误展示 1.首先向大家展示多表关联查询的返回结果集 <resultMap id="specialdayAndWorktimeMap type="com.hierway. ...

  8. 从 Linux 操作系统谈谈 IO 模型(终)

    Linux 为什么要区分内核空间与用户空间? Linux 操作系统的 IO 模型有哪几种?有啥区别? 常说的阻塞现象,到底是咋回事? 网络编程研发时,那块到底耗时最多,代码是否还有优化空间? 前几期的 ...

  9. js检查数据类型

    在实际工作中我们经常遇到要检测传入的参数类型是什么.也许第一时间想的的是typeof ,但这个也只是能检测个别的一些类型.如果要检测null,Array这些类型呢? 所以我们可以封装一个方法可以更加方 ...

  10. Oracle数据库表和表列讲解

    如果将数据库比作一个存储东西的储物柜,表就像是储物柜上的各个抽屉,每个抽屉分门别类地存放了各种数据,在设计和规划数据库时,表的定义和规划往往相当重要,良好的表设计决定了程序人员编写程序的便利性与数据库 ...