docker运行环境
只需安装docker,将一些常用的基础环境或应用做成镜像(image),在应用代码里指明基础镜像、及依赖,实现可移植。
这些可移植的镜像由Dockerfile
来定义。
使用Dockerfile定义容器
dockerfile定义容器内部运行环境。访问网络接口、磁盘驱动等资源就在这个环境中虚拟化,这个环境与系统其它部分是隔离的,因此必须将断口映射到外部,并且指明你想复制哪个文件到虚拟环境中。这样做后,Dockerfile中定义的应用构建在任何地方运行都一样。
Dockerfile
创建一个文件,名为Dockerfile
,内容如下:
# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
应用本身
再创建2个文件,requirements.txt
,app.py
,与Dockerfile
在同一路径下。当这个Dockerfile
构建镜像时,requirements.txt
和app.py
就会被加入镜像中,因为使用了ADD
命令。又由于EXPOSE
命令,app.py
将可以通过HTTP访问。
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
时安装Flask、Redis依赖。
就是这样!你的电脑不需要安装python或者requirements.txt中的任何依赖,也不会在你电脑运行这些镜像。看起来并不像是你真正搭建起了python和flask的环境,但是你已经搭好了。
构建应用
docker build -t friendlyhello .
-t
代表tag,标记一个更友好的名字。
查看构建好的镜像:
$ docker images
REPOSITORY TAG IMAGE ID
friendlyhello latest 326387cea398
启动应用
docker run -p 4000:80 friendlyhello
容器实际运行在http://0.0.0.0:80
,由于-p
进行端口映射,本地访问的正确地址是http://localhost:4000
。
docker run -d -p 4000:80 friendlyhello
-d
代表以detached模式运行容器。
查看正在运行的容器:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED
1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
指定容器ID,停止运行容器:
docker container stop 1fa4ab2cf395
分享你的镜像
以Docker ID登录
docker login
标记镜像
docker tag image username/repository:tag
发布镜像
docker push username/repository:tag
发布之后你就可以去 Docker Hub 查看到你刚刚发布的镜像啦。
从远程仓库拉取并运行镜像
docker run -p 4000:80 username/repository:tag
如果本地环境没有这个镜像,docker会从远程仓库拉取,再运行。
无论docker run
在哪执行,都会拉取你的镜像,和python以及其他所有requirements.txt
里的依赖包,并执行你的代码。它们一起在一个整洁的包里被移植,主机不需要安装任何环境只需要Docker就能将之运行起来。