docker简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
docker的应用场景
1、Web 应用的自动化打包和发布。
2、自动化测试和持续集成、发布。
3、在服务型环境中部署和调整数据库或其他的后台应用。
4、从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
docker 的优点
1、简化程序: Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。
2、避免选择恐惧症: 如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
3、节省开支: 一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
docker 架构
1、Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
2、Docker 容器通过 Docker 镜像来创建。
3、容器与镜像的关系类似于面向对象编程中的对象与类。
| Docker | 面向对象 |
| 容器 | 对象 |
| 镜像 | 类 |
| Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板。 |
| Docker 容器(Container) | 容器是独立运行的一个或一组应用。 |
| Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 |
| Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
| Docker 仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 |
| Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
Docker中基本概念
1、镜像(Image)
镜像,从认识上简单的来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
2、容器(Container)
容器,从认识上来说,就是类创建的实例,就是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
3、仓库(Repository)
仓库,从认识上来说,就好像软件包上传下载站,有各种软件的不同版本被上传供用户下载。镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
4、Docker版本
Docker 划分为CE 和EE。CE 即社区版(免费,支持周期三个月),EE 即企业版,强调安全,付费使用。Docker在1.13 版本之后,从2017年的3月1日开始,版本命名规则变为如下:
项目 说明 版本格式 YY.MM Stable版本 每个季度发行 Edge版本 每个月发型 Docker CE 每月发布一个Edge 版本(17.03, 17.04, 17.05…),每三个月发布一个Stable 版本(17.03, 17.06, 17.09…),Docker EE 和Stable 版本号保持一致,但每个版本提供一年维护。
5、分层存储
因为镜像包含操作系统完整的root 文件系统,其体积往往是庞大的,因此在Docker设计时,就充分利用Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
Windows下 Docker 的安装,可以参考菜鸟教程:www.runoob.com/docker/wind…
注意: Docker可以支持在mac、windows、linux上安装。但是在windows系统中Docker目前仅有win10专业版和企业版的安装包,win7/win8/win10家庭版需要通过docker toolbox来安装。
Boot2Docker是一个专为Docker而设计的轻量级Linux发行包,解决Win或者OS X用户不能安装Docker的问题。Boot2Docker完全运行于内存中,24M大小,启动仅5-6秒。Boot2Docker需要运行在 VirtualBox中的,所以一般是Docker镜像的方式存在 。
如果遇到了“Looks like something went wrong in step ´Looking for vboxmanage.exe´… Press any key to continue… ” ,可以参考一下:www.cnblogs.com/yqpy/p/9529…
还有一点就是docker启动之后会给我们的虚拟机自动分配一个ip,可以在启动窗口看到
有时间可以好好看一看菜鸟教程里关于Docker 的介绍,个人感觉很有用,如何使用,和一些命令的介绍
详细的就不记录了,这里自己记录一下可能经常用到的命令,命令的具体参数可以到菜鸟教程上看看
1、docker run :创建一个新的容器并运行一个命令
2、docker start :启动一个或多个已经被停止的容器
3、docker stop :停止一个运行中的容器
4、docker restart :重启容器
5、docker rm :删除一个或多少容器
6、docker create :创建一个新的容器但不启动它
7、docker exec :在运行的容器中执行命令
8、docker ps : 列出容器
9、docker commit :从容器创建一个新的镜像。
10、docker pull : 从镜像仓库中拉取或者更新指定镜像
11、docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
12、docker search : 从Docker Hub查找镜像
13、docker images : 列出本地镜像。
14、docker images : 列出本地镜像。
15、docker info : 显示 Docker 系统信息,包括镜像和容器数。
16、docker version :显示 Docker 版本信息。
创建镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1.从已经创建的容器中更新镜像,并且提交这个镜像
2.使用 Dockerfile 指令来创建一个新的镜像
Dockfile语法:
1、基本说明
2、Dockfile语法
2.1、FROM
说明:第一个指令必须是FROM了,其指定一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,没有指定镜像的标签会使用默认的latest标签,可以出现多次,如果需要在一个Dockerfile中构建多个镜像。
2.2、 MAINTAINER
说明:描述镜像的创建者,名称和邮箱
2.3、 MAINTAINER
说明:RUN命令是一个常用的命令,执行完成之后会成为一个新的镜像,这里也是指镜像的分层构建。一句RUN就是一层,也相当于一个版本。这就是之前说的缓存的原理。我们知道docker是镜像层是只读的,所以你如果第一句安装了软件,用完在后面一句删除是不可能的。所以这种情况要在一句RUN命令中完成,可以通过&符号连接多个RUN语句。RUN后面的必须是双引号不能是单引号(没引号貌似也不要紧),command是不会调用shell的,所以也不会继承相应变量,要查看输入RUN "sh" "-c" "echo" "HOME"。
2.4、 CMD
用法:CMD command param1 param2
说明:CMD在Dockerfile中只能出现一次,有多个,只有最后一个会有效。其作用是在启动容器的时候提供一个默认的命令项。如果用户执行docker run的时候提供了命令项,就会覆盖掉这个命令。没提供就会使用构建时的命令。
2.5、 EXPOSE
说明:告诉Docker服务器容器对外映射的容器端口号,在docker run -p的时候生效。
2.6、 EVN
EVN =允许一次设置多个
说明:设置容器的环境变量,可以让其后面的RUN命令使用,容器运行的时候这个变量也会保留。
2.7、 ADD
说明:复制本机文件或目录或远程文件,添加到指定的容器目录,支持GO的正则模糊匹配。路径是绝对路径,不存在会自动创建。如果源是一个目录,只会复制目录下的内容,目录本身不会复制。ADD命令会将复制的压缩文件夹自动解压,这也是与COPY命令最大的不同。
2.8、 COPY
说明:COPY除了不能自动解压,也不能复制网络文件。其它功能和ADD相同。
2.9、 ENTRYPOINT
说明:这个命令和CMD命令一样,唯一的区别是不能被docker run命令的执行命令覆盖,如果要覆盖需要带上选项--entrypoint,如果有多个选项,只有最后一个会生效。
2.10、 VOLUME
说明:在主机上创建一个挂载,挂载到容器的指定路径。docker run -v命令也能完成这个操作,而且更强大。这个命令不能指定主机的需要挂载到容器的文件夹路径。但docker run -v可以,而且其还可以挂载数据容器。
2.11、 USER
用法:USER daemon
说明:指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定的用户运行命令。
2.12、 WORKDIR
用法:WORKDIR path
说明:为RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。如:WORKDIR /home WORKDIR test 。最终的路径就是/home/test。path路径也可以是环境变量,比如有环境变量HOME=/home,WORKDIR $HOME/test也就是/home/test。
2.13、 ONBUILD
说明:配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。意思就是,这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令。
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
现在我们就构建一个自己项目的镜像。
1、准备部署的springboot的jar包
2、编写Dockerfile文件
#java:8 是使用jdk版本
FROM java:8
#指定了临时文件目录为/tmp。
VOLUME /tmp
#添加jar到容器并重命名
ADD demo-0.0.1-SNAPSHOT.jar /app.jar
#执行jar文件
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
3、使用 docker build 命令生成镜像,注意最后的是一个空格加上一个点
docker build -t springboot1 .
这个时候查看一下本地的镜像仓库,可以看到我们刚刚构建的镜像
4、运行Docker 容器
docker run -d -p 8080:80 springboot1
-d : 后台运行
-p : 8080是指在doucker暴露在外部的端口,80是指docker里面的项目的端口
可以看到容器已经在后台运行
5、项目访问
到这里项目就部署完成了,在浏览器使用:服务器ip(注意是docker 虚拟机的ip,上面提到过):8080 就能访问docker容器内部署的springboot项目了。