Docker 那些事
Docer 简介
Docker是基于Go语言实现的开源容器项目。它诞生于2013年年初,最初发起者是dotCloud公司。Docker自开源后受到业界广泛的关注和参与,目前已有80多个相关开源组件项目(包括Containerd、Moby、Swarm等),逐渐形成了围绕Docker容器的完整的生态体系。
Docker的构想是要实现“Build, Ship and Run Any App, Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。
Docker 解决的问题
由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环境配置操作。
Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用程序部署在其它机器上。
Docker在开发和运维中的优势
- 更快速的交付和部署
- 更高效的资源利用
- 更轻松的迁移和扩展
- 更简单的更新管理
Docker与虚拟机比较
Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多;
Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器(在IBM服务器上已经实现了同时运行10K量级的容器实例);
Docker通过类似Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新;
Docker通过Dockerfile支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程。
镜像与容器
镜像是一种静态的结构,可以看成面向对象里面的类,而容器是镜像的一个实例。
镜像包含着容器运行时所需要的代码以及其它组件,它是一种分层结构,每一层都是只读的(read-only layers)。构建镜像时,会一层一层构建,前一层是后一层的基础。镜像的这种分层存储结构很适合镜像的复用以及定制。
构建容器时,通过在镜像的基础上添加一个可写层(writable layer),用来保存着容器运行过程中的修改。
Docker导入和导出容器
导出容器
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用docker [container] export命令,该命令格式为:
# docker [container] export [-o|--output[=""]] CONTAINER
其中,可以通过-o选项来指定导出的tar文件名,也可以直接通过重定向来实现。
# docker export -o 导出包名字.tar 导出的镜像名字
# docker export 导出的镜像名字 > 导出包名字.tar
导入容器
既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker [container] import命令来导入一个容器快照到本地镜像库。这两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
数据卷数据卷(Data Volumes)
数据卷(Data Volumes)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。数据卷可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便;
- 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
- 对数据卷的更新不会影响镜像,解耦开应用和数据;
- 卷会一直存在,直到没有容器使用,可以安全地卸载它。
TIPS
容器有自己的内部网络和IP地址,使用docker [container] inspect +容器ID可以获取容器的具体信息。
容器的名称是唯一的。如果已经命名了一个叫web的容器,当你要再次使用web这个名称的时候,需要先用docker rm命令删除之前创建的同名容器。
- 对于Windows系统,Shell路径中使用了“\”作为分隔符,建议在Dockerfile开头添加# escape=’来指定转义符。
Dockerfile指令与说明
Docker容器三剑客
Machine
Machine项目是Docker官方的开源项目,负责实现对Docker运行环境进行安装和管理,特别在管理多个Docker环境时,使用Machine要比手动管理高效得多。
Machine的定位是“在本地或者云环境中创建Docker主机”。其代码在https://github.com/docker/machine上开源,遵循Apache-2.0许可,目前最新版本为0.13.0。Machine项目主要由Go语言编写,用户可以在本地任意指定由Machine管理的Docker主机,并对其进行操作。其基本功能包括:❑ 在指定节点或平台上安装Docker引擎,配置其为可使用的Docker环境;❑ 集中管理(包括启动、查看等)所安装的Docker环境。
Compose
编排(Orchestration)功能,是复杂系统是否具有灵活可操作性的关键。特别在Docker应用场景中,编排意味着用户可以灵活地对各种容器资源实现定义和管理。
Compose作为Docker官方编排工具,其重要性不言而喻,它可以让用户通过编写一个简单的模板文件,快速地创建和管理基于Docker容器的应用集群。
Swarm
Docker Swarm是Docker公司推出的官方容器集群平台,基于Go语言实现,代码开源在。 目前,包括Rackspace等平台都采用了Swarm,用户也很容易在AWS等公有云平台使用Swarm。
Docker命令
构建Docker镜像应该遵循哪些原则
整体原则上,尽量保持镜像功能的明确和内容的精简,避免添加额外文件和操作步骤,要点包括:
- 尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择debian:wheezy或debian:jessie镜像,仅有不足百兆大小;
- 清理编译生成文件、安装包的缓存等临时文件;
- 安装各个软件时候要指定准确的版本号,并避免引入不需要的依赖;
- 从安全角度考虑,应用要尽量使用系统的库和依赖;
- 如果安装应用时候需要配置一些特殊的环境变量,在安装后要还原不需要保持的变量值;
- 使用Dockerfile创建镜像时候要添加.dockerignore文件或使用干净的工作目录;
- 区分编译环境容器和运行时环境容器,使用多阶段镜像创建。
官方网站Docker
- 官方主页:https://www.docker.comDocker
- 官方博客:https://blog.docker.com/Docker
- 官方文档:https://docs.docker.com/Docker
- Hub:https://hub.docker.com
- Docker公司的开源代码仓库:https://github.com/docker
- Docker的开源项目Moby仓库:https://github.com/moby/moby
- Docker发布版本历史:https://docs.docker.com/release-notes/
- Docker常见问题:https://docs.docker.com/engine/faq/
- Docker SDK和API:https://docs.docker.com/develop/sdk/
- 开发容器组织OCI:https://www.opencontainers.org/
实践参考
- Dockerfile参考:https://docs.docker.com/engine/reference/builder/Dockerfile
- 最佳实践:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
标签: docker
热门日志
分类
- Django(4)
- ssdb(1)
- Mac(7)
- C(1)
- memcache(1)
- Python(32)
- Vim(8)
- sed(2)
- ansible(3)
- awk(4)
- shell(3)
- about(1)
- git(9)
- bat(4)
- svn(0)
- docker(1)
- Tornado(1)
- go(2)
- 架构(18)
- Vue(1)
- game(2)
- Html(6)
- Java(8)
- Mysql(37)
- Ajax(2)
- Jsp(1)
- Struts(8)
- Linux(73)
- JavaScript(39)
- Staruml(0)
- Mouth(1)
- Php(102)
- Windows(8)
- Message(48)
- Lua(10)
- Compute(1)
- Redis(7)
- Nginx(12)
- Jquery(1)
- Apache(1)
- cocos2d-x(8)
最新日志
- DHCP(Dynamic Host Configuration Protocol) 动态主机配置协议
- 从技术专家到战略领袖:成就技术总监的路径与思维
- python 如何读取超大的文件
- python requests 模块
- 如何给自己充电?
- 告别2024,迎接2025:深耕梦想,向前而行
- linux 的 dns 缓存,NSCD 服务
- The following untracked working tree files would be overwritten by checkout
- insecure connection not allowed,产生原因及如何解决
- 逆境乐观,顺境警醒:生活的智慧与力量