注意
以下内容完全摘自Docker官方文档,仅为学习及技术分享所用,切勿用于商业用途,转载请注明出处。
以下为正文
Dockerfile
从现在开始,我们进入Docker实践,首先,让我们来创建第一个Docker镜像,它将启动一个容器,容器中运行一个简单的Python应用。
正如之前我们所学到的,Docker镜像文件包含了您的应用程序正常运行需要的一切,包括对资源需求、环境的要求、依赖的类库和运行的代码等等。那么如何来定义和描述一个Docker镜像呢,需要使用Dockerfile。
Dockerfile定义在您的容器中的运行环境,包括像网络接口和虚拟化的磁盘驱动等硬件资源,这些资源是与您的宿主系统隔离开的,不会对您的系统有作何影响。Dockerfile用于构建一致的Docker镜像,使用Docker镜像运行Docker容器,可以让定义在该镜像中的应用程序无论在哪里运行,都有一致的功能。
编写第一个Dockerfile
在一个空目录下创建一个名为Dockerfile的文件,在该文件中输入以下内容
Dockerfile
# 使用官方python镜像作为根镜像
FROM python:2.7-slim
# 将容器工作目录设置为 /app
WORKDIR /app
# 将当前目录(宿主机)中的内容全部复制到容器的 /app 目录下
ADD . /app
# 安装 requirements.txt 中定义好的包
RUN pip install -r requirements.txt
# 对外公开容器的80端口
EXPOSE 80
# 定义一个环境变量world
ENV NAME World
# 在容器启动时,运行 python app.py命令
CMD ["python", "app.py"]
如果您仔细阅读上面的Dockerfile,你会发现我们还需要创建requirements.txt和app.py,在Dockerfile所在目录下依次创建这两个文件。
requirements.txt
Flask
Redis
requirements.txt中定义了容器依赖的包:Flask和Redis。Dockerfile中的RUN pip install -r requirements.txt将会读取到requirements.txt中的内容,然后安装这些依赖包。
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)
构建镜像
现在使用我们编写好的Dockerfile来构建镜像,运行以下命令,生成一个tag为pythonhelloworld的docker镜像
docker build -t pythonhelloworld
这样创建好的镜像文件就存放在您本地的Docker registry(注册中心)里。
您可以运行以下命令来查看所有本地注册中心的镜像
docker images
运行镜像 启动容器
运行以下命令,将您本机的4000端口映射到docker容器的80端口
docker run -p 4000:80 pythonhelloworld
您可以通过http://localhost:4000
查看到运行的结果
也可以使用 -d 参数,将容器运行在后台
docker run -p -d 4000:80 pythonhelloworld
可以使用 docker ps 命令,查看所有运行中的docker容器进程
docker ps
CONTAINER ID IMAGE COMMAND CREATED
13f4a444f359 pythonhelloworld "python app.py" 35 seconds ago
使用docker stop <hash> 命令,结束某个docker容器进程
docker stop 13f4a444f359
分享您的镜像
现在可以将您刚刚构建的这个镜像发布到Docker public registry上(也可以发布到其他公共registry或者私人配置的registry中),这样无论在哪里,只要在一个安装了docker的机器上拉取这个镜像,就可以在该机器上启动一样的容器。
注册您的docker账号
如果您还没有docker账号,您需要首先到这里注册一个账号:cloud.docker.com.
然后您就可以使用login命令登录了。
docker login
发布您的镜像
可以使用以下命令标记您的镜像,其中username是您自己的用户名,repository是您自定义的仓库名,tag标记是可选的,默认为latest
docker tag pythonhelloworld username/repository:tag
运行以下命令发布该镜像
docker publish username/repository:tag
发布成功后,在任何docker机器上,运行以下命令就会自动拉取和运行该镜像了
docker run -p 4000:80 username/repository:tag