首先关于“虚拟化”的概念,相信虚拟机这个概念肯定很熟悉,在本机上安装一个如 VMware , VisualBox 之类软件可以运行一个其他的操作系统。其次,区分虚拟机和容器两个概念,每台虚拟机都
需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用,而容器技术是和宿主机共享硬件资源及操作系统,可以实现资源的动态分配,容器在宿主机操作系统中,在用户分离空间
以分离的进程运行。容器是相比虚拟机更加轻量级的虚拟机技术。
Docker 属于 Linux 容器的一种封装,基于go语言开发并遵循了apache2.0协议开源,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管
理、复制、分享、修改,就像管理普通的代码一样。相比于传统的虚拟化技术有如下优势:启动速度是秒级别的、占用内存更小、高可用和高恢复性、集群快速分发和部署,非常方便、
Docker有三个基本概念:Image(镜像)、Container(容器)、Repository(仓库)。Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含
了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像(Image)就是一堆只读层(read-only layer)的统一视
角。Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方,实际上,容器 = 镜像 + 读写层。Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,很
容易的在当前宿主上运行,但是, 如果需要在其他服务器上使用这个镜像就需要一个集中的存储、分发镜像的服务,Docker Registry(仓库注册服务器)就是这样的服务。Docker 仓库的概念跟 GitHub
的代码仓库 类似。一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。
Docker的架构基于C/S结构,即客户端/服务器体系结构,Docker客户端与Docker服务端交互,发送请求,Docker服务端负责构建、运行和分发Docker镜像。Docker 客户端和服务端可以运行在一
台机器上。
Docker 的核心组件包括:Docker Client、Docker Daemon、Docker Image、Docker Registry、Docker Container,后面三个上面已经说明,不多加赘述:
Docker client 是Docker提供命令行界面工具,提供用户和Docker交互的平台,客户端可以构建、运行和停止应用容器,还可以远程和服务端交互;
Docker Daemon 是服务器组件,以 Linux 后台服务方式运行,是 Docker 最核心的后台进程,也称为守护进程,负责响应来自Docker client的请求,将请求翻译成系统调用完成容器管理操作。
Docker的常用命令如下:
(1)docker pull image_name //拉取Docker镜像
(2)docker images //查询主机的Docker镜像
(3)docker ps -a //查询主机当前运行镜像
(4)docker start container_name/container_id //启动镜像
(5)docker restart container_name/container_id //重启镜像
(6)docker stop container_name/container_id //停止镜像
(7) docker attach container_name/container_id //进入镜像
(8) docker run -t -i container_name/container_id /bin/bash //调用bash命令运行镜像
(9) docker rm container_name/container_id //删除镜像
(10)docker load -i 镜像路径 //加载容器镜像
(11)docker commit -m “描述” 镜像ID 镜像名称:标签 //保存镜像
(12)docker cp 文件路径 镜像ID:路径 //拷贝文件到镜像中 也可以拷贝镜像文件到外部,交换路径对象
(13)docker save -o XXX.tar 镜像名称:标签
关于DockerFile:
Dockerfile 是自动构建 Docker 镜像的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 中的命令非常类似于 Linux 下的 Shell 命令。
Dockerfile 分为四个部分:
(1)基础镜像(父镜像)信息指令 FROM: FROM 是用于指定基础的 images ,一般格式为 FROM
(2)维护者信息指令 MAINTAINER:MAINTAINER 是用于指定镜像创建者和联系方式,一般格式为 MAINTAINER
(3)镜像操作指令 RUN 、EVN 、ADD 和 WORKDIR 等:COPY 是用于复制本地主机的
ENTRYPOINT 命令设置当前工作路径;RUN 用于容器内部执行命令,一般格式为 RUN
(4)容器启动指令 CMD 、ENTRYPOINT 和 USER 等:ENTRYPOINT 可以让你的容器表现得像一个可执行程序一样。一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生
效。ENTRYPOINT 命令也有两种格式:
ENTRYPOINT ["executable", "param1", "param2"] :推荐使用的 Exec 形式。
ENTRYPOINT command param1 param2 :Shell 形式。
CMD 命令用于启动容器时默认执行的命令,CMD 命令可以包含可执行文件,也可以不包含可执行文件。不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个,然后 CMD 命令的参数就
会作为 ENTRYPOINT 的参数。CMD 命令有三种格式:
CMD ["executable","param1","param2"]:推荐使用的 exec 形式。
CMD ["param1","param2"]:无可执行程序形式。
CMD command param1 param2:Shell 形式。
如下所示的例子:
FROM python:2.7MAINTAINER Angel_Kitty
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000ENTRYPOINT ["python"]CMD ["app.py"]
翻译一下:
从 Docker Hub 上 Pull 下 Python 2.7 的基础镜像;显示维护者的信息;Copy 当前目录到容器中的 /App 目录下 复制本地主机的
径为 /App;安装依赖包;暴露 5000 端口;启动 App。
构建 Dockerfile:比如输入如下命令新建Dockerfile:
mkdir static_web
cd static_web
touch Dockerfile
然后编辑内容保存,如下所示:
FROM nginx
MAINTAINER Angel_Kitty
RUN echo \\'
Hello, Docker!
\\' > /usr/share/nginx/html/index.html在 Dockerfile 文件所在目录执行:docker build -t angelkitty/nginx_web:v1 . 启动: -t 是为新镜像设置仓库和名称,angelkitty 为仓库名,nginx_web 为镜像名,:v1 为标签(不添加为默认 latest )
构建完成之后,使用 Docker Images 命令查看所有镜像,如果存在 REPOSITORY 为 Nginx 和 TAG 是 v1 的信息,就表示构建成功。后续可以运行镜像。