docker是目前微服务和devops中流行的自动化部署技术,也是目前对开发和运维岗位新的要求。docker的概念相对比较新颖,抽象,本文以实例为引导,图文并茂,尽量以比较通俗的语言描述docker的概念及使用入门,以帮助初学者快速上手。限于篇幅,本教程分为上下两部分
docker基本概念:
docker是一种容器虚拟化技术。是一种实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,简化容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
Docker 和传统虚拟化方式的不同之处,传统方式则是在硬件层面实现虚拟化,虚拟机只是共享宿主机的硬件设备,操作系统是自己的。而docker等容器虚拟化技术是在操作系统层面上实现虚拟化,直接复用本地主机(宿主机)的操作系统
你可以把任何你想得到的程序放在Docker里。既可以把一个简单的Hello World应用放在Docker里,也可以把一个复杂的网站放在Docker里,不同应用之间相互隔离,有一套自己的运行环境,互不影响
传统的计算机虚拟化(硬件虚拟化)方式与docker虚拟化(操作系统虚拟化)方式的区别
Docker解决了什么问题
测试:“你这里有bug”
开发:“我本地运行没问题啊,是不是你测试环境的问题”
Docker解决了运行环境不一致所带来的问题。
“系统好卡,谁又写死循环了?”
Docker启动时候就已经限定好了最大能够使用的CPU、硬盘等资源,如果超过,只会自己挂掉,丝毫不影响其他的程序。(应用隔离)
“双11来了,这么多应用要启动!”
运维最怕的节日,需要在各台机器上部署各种各样的环境和服务,比如要装Java、Tomcat等等,还要调试。有了Docker后,这个过程就很轻松。(自动化部署)
沙箱的概念
Sandboxie(又叫沙箱、沙盘),是一个虚拟系统程序,允许你在沙盘环境中运行程序及周边环境,因此运行所产生的变化可以随后删除。它创造了一个独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。
Docker核心思想及组件
Docker里三大核心:镜像、容器、仓库。
为了方便大家理解,我们同java做个类比:
镜像(image)--集装箱--类比Java类(静态、编译时)
容器(container)--运行镜像的地方(镜像的一个实例)--类比Java类new出来的对象(动态、运行时)
仓库(repository)--超级码头(可以放各种各样的集装箱)(类似于maven仓库或者java本地library)
*一个镜像可以创建多个容器
使用Docker运行一个程序的过程就是:
1)去仓库(repository)把镜像(image)拉到(pull)本地
2)然后用一条命令把镜像运行(run)起来,变成容器(container)
3)使用容器。
下面再稍详细点解释三个组件:
Docker镜像
镜像本质上就是一系列文件,既包括应用程序的文件,也可以包括应用运行环境的文件。其利用了linux联合文件系统(
unionfs)分层构建镜像。最底层是操作系统的引导(boot),第二层是具体的Linux操作系统,上面是相关的软件。
Docker镜像把每一层加载完成之后,这些文件都会被看做是同一个目录,相当于是一个文件系统。Docker的这种文件系统就被称为镜像。
Docker容器
可以把容器想象成一个虚拟机。和虚拟机的区别是,容器里面的文件系统是一层一层的,并且最下面的N层都是只读的,只有最上面的一层是可写的。
Docker仓库
先把本地的镜像传到Docker仓库(push),再由目的地从Docker仓库把镜像拉过去(pull)。
仓库(repository)由Docker中央服务器提供:
hub.docker.com(国外,速度慢)
Docker常用组件及常用命令
学习方式:理解基本概念的基础上重点学习各种操作的命令
实验模拟环境:play with docker 一个docker的模拟沙箱实验环境,注册后登录,每次可用4小时,用完退出或超时后所做的操作自动清理,下次又重新开始。网速可能会比较慢
linux上的安装:用yum命令很快就可以装好,步骤请自己百度。注意centos6.x版本已不支持
中文参考手册:
中文命令手册:
1.docker images
查看当前本地镜像
可以指定镜像名
docker images 镜像名
2. docker pull 镜像名[:tag(标签名/版本名)]
从镜像仓库中拉取或者更新指定镜像。比如,拉取(下载)nginx镜像
查看仓库中某个镜像所有版本(以docker hub为例)
https://hub.docker.com/
3. docker run 镜像名(镜像id)
运行指定镜像的容器
默认是在前台运行,通常我们要加上-d参数,使其在后台运行,前台还可以做别的事
-d: 后台运行容器,并返回容器ID
-P (大写p): 随机端口映射,将容器内部端口随机映射到宿主机的端口
比如这里,后台运行之前拉取到本地的nginx镜像,可用docker ps命令查看启动的nginx容器
随机端口号不便于记忆和操作,通过我们可以通过-p参数为宿主机指定一个外部端口号,映射到容器内部某个端口号上,之后就可以在宿主机上使用映射出的端口号访问容器的指定端口,仿佛就在宿主机上运行应用一般。
-p(小写p):指定端口映射,格式为:主机(宿主)端口:容器端口
在宿主机浏览器中输入localhost:宿主机映射的端口号,可以访问nginx容器的80端口,也就是nginx首页。
如果是play with docker这种实验环境,就在实验环境中点击相应链接 4. docker ps
刚才docker run以后,我们已经用过docker ps命令。不加参数时,默认只
查看正在运行的容器
-a 参数:查看所有容器
5. docker exec 容器 命令
在运行的容器中执行命令,相当于从宿主机进入容器内部。
常用参数:
- -d :分离模式: 在后台运行
- -i :展示容器输入信息STDIN
- -t :交互模式,分配一个伪终端。让你在宿主机操作容器内部,仿佛应用部署在宿主机上
通常用的是后面两个参数
此例中修改容器中nginx首页内容,刷新页面即可看到修改
6.docker commit 容器名 镜像名[:tag]
将一个容器提交为新的镜像,即从容器创建一个新的镜像(通常会对该容器做一些修改),常用参数:
-a :提交的镜像作者
-c :使用Dockerfile指令来创建镜像
-m :提交时的说明文字
-p :在commit时,将容器暂停
docker run 运行自己的镜像,注意带上版本号(tag)
play-with-docker中查看自己容器提交的镜像启动的新容器以上是教程的上半部分,涉及了docker的概念,仓库/镜像/容器的一些常用操作,主要以nginx应用来演示。既可以在真实docker环境中使用,也可以先用play with docker模拟环境做实验。下半部分将会介绍dockerfile文件,如何导入导出镜像,镜像与容器的删除等内容。