本页所涉及到的内容部分来自《循序渐进学Docker》, 也会加入笔者自己的一些见解。
一、Docker简要概括
1.1 认识Docker
ps:
1.整个docker生态圈类似于Android,有自己的官方镜像库,用户也可以上传自己的image到官方的镜像库。
2.docker有类似于github的的版本控制功能,运行环境可以在多个版本中快速切换,自由选择使用版本提供对外服务。
summary:
Docker 用来管理软件部署的应用,Docker 把应用打包成一个image,image带有版本控制的功能,应用的每次修改就对应这镜像的一个版本,制作好的镜像可以发布到镜像仓库,分享给别人;也可以直接从镜像仓库下载别人制作好的应用,直接运行。
1.2 Docker 的结构和特性
1.2.1 Docker的组成划分
- 组成
-
从软件的视角来看:Docker是使用Golang写的开源程序,采用C/S架构,包含了Docker Server和Docker Client。
-
从生态的视角来看:其有Docker仓库和Doker自身的应用程序组成。关系类似于Appstore和iOS操作系统
-
Docker 仓库: https://hub.docker.com/
-
Docker 自身的应用程序指的就是我们安装在linux操作系统上的单机版的程序。
- Docker 的C/S架构解释:
- Docker Daemon作为Server端,在宿主机上以后台守护进程的形式运行。Docker Client使用比较灵活,在本机上以bin命令的形式发送指令,也可以在远端通过api发送指令。Docker 的Server端接受指令并把指令分解为一系列的任务去执行。
- 工作流程
1.2.2 Docker的存在形式
在Docker的官方仓库中,每个软件都有自己要依赖的操作系统,内核,三方库等。为了统一这些软件的安装部署,不至于使得用户每下载一个包就要下载其他所有的依赖,Docker引入了 分层 的概念。比一个应用拆分成多层,比如操作系统是第一层, 依赖的库和三方软件是第二层,应用的软件包和配置为第三层,如果两个软件有相同的底层,那么就可以实现共享这些层。
这又带来一个问题,如果应用A的配置文件修改了,那就会导致应用B的配置也被修改,为了解决这个问题,Docker规定了层次是有优先级的。就类似Python中的继承机制,实现上层覆盖下层。这也是Docker的写时 拷贝策略 。
在Docker的官方仓库中,只需要它有完整的文件系统和程序包,下载到宿主机上提供对外的服务时,可能会修改文件,这是产生一个空白层进行写时拷贝。Docker把这两种装态做了区分,分别叫做镜像和容器。
在仓库中的应用都是以镜像的形式存在的。把镜像从Docker仓库中下拉到本机,在一个容器类的虚拟机中以这个镜像为模板启动应用,这个虚拟机就叫容器。
tips: 镜像和容器是Docker中最核心的两个概念
1.2.3 Docker版本控制
上面有提到Docker是使用分层的策略,而版本控制也是基于分层的策略实现的。每次镜像的更新,都会新增一层,所以可以实现类似于git一样的机制。
二、docker 运行服务
2.1 docker 启动命令
启动命令如下:
- 构建镜像
docker built -d "镜像名" .
- 生成并运行容器 8000 是index.py中暴露的端口, 如果使用gunicorn启动需要映射gunicorn配置的端口
docker run -d -p 4000:8000 "镜像名"
2.2 Dockerfile 文件
Dockerfile 是用来构建images的文件
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
# Use an official Python runtime as a parent image
FROM python:3.7
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 8000
# Define environment variable
ENV NAME World
# Run app.py when the container launches
#CMD ["python", "index.py"]
CMD ["gunicorn", "-c", "gunicorn_conf.py", "index:app"]
未完待续…