Docker 火了很长一段时间了,前段时间简单的学习和试玩了一下子,发现他对测试很有价值,觉得有必要再次深入研究。
这里标记一些较好的学习网址,用作参考:
InfoQ 上面有系列的文章:
深入浅出Docker 在InfoQ 上的内容: http://www.infoq.com/cn/dockerdeep/
深入浅出Docker(一):Docker 核心技术预览:http://www.infoq.com/cn/dockerdeep/
深入浅出Docker(二):Docker 命令行探秘:
http://www.infoq.com/cn/articles/docker-command-line-quest
深入浅出Docker(三):Docker 开源之路:
http://www.infoq.com/cn/articles/docker-open-source-road
深入浅出Docker(四):Docker 的集成测试部署之道:
http://www.infoq.com/cn/articles/docker-integrated-test-and-deployment
深入浅出Docker(五):基于Fig 搭建开发环境:
http://www.infoq.com/cn/articles/docker-build-development-environment-based-on-fig
深入浅出Docker(六):像谷歌一样部署你的应用:
http://www.infoq.com/cn/articles/deploy-your-application-like-google
Docker 源码分析(一):Docker 架构:
http://www.infoq.com/cn/articles/docker-source-code-analysis-part1
Docker 源码分析(二):Docker Client 创建与命令执行:
http://www.infoq.com/cn/articles/docker-source-code-analysis-part2
Docker 源码分析(四):Docker Daemon 之NewDaemon 实现:
http://www.infoq.com/cn/articles/docker-source-code-analysis-part4
Docker 源码分析(五):Docker Server 的创建:
http://www.infoq.com/cn/articles/docker-source-code-analysis-part5
Docker 源码分析(六):Docker Daemon 网络:
http://www.infoq.com/cn/articles/docker-source-code-analysis-part6
解读2014 之Docker 篇:才气、勇气、运气:http://www.infoq.com/cn/articles/2014-review-docker
-----------------------------------------------------------------------------------------------------------------
简单来看,什么是Docker?
Docker 的英文本意是码头工人,也就是搬运工,这种搬运工搬运的是集装箱(Container),集装箱里面装的可不是商品货物,而是任意类型的App,Docker 把App(叫Payload)装在Container 内,通过Linux Container 技术的包装将App 变成一种标准化的、可移植的、自管理的组件,这种组件可以在你的笔记本上开发、调试、运行,最终非常方便和一致地运行在生产环境下的各种云机房和服务器上。
Docker 的核心底层技术是LXC(Linux Container),Docker 在其上面加了薄薄的一层,添加了许多有用的功能。
Docker 提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个
Container;而LXC 本身可能因为不同机器的不同配置而无法方便地移植运行;
Docker 以App 为中心,为应用的部署做了很多优化,而LXC 的帮助脚本主要是聚焦于如何机器启动地更快和耗更少的内存;
Docker 为App 提供了一种自动化构建机制(Dockerfile),包括打包,基础设施依赖管理和安装等等;
Docker 提供了一种类似git 的Container 版本化的机制,允许你对你创建过的容器进行版本管理,依靠这种机制,你还可以下载别人创建的Container,甚至像git 那样进行合并;
Docker Container 是可重用的,依赖于版本化机制,你很容易重用别人的Containe(r 叫Image),作为基础版本进行扩展;
Docker Container 是可共享的,有点类似github 一样,Docker 有自己的INDEX,你可以创建自己的Docker 用户并上传和下载Docker Image;
Docker 提供了很多的工具链,形成了一个生态系统;这些工具的目标是自动化、个性化和集成化,包括对PAAS 平台的支持等;
Docker 有什么用呢?
从运维的角度来说,你的应用程序一般都需要特定版本的操作系统、应用服务器、JDK 、数据库服务器,还可能需要调整配置文件和其他一些依赖关系。应用程序可能需要绑定到指定的端口和一定量的内存。这些运行应用程序所需要的组件和配置就是所说的应用程序操作系统。你当然可以写一个包含下载和安装这些组件的安装脚本。Docker 简化了这个流程,通过创建一个包含应用程序和基础设施的镜像(image),当作一个组件进行管理。这些镜像可以创建Docker 容器(container),容器运行在Docker 提供的容器虚拟化平台上。
Docker 的构成
Docker 有两个主要组件:
Docker:开源的容器虚拟化平台
Docker Hub:共享和管理Docker 镜像的Saas 平台
Docker 采用Linux 容器来提供隔离、沙箱、复制、资源限制、快照和其他的一些优势。镜像是Docker 的“构建组件”,也是应用操作系统的只读模版。容器是从镜像创建出来的运行状态,是Docker 的“运行组件”。容器是可以运行、启动、停止、移动和删除的。镜像保存的仓库是Docker 的“分发组件”。
Docker 的镜像与容器
Docker 按启动顺序包含两个组件:
服务端:运行在宿主机上,负责构建、运行和分发Docker 容器等重要工作
客户端:Docker 二进制程序,接收用户的命令和服务程序进行通信
客户端可以和服务端运行在一台主机上,也可以在不同的主机上。服务端需要用pull 命令从仓库中拉一个镜像下来。服务端可以从Docker Hub 或者其他配置的仓库中下载镜像。服务端主机可以从仓库中下载和安装多个镜像。然后客户端就可以用run 命令来启动容器。
客户端与服务端通过socket 或者REST API 进行通信。
Docker 的安装
在CentOS 中安装Docker:
sudo yum -y install docker-io #安装docker
sudo service docker start #启动docker 服务
sudo chkconfig docker on #如果需要docker 服务为自启动
在Ubuntu/Debian 中安装Docker:
sudo apt-get udpate
sudo apt-get install docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io #命令自动补全其它操作系统的安装可以查看官方文档。
Docker 的运行与退出
在了解了Image 和Container 的概念后,我们可以开始下载一个Image,Docker 的好处就是提供了一个类似github 的Image 仓库管理,你可以非常方便pull 别人的Image 下来运行,例如,我们可以下载一个CentOS Image:
sudo docker pull centos:centos6
这里centos6 是一个tag,类似于Git 的tag,能过它来确定下载的CentOS 的版本。下载完成后,执行docker images 命令来列出你已经下载的images。下载之后,我们通过命令行来运行一个容器,命令很简单,例如我们想执行一个shell 终端:
sudo docker run -i -t centos:centos6 /bin/bash
默认情况下,docker 容器是不提供交互shell 的,也不提供标准输入。可以指定-i 选项来提供交互,提供-t 选项来分配一个伪终端。
在Shell 中你可以做你想做的任意操作,安装软件,编写程序,运行命令等。当你操作后想将结果保存,这时可以用docker commit 命令将Container 提交成Image。哦,假如你这里还处在交互shell 中,记得先使用Ctrl+d 或者exit 命令退出。
sudo docker ps -a
首先执行ps 命令查看容器ID
然后使用commit 命令将容器进行保存
sudo docker commit 851d custom/centos-aliyun
容器提交后,执行sudo docker images 就能看到刚才提交的容器。
docker 端口映射
经常要在Docker 中开启某些网络服务,需要将docker 虚拟机的网络端口与宿主机端口连接起来。比如将docker 中的8080 端口映射到宿主机的80 端口上:
sudo docker run -p 80:8080 custom/tomcat
宿主机硬盘挂载
这也是常用功能之一,尤其是服务需要记录日志、保存文件等时候。
sudo docker run -i -t -v /host/dir:/container/path ubuntu /bin/bash
以上是把宿主机器的/host/dir 挂载到/container/path 路径上。
容器间共享存储
主要借助于-volumes-from 参数实现
COUCH1=$(sudo docker run -d -v /var/lib/couchdb
shykes/couchdb:2013-05-03)COUCH2=$(sudo docker run -d -volumes-from $COUCH1
shykes/couchdb:2013-05-03)
这个特性,让人有许多想像空间,比如,一个容器实例用于Web 存储,另外两个实例用于Web 请求,实现读写分离。
镜像的导入/导出
方法1: 使用save/load 命令来实现镜像的导入导出
镜像导入功能使用load 命令解压导入即可
领取专属 10元无门槛券
私享最新 技术干货