使用 Dockerfile 定义容器
2018-11-30 本文已影响6人
tingshuo123
准备
新建一个空目录 docker-test
sudo mkdir docker-test
文件夹下有三个文件
$ ls
app.py Dockerfile requirements.txt
文件内容分别为
$ cat Dockerfile
# 将官方 Python 运行时用作父镜像
FROM python:2.7-slim
# 将工作目录设置为 /app
WORKDIR /app
# 将当前目录内容复制到位于 /app 中的容器中
ADD . /app
# 安装 requirements.txt 中指定的任何所需软件包
RUN pip install -r requirements.txt
# 使端口 80 可供此容器外的环境使用
EXPOSE 80
# 定义环境变量
ENV NAME World
# 在容器启动时运行 app.py
CMD ["python", "app.py"]
$ cat requirements.txt
Flask
Redis
$ cat Dockerfile
# 将官方 Python 运行时用作父镜像
FROM python:2.7-slim
# 将工作目录设置为 /app
WORKDIR /app
# 将当前目录内容复制到位于 /app 中的容器中
ADD . /app
# 安装 requirements.txt 中指定的任何所需软件包
RUN pip install -r requirements.txt
# 使端口 80 可供此容器外的环境使用
EXPOSE 80
# 定义环境变量
ENV NAME World
# 在容器启动时运行 app.py
CMD ["python", "app.py"]
ubuntu@VM-0-10-ubuntu:~/test-python$ 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__":
构建应用
运行构建命令,创建由我们自己定制 Docker 镜像
docker build -t friendlyhello .
构建成功标识
Successfully built 730effa82331
Successfully tagged friendlyhello:latest
查看镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest 730effa82331 29 minutes ago 131MB
<none> <none> be8ab6ceffdf 32 minutes ago 120MB
python 2.7-slim 0dc3d8d47241 13 days ago 120MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
运行应用
运行应用,使用 -p
参数将机器的 4000 端口映射到 Docker 容器的 80 端口:
$ docker run -p 4000:80 friendlyhello
启动成功标识
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
可以另起一个终端,使用 curl 访问通过 Docker 启动的应用
$ curl localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> c4fb61eb00ef<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
成功后可以使用 CTRL + C
退出 Python 应用