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

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

注意:在容器内部访问容器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

Hello World!

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

这个端口重新映射的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

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(docker,Linux)