docker example

1
2
3
4
$ tree identidock/
identidock/
└─ app
└─ identidock.py

identidock.py

1
2
3
4
5
6
7
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!\n'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')

在 identidock 目录下,创建一个名为
Dockerfile 的文件

1
2
3
4
5
FROM python:3.4
RUN pip install Flask==0.10.1
WORKDIR /app
COPY app /app
CMD ["python", "identidock.py"]

现在,可以构建和运行我们的简单应用了:

1
2
3
4
5
$ cd identidock
$ docker build -t identidock .
...
$ docker run -d -p 5000:5000 identidock
0c75444e8f5f16dfe5aceb0aae074cc33dfc06f2d2fb6adb773ac51f20605aa4

我把 -d 选项传给 docker run,让它在后台启动容器,但如果想看到 Web 服务器
的输出,也可以把它省略。-p 5000:5000 参数告诉 Docker,我们要将容器的 5000 端口转发
到主机上的 5000 端口。

test

1
2
$ curl localhost:5000
Hello World!

目前这个工作流程有一个比较严重的问题:即使代码只有少许改变,我们
也需要重新创建镜像,并且重启容器。幸好,有一个简单的解决方法。我们可以把主机上
的源码目录绑定挂载(bind mount)到容器内的源码目录之上。

1
docker run -d -p 5000:5000 -v "$PWD"/app:/app identidock

-v “$PWD”/app:/app 参数把位于 /app 的 app 目录挂载到容器内。它将覆盖容器中 /app 目录
的内容 ,而且在容器内还可以进行读写(如果你不希望这样,也可以把数据卷挂载为只
读)。参数 -v 必须是绝对路径,因此在这个例子中,我们在当前的目录前加上 $PWD,