没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
2019/10/16 08 | 白话容器基础(四):重新认识Docker容器
file:///C:/Users/qiaochaowen/Desktop/k8s/08%20%20%E7%99%BD%E8%AF%9D%E5%AE%B9%E5%99%A8%E5%9F%BA%E7%A1%80%E
…
1/16
08 | 白话容器基础(四):重新认识Docker容器
08 | 白话容器基础(四):重新认识
Docker容器
张磊 2018-09-10
23:01
讲述:张磊 大小:9.23M
你好,我是张磊。今天我和你分享的主题是:白话容器基础之重新认识 Docker 容
器。
在前面的三次分享中,我分别从 Linux Namespace 的隔离能力、Linux Cgroups
的限制能力,以及基于 rootfs 的文件系统三个角度,为你剖析了一个 Linux 容器
的核心实现原理。
备
注
:
之
所
以
要
强
调
Linux
容
器
,
是
因
为
比
如
Docker on Mac
,
以
及
Windows Docker
(
Hyper-V
实
现
),
实
际
上
是
基
于
虚
拟
化
技术
实
现
的
,
跟
我
们
这
个专
栏
着
重
介
绍的
Linux
容
器
完
全不
同
。
2019/10/16 08 | 白话容器基础(四):重新认识Docker容器
file:///C:/Users/qiaochaowen/Desktop/k8s/08%20%20%E7%99%BD%E8%AF%9D%E5%AE%B9%E5%99%A8%E5%9F%BA%E7%A1%80%E
…
2/16
而在今天的分享中,我会通过一个实际案例,对“白话容器基础”系列的所有内容
做一次深入的总结和扩展。希望通过这次的讲解,能够让你更透彻地理解 Docker
容器的本质。
在开始实践之前,你需要准备一台 Linux 机器,并安装 Docker。这个流程我就不
再赘述了。
这一次,我要用 Docker 部署一个用 Python 编写的 Web 应用。这个应用的代码
部分(app.py)非常简单:
from flask import Flask
import socket
import os
app = Flask(__name__)
@app.route('/')
def hello():
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>"
return html.format(name=os.getenv("NAME", "world"),
hostname=socket.gethostname())
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
复制代码
在这段代码中,我使用 Flask 框架启动了一个 Web 服务器,而它唯一的功能是:
如果当前环境中有“NAME”这个环境变量,就把它打印在“Hello”后,否则就
打印“Hello world”,最后再打印出当前环境的 hostname。
这个应用的依赖,则被定义在了同目录下的 requirements.txt 文件里,内容如下
所示:
$ cat requirements.txt
Flask
复制代码
而将这样一个应用容器化的第一步,是制作容器镜像。
不过,相较于我之前介绍的制作 rootfs 的过程,Docker 为你提供了一种更便捷
的方式,叫作 Dockerfile,如下所示。
# 使用官方提供的 Python 开发镜像作为基础镜像
2019/10/16 08 | 白话容器基础(四):重新认识Docker容器
file:///C:/Users/qiaochaowen/Desktop/k8s/08%20%20%E7%99%BD%E8%AF%9D%E5%AE%B9%E5%99%A8%E5%9F%BA%E7%A1%80%E
…
3/16
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"]
复制代码
通过这个文件的内容,你可以看到Dockerfile 的设计思想,是使用一些标准的原
语(即大写高亮的词语),描述我们所要构建的 Docker 镜像。并且这些原语,
都是按顺序处理的。
比如 FROM 原语,指定了“python:2.7-slim”这个官方维护的基础镜像,从而免
去了安装 Python 等语言环境的操作。否则,这一段我们就得这么写了:
FROM ubuntu:latest
RUN apt-get update -yRUN apt-get install -y python-pip python-dev
build-essential
...
复制代码
其中,RUN 原语就是在容器里执行 shell 命令的意思。
而 WORKDIR,意思是在这一句之后,Dockerfile 后面的操作都以这一句指定的
/app 目录作为当前目录。
所以,到了最后的 CMD,意思是 Dockerfile 指定 python app.py 为这个容器的
进程。这里,app.py 的实际路径是 /app/app.py。所以,CMD [“python”,
“app.py”] 等价于 "docker run python app.py"。
另外,在使用 Dockerfile 时,你可能还会看到一个叫作 ENTRYPOINT 的原语。
实际上,它和 CMD 都是 Docker 容器进程启动所必需的参数,完整执行格式
是:“ENTRYPOINT CMD”。
剩余15页未读,继续阅读
石悦
- 粉丝: 11
- 资源: 285
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0