从根本上说,一个容器不过是一个正在运行的进程,并对其应用了一些附加的封装功能,以使其与主机和其他容器隔离。 容器隔离的最重要方面之一是每个容器都与自己的专用文件系统进行交互。 该文件系统由Docker映像提供。 映像包括运行应用程序所需的一切-代码或二进制文件,运行时,依赖项以及所需的任何其他文件系统对象
容器在Linux上本地运行,并与其他容器共享主机的内核。 它运行在一个单独的进程,不占用任何其他进程的内存,从而使其轻巧。
相比之下,VM会产生大量开销,超出了应用程序逻辑所消耗的开销
看一下两者的架构对比图,docker运行在操作系统之上,依赖于宿主机的操作系统,而虚拟机内部则有自己的操作系统
安装docker 之后测试 docker run hello-world ,前提是保证docker已经运行
查看image - docker image ls 或docker images
查看所有容器 docker ps -all
安装好docker环境之后,就可以开发docker 应用了,一般分为三步
1 为容器创建一个镜像
2 组装容器及其依赖的架构成为一个完整的应用
3 测试,分享,部署你创建的容器化应用
1 创建一个docker镜像
# Use the official image as a parent image.
FROM node:current-slim
from结点代表 依赖的父镜像 的标签 node 冒号后是版本号
# Set the working directory.
WORKDIR /usr/src/app
workdir指定了之后所有动作从哪个路径执行,这个路径是镜像文件系统的路径,而不是你客户机的文件系统路径
# Copy the file from your host to your current location.
COPY package.json .
将文件package.json从客户机拷贝到你的镜像的文件系统工作路径(.),在这个例子中,就是镜像的 /usr/src/app/package.json 路径
# Run the command inside your image filesystem.
RUN npm install
在映像文件系统中运行命令npm install(将读取package.json以确定应用程序的依赖,然后安装它们)
# Inform Docker that the container is listening on the specified port at runtime.
EXPOSE 8080
EXPOSE 8080通知Docker该容器运行时监听8080端口
# Run the specified command within the container.
CMD [ "npm", "start" ]
cmd 指令用于描述如何在镜像上运行容器,在这个例子中,表示容器的启动需要 npm start的支持
# Copy the rest of your app's source code from your host to your image filesystem.
COPY . .
将应用的剩余源代码从客户机拷贝到镜像的文件系统
上面您看到的是组织一个简单的Dockerfile的好方法。 始终以FROM命令开头,然后按照步骤构建你自己的文件系统,可以包含任意的元数据规格说明(指cmd后面的内容)。 Dockerfile指令比上面看到的要多的多。 有关完整列表,请参阅Dockerfile参考。
2 制作docker镜像
git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app
docker build --tag bulletinboard:1.0 .
3 为镜像创建一个容器
docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0
--publish要求Docker将主机端口8000上传入的流量转发到容器的端口8080。容器具有自己的专用端口集,因此,如果要从网络访问某个端口,则必须以这种方式将流量转发到该端口。 否则,作为默认的安全状态,防火墙规则将阻止所有网络流量到达您的容器。
--detach要求Docker在后台运行此容器。
--name指定一个名称,您可以在后续命令中使用该名称来引用容器,在本例中为bb
4 删除容器
docker rm --force bb
--force选项可停止正在运行的容器,因此可以将其删除。 如果首先停止使用docker stop bb运行的容器,则无需使用--force即可将其删除。