参考官方文档: docker官方文档
创建一个空目录,创建一个名为的文件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.py和requirements.txt。让我们创建下一个。
再创建两个文件,requirements.txt和app.py,然后将它们放在和Dockerfile同一个文件夹中。这完成了我们的应用程序,您可以看到它非常简单。当上述Dockerfile被内置到的图像,app.py并且requirements.txt是因为存在Dockerfile的ADD命令,并从输出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