Docker详解

        首先关于“虚拟化”的概念,相信虚拟机这个概念肯定很熟悉,在本机上安装一个如 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 or FORM :

     (2)维护者信息指令 MAINTAINER:MAINTAINER 是用于指定镜像创建者和联系方式,一般格式为 MAINTAINER

     (3)镜像操作指令 RUN 、EVN 、ADD 和 WORKDIR 等:COPY 是用于复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 ;WORKDIR 用于配合 RUN,CMD,

ENTRYPOINT 命令设置当前工作路径;RUN 用于容器内部执行命令,一般格式为 RUN ; EXPOSE 命令用来指定对外开放的端口。一般格式为 EXPOSE [...];

     (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 COPY . /app

        WORKDIR /app

       RUN pip install -r requirements.txt

       EXPOSE 5000ENTRYPOINT ["python"]CMD ["app.py"]

翻译一下:

从 Docker Hub 上 Pull 下 Python 2.7 的基础镜像;显示维护者的信息;Copy 当前目录到容器中的 /App 目录下 复制本地主机的 ( Dockerfile 所在目录的相对路径)到容器里 ;指定工作路

径为 /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 的信息,就表示构建成功。后续可以运行镜像。

你可能感兴趣的:(Docker详解)