热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

怎么用Dockerfile定义一个镜像

本篇内容介绍了“怎么用Dockerfile定义一个镜像”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习

本篇内容介绍了“怎么用Dockerfile定义一个镜像”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

容器

准备工作

  • 安装Docker,版本为1.13或者1.13之上。


  • 给你的Docker环境一个快速的测试,确保所有的工作准备就绪:

docker run hello-world

你的新的开发环境

在过去,如果你写一个pyhton的应用,你的第一步是在你的机器上安装python的开发环境。但是需要你的机器上的运行环境与应用程序完美适合,并且也需要匹配生产环境。

利用docker,你能移植一个便捷的python的运行库作为镜像,无需安装。然后,通过构建包含python运行环境和你的应用代码一起的镜像,能够确保你的代码和运行环境完美结合并运行。

这些便捷的镜像通过被称作DockeFile的文件定义。

通过Dockerfile定义一个镜像

dockerfile定义了在容器内部跑什么运行环境。访问网络接口和磁盘驱动器等资源是在此环境中虚拟化的,与系统其余部分隔离,因此你需要将端口映射到外部世界,并明确要将哪些文件“复制”到 运行的环境。 然而,在完成这些之后,你可以预期,在此Dockerfile中定义的应用程序的构建在运行时的行为完全相同。

Dockerfile

创建一个空的文件夹。通过cd命令进入到新创建的文件夹,创建一个文件取名Dockerfile,复制以下内容到文件中,并保存。

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

这个Dockerfile关联了2个我们还没有创建的文件,,即app.py和requirements.txt。下面我们来创建。

应用程序部分

创建2个文件,requirements.txt和app.py,并且将它们放到和Dockerfile放进同一个文件夹中。这就完成了我们的应用,你可以发现用创建应用很简单。当上面的Dockerfile构建成镜像,app.py和requirements.txt通过Add命令加入到镜像去了,Expose命令能够暴露端口,可以通过http访问。

requirements.txt

Flask
Redis

app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "cannot connect to Redis, counter disabled"

    html = "

Hello {name}!

" \            "Hostname: {hostname}
" \            "Visits: {visits}"     return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) if __name__ == "__main__":     app.run(host='0.0.0.0', port=80)

现在我们看到pip install -r requirements.txt为Python安装Flask和Redis库,并且该应用程序打印环境变量NAME以及调用socket.gethostname()的输出。 最后,因为Redis没有运行(因为我们只安装了Python库,而不是Redis本身),所以我们应该期望在这里尝试使用它会失败并产生错误消息。

那正是要点! 您的系统上不需要Python或任何requirements.txt文件,也不需要在您的系统上安装或运行此映像。看起来你并没有真正用Python和Flask建立一个环境,但是你已经拥有了。

构建应用

我们已经为构建应用做好了准备。确保你对新建的文件与最高的权限。下面是通过ls命令,应该显示以下内容:

$ ls
Dockerfile        app.py            requirements.txt

现在运行构建命令。创建一个Docker镜像,通过-t标记,从而使镜像有一个友好的名字。

docker build -t friendlyhello .

你构建的镜像在哪里?在你的机器的本地Docker镜像注册库“

$ docker image ls

REPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398

运行应用

运行应用程序,使用-p将机器的端口4000映射到容器的已发布端口80:

docker run -p 4000:80 friendlyhello

你应该在http://0.0.0.0:80看到一条消息,Python正在为你的应用程序提供服务。 但是该消息来自容器内部,它不知道将该容器的端口80映射到4000,

在浏览器中http://localhost:4000 可以查看网页上显示的显示内容。

怎么用Dockerfile定义一个镜像

你也可以通过curl命令查看相同的内容:

$ curl http://localhost:4000

Hello World!

Hostname: 8fc990912a14
Visits: cannot connect to Redis, counter disabled

这个4000:80的端口重映射是为了演示Dockerfile中的EXPOSE与使用docker run -p发布的内容之间的区别。 在后面的步骤中,我们只需将主机上的端口80映射到容器中的端口80并使用http:// localhost。

按CTRL+C结束进程。

现在可以让应用程序在后端进程中运行,用detached 模式。

docker run -d -p 4000:80 friendlyhello

你可以获取应用的容器ID,通过容器ID将应用程序停止。 容器正在后台运行。 可以使用docker container ls命令查看缩写的容器ID:

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED
1fa4ab2cf395        friendlyhello       "python app.py"     28 seconds ago

现在用docker containner stop 命令结束进程,需要用到 container id,如下:

