docker学习笔记2---Dockerfile构建镜像并测试运行

本文详细介绍如何使用Dockerfile构建包含Python应用的镜像,包括设置工作目录、添加文件、安装依赖、暴露端口及定义环境变量。并通过具体实例展示了如何运行构建的镜像,包括映射端口、在浏览器中访问应用以及在后台运行。

Dockerfile构建镜像并测试运行

参考官方文档: docker官方文档

1创建Dockerfile

创建一个空目录,创建一个名为的文件Dockerfile,将以下内容复制并粘贴到该文件中,然后保存。记下解释新Dockerfile中每个语句的注释。

# 使用官方Python作为运行时父镜像

FROM python:2.7-slim

# 设置工作目录 /app

WORKDIR /app

#将当前目录内容复制到应用程序容器中

ADD . /app

#安装所有requirements.txt规定的的包

RUN pip install --trusted-host pypi.python.org -r requirements.txt

#将80的端口号暴露在容器外

EXPOSE 80

#定义环境变量

ENV NAME World

# 当容器启动时运行app.py

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

Dockerfile是指我们尚未创建的几个文件,即 app.pyrequirements.txt。让我们创建下一个。

再创建两个文件,requirements.txtapp.py,然后将它们放在Dockerfile同一个文件夹中。这完成了我们的应用程序,您可以看到它非常简单。当上述Dockerfile被内置到的图像,app.py并且requirements.txt是因为存在DockerfileADD命令,并从输出app.py是通过HTTP得益于访问EXPOSE 命令。

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 = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \

           "<b>Hostname:</b> {hostname}<br/>" \

           "<b>Visits:</b> {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本身),我们应该期望在这里使用它的尝试失败并产生错误消息。

注意:在容器内部访问容器ID时,访问主机名称,这类似于正在运行的可执行文件的进程ID。

您不需要Python或requirements.txt系统中的任何内容,也不需要构建或运行此映像将它们安装在您的系统上。看起来你并没有真正建立一个Python和Flask的环境,但你已经在使用了

我们准备构建应用程序。确保您仍处于新目录的顶层。这是ls应该显示的内容:

$ ls 

Dockerfile   app.py   requirements.txt

现在运行build命令。这会创建一个Docker镜像,我们将使用-t它来标记。

docker build -t friendlyhello .                                        #创建镜像

你的建筑形象在哪里?它位于您机器的本地Docker镜像注册表中:

$ docker image ls

REPOSITORY            TAG                 IMAGE ID

friendlyhello         latest              326387cea398

运行该应用程序

运行应用程序,使用以下方法将计算机的端口4000映射到容器的已发布端口80 -p

docker run -p 4000:80 friendlyhello

您应该看到Python正在为您的应用程序提供服务的消息http://0.0.0.0:80。但是该消息来自容器内部,它不知道您将该容器的端口80映射到4000,从而生成正确的URL http://localhost:4000

在Web浏览器中转到该URL,以查看在网页上提供的显示内容。

您还可以curl在shell中使用该命令来查看相同的内容。

$ curl http://localhost:4000

<h3>Hello World!</h3><b>Hostname:</b> 8fc990912a14<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>

这个端口重新映射的4000:80演示之间的差异EXPOSE中的Dockerfile哪些的publish运行时值设置docker run -p。在后面的步骤中,将主机上的端口4000映射到容器中的端口80并使用http://localhost

点击CTRL+C你的终端退出。

现在让我们以分离模式在后台运行应用程序:

docker run -d -p 4000:80 friendlyhello

您获得应用程序的长容器ID,然后被踢回终端。您的容器正在后台运行。您还可以看到缩写的容器ID docker container ls(并且在运行命令时都可以互换):(COMMAND代表运行时启动命令)

$ docker container ls

CONTAINER ID        IMAGE               COMMAND             CREATED

1fa4ab2cf395        friendlyhello       "python app.py"     28 seconds ago

请注意,CONTAINER ID匹配的是什么http://localhost:4000

现在docker container stop用来结束这个过程,使用CONTAINER ID如下:

docker container stop 1fa4ab2cf395

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值