Linux容器的核心实现原理:
Linux Namespace隔离,Linux Cgroup是的限制,rootfs文件系统
实际上Docker on Mac 以及Windows Docker (Hyper - V 实现), 是基于虚拟化技术实现的, 与Linux容器完全不同
Docker 提供Dockerfile文件来制作容器镜像:
# 使用官方提供的 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"]
Dockerfile的设计思想,是使用一些标准的原语,描述我们所构建的Docker镜像。并且这些原语,都是按顺序处理的。
Docker会为你提供一个隐含的ENTRYPOINT,默认地址为: /bin/sh -c
这里简称Docker容器的启动进程为ENTRYPOINT,
Dockerfile的每个原语执行后,都会生成一个对应的镜像层。
$ docker run -p 4000:80 helloworld
//如果没有在Dockerfile里面指定CMD,我们还有把进程的启动命令加在后面
$ docker run -p 4000:80 helloworld python app.py
这里我们把容器内80端口映射在宿主机的4000端口.
从宿主机的命令行窗口
//可以使用 docker exec 命令进入到了容器, 4ddf4638572d 为containerID
docker exec -it 4ddf4638572d /bin/sh
Linux Namespace创建的隔离空间虽然看不见摸不着,但一个进程的Namespace信息在宿主机上是确实存在的,
可以通过宿主机的proc文件下的PID号,来查看该进程下的所有Namespace对应的文件。
从而,一个进程,可以通过加入到某个进程已有的Namespace当中,从而达到进入这个进程所在容器的目的,这就是
docker exec的实现原理。
Docker Volume机制
允许你将宿主机上指定的目录或者文件,挂载到容器里面进行读取和修改操作。
网友评论