开发时,我们总是会碰到这样一些问题:
- 在多台服务器重复安装同一个环境
- 开发时项目在本地正常运行,一放到服务器上就挂了
- 测试人员提的bug,在自己的电脑上并没有出现,怀疑是环境问题和测试员左右争辩
- 测试数据不隔离,因数据问题产生错误
- 管理环境配置文件麻烦
为了解决以上问题,我们希望可以这样:
- 通过简单的几条命令,就能配置好运行环境
- 服务之间可以自由组合,自定义特殊环境需求
- 理直气壮的接受测试员抛过来的bug
幸运的是,docker实现了我们的愿望。 docker甚至在部分情况下,搭建环境就和安装app一样简单,只需要一条命令行就可以让服务跑起来。
例如要搭建一个nginx文件服务:
docker run -v build:/etc/nginx/html -p 80:80 nginx
不仅过程极其简单,多次重复尝试,运行的结果也能保持一致。
一个简单的网站
docker官方提供了一个新手示例
项目目录结构
|-- templates // 页面模版
|-- index.html
|-- Dockerfile // docker镜像配置文件
|-- app.py // python服务入口文件
|-- requirements.txt // python依赖文件
自定义一个应用,是通过配置Dockerfile来实现的:
# 依赖的镜像
FROM alpine:3.5
# 安装 python 和 pip
RUN apk add --update py2-pip
# 更新 pip
RUN pip install --upgrade pip
# 安装应用需要的python依赖包
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt
# 复制应用运行需要用到的文件
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates/
# 容器需要暴露给外部的接口
EXPOSE 5000
# 运行应用
CMD ["python", "/usr/src/app/app.py"]
在项目根路径执行构建镜像命令:
docker build -t app:1.0 .
成功后,就可以使用生成的镜像运行应用了:
docker run -p 80:5000 app:1.0
当我们开始完整尝试用docker部署项目时,会遇到各种需要google的问题:
- 多个服务的容器之间是如何联系的?
Dockerfile
的volume
为什么无法实现run
命令-v
的效果?CMD
和ENTRYPOINT
有什么区别?- 构建镜像时,项目编译速度异常的慢怎么办?等等