容器基础4:重识docker容器
docker容器实际案例
1.使用docker部署python写的web应用
from flask import Flask
import socket
import os
app = Flask(__name__)
@app.route('/')
def hello():
html = "Hello {name}
Hostname: {hostname}
"
return html.format(name=os.getenv("NAME","world"),hostname=socket.gethostname())
if __name__ == "__main__":
app.run(host='0.0.0.0',port=80)
$ cat requirements.txt
Flask
2.制作容器镜像
使用Dockerfile制作docker镜像,也就是rootfs
# 使用官方提供的Python开发镜像作为基础镜像
FROM python:2.7-slim
# 将工作目录切换为/app
WORKDIR /app
# 将当前目录下的所有内容复制到/app下
ADD ./app
# 使用pip命令安装这个应用所需要的依赖
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 允许外接访问容器的80端口
EXPOSE 80
# 设置环境变量
ENV NAME world
# 设置容器进程为:python app.py 即:这个Python应用程序的启动命令
CMD ["python","app.py"]
3.Dockerfile设计思想
使用标准原语,(大写高亮的词语),描述我们要构建的Docker镜像。并且这些原语,都是按顺序处理的
FROM原语:指定"python:2.7-slim"这个官方维护的镜像,从而免去安装Python等语言环境的操作
RUN原语: 容器里执行shell命令的意思
WORKDIR:dockerfile后面的操作都以这一句指定的/app目录作为当前目录
CMD: dockerfile指定python app.py为这个容器的进程,这里app.py的实际路径是/app/app.py
所以CMD["python","app.py"]等价于 docker run
这个容器进程“python app.py”,运行在由 Linux Namespace 和 Cgroups 构成的隔离环境里;而它运行所需要的各种文件,比如 python,app.py,以及整个操作系统文件,则由多个联合挂载在一起的 rootfs 层提供。
这些 rootfs 层的最下层,是来自 Docker 镜像的只读层。在只读层之上,是 Docker 自己添加的 Init 层,用来存放被临时修改过的 /etc/hosts 等文件。而 rootfs 的最上层是一个可读写层,它以 Copy-on-Write 的方式存放任何对只读层的修改,容器声明的 Volume 的挂载点,也出现在这一层。