docker container stop 1fa4ab2cf395

分享你的镜像:

为了演示我们刚才创建的容器具有可移植性,我们上传我们构建的映像并可以在其他的任何地方运行。 毕竟,当你想要将容器部署到生产环境时,弄需要知道如何推送注册仓库。

注册仓库是存储库的集合,而存储库是图像的集合 - 有点像GitHub存储库,但代码已经创建。 注册仓库上的帐户可以创建许多存储库。 docker CLI默认使用Docker的公共注册库。

登录dokcer Id

如果你还没有Docker帐户,请在网站cloud.docker.com注册一个帐户。 记下你的用户名。

登录到本地计算机上的Docker公共注册库。

$ docker login

标记镜像

将本地映像与注册库中的存储库相关联的命令是username / repository:tag。 该标签是可选的,但建议使用,因为它是注册管理机构用于为Docker镜像提供版本的机制。 为该上下文提供存储库并标记有意义的名称,例如get-started:part2。 这将图像放入启动存储库并将其标记为part2。

现在,把它放在一起来标记图像。使用你的用户名,存储库和标签名称运行码头标签图像,以便将图像上传到您想要的目的地。 该命令的语法是:

docker tag image username/repository:tag

比如:

docker tag friendlyhello john/get-started:part2

运行 docker image ls 命令去查看你的新的标记的镜像。

$ docker image ls

REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
friendlyhello            latest              d9e555c53008        3 minutes ago       195MB
john/get-started         part2               d9e555c53008        3 minutes ago       195MB
python                   2.7-slim            1c7128a655f6        5 days ago          183MB
...

推送镜像

上传你的标记的镜像去仓库

docker push username/repository:tag

完成后,此上传的结果将公开发布。 如果你登录到Docker Hub,则可以通过其pull命令在那里看到新映像。

从远程仓库获取并运行镜像

从现在起,你可以使用docker run并使用此命令在任何机器上运行你的应用程序:

docker run -p 4000:80 username/repository:tag

如果镜像在本地机器没有,docker 从仓库中拉取。

$ docker run -p 4000:80 john/get-started:part2
Unable to find image 'john/get-started:part2' locally
part2: Pulling from john/get-started
10a267c67f42: Already exists
f68a39a6a5e4: Already exists
9beaffc0cf19: Already exists
3c1fe835fb6b: Already exists
4c9f1fa8fcb8: Already exists
ee7d8f576a14: Already exists
fbccdcced46e: Already exists
Digest: sha256:0601c866aab2adcc6498200efd0f754037e909e5fd42069adeff72d1e2439068
Status: Downloaded newer image for john/get-started:part2
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)

无论docker run在哪里执行,它都会将你的镜像以及Python和requirements.txt中的所有依赖关系一起提取出来,并运行你的代码。 它们都在一个整洁的小包中,并且您不需要在主机上安装任何Docker

命令复习

这里列出了这个页面的基本Docker命令,以及一些相关的命令,如果你想在继续之前探索一下。

ocker build -t friendlyhello .  # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyhello  # Run "friendlyname" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyhello         # Same thing, but in detached mode
docker container ls                                # List all running containers
docker container ls -a             # List all containers, even those not running
docker container stop            # Gracefully stop the specified container
docker container kill          # Force shutdown of the specified container
docker container rm         # Remove specified container from this machine
docker container rm $(docker container ls -a -q)         # Remove all containers
docker image ls -a                             # List all images on this machine
docker image rm             # Remove specified image from this machine
docker image rm $(docker image ls -a -q)   # Remove all images from this machine
docker login             # Log in this CLI session using your Docker credentials
docker tag  username/repository:tag  # Tag  for upload to registry
docker push username/repository:tag            # Upload tagged image to registry
docker run username/repository:tag

“怎么用Dockerfile定义一个镜像”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程笔记网站,小编将为大家输出更多高质量的实用文章!


推荐阅读
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文介绍了在Windows系统下安装Python、setuptools、pip和virtualenv的步骤,以及安装过程中需要注意的事项。详细介绍了Python2.7.4和Python3.3.2的安装路径,以及如何使用easy_install安装setuptools。同时提醒用户在安装完setuptools后,需要继续安装pip,并注意不要将Python的目录添加到系统的环境变量中。最后,还介绍了通过下载ez_setup.py来安装setuptools的方法。 ... [详细]
  • Window10+anaconda+python3.5.4+ tensorflow1.5+ keras(GPU版本)安装教程 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
author-avatar
囬憶啲伈情_542_256_427
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有