标签:生产环境 其他 repo 一级目录 指定 端口映射 远程 网络 ret
docker集群部署:第2部分:容器介绍
现在是开始构建Docker应用程序。我们将从这个应用程序的层次结构的底部开始,这个应用程序是一个容器。在这个层次上面是一个服务,它定义了容器在生产中的行为方式,将在第3部分中进行讨论。最后,在顶层是堆栈,定义了所有服务的交互,将在第5部分进行讨论。
Dockerfile中每条语句的注释如下:
##使用官方的Python运行时作为源镜像
FROM python:2.7-slim
##将工作目录设置为/ app
WORKDIR /app
##将当前目录内容复制到/ 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"]
说明:你在代理服务器后面吗?
代理服务器启动并运行后,可以阻止与您的网络应用程序的连接。如果您位于代理服务器的后面,请使用ENV命令为你的代理服务器指定主机和端口,将以下行添加到Dockerfile中:
##设置代理服务器,将host:port替换为服务器的值
ENV http_proxy host:port
ENV https_proxy host:port
注意:在使用pip之前添加这些行,以便安装成功。
这个Dockerfile引用了一些我们还没有创建的文件,分别是app.py和requirements.txt。接下来创建这些。
#cat requirements.txt
Flask
Redis
#cat 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类似。
$ ls
Dockerfile app.py requirements.txt
现在运行build命令。这会创建一个Docker镜像,我们将使用-t标记,因此它有一个名字。
#docker build -t friendlyhello .
查看创建的镜像,它在你的机器的本地Docker镜像注册表中:
$ docker images
REPOSITORY TAG IMAGE ID
friendlyhello latest 326387cea398
#docker run -p 4000:80 friendlyhello
$ curl http://localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> 8fc990912a1
这个4000:80的端口重映射是为了演示Dockerfile中的EXPOSE与使用docker run -p发布的内容之间的区别。在后面的步骤中,我们将主机上的端口80映射到容器中的端口80,并使用http:// localhost。
现在让我们以分离模式在后台运行应用程序:
#docker run -d -p 4000:80 friendlyhello
你得到你的应用程序的容器ID,然后被返回你的终端。你的容器正在后台运行。你还可以使用docker container ls查看容器标识(或者使用docker ps):
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED
1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
现在使用docker container stop来结束进程,使用CONTAINER ID,如下所示:
#docker container stop 1fa4ab2cf395
登录到本地机器上的Docker公共注册表。
$ docker login
docker tag image username/repository:tag
举例:
docker tag friendlyhello john/get-started:part2
运行docker以查看新标记的图像。(您也可以使用docker image ls。)
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest d9e555c53008 3 minutes ago 195MB
john/get-started part2 d9e555c53008 3 minutes ago 195MB
将标记的镜像上传到存储库:
#docker push username/john/get-started:part2
举例如下:
#docker push wtf(用户名)/repository:tag
一旦完成,这个上传的结果是公开的。如果你登录到Docker Hub,你将会看到那个新的镜像和它的pull命令。
#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
无论Docker运行在哪里,它都会将您的镜像,Python以及所有依赖项从requirements.txt中提取出来,并运行您的代码。它们一起旅行在一个整洁的小包里,主机不需要安装任何东西,除了Docker。
标签:生产环境 其他 repo 一级目录 指定 端口映射 远程 网络 ret
原文地址:http://blog.51cto.com/wutengfei/2063990