1. 什么是docker
docker 是dotCloud 公司创始人Solomon Hykes 在法国期间发起的一个公司内部项目,基于dotCloud 公司多年云服务技术的一次革新。因为docker的火爆,该公司也决定改名为docker。
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
2. 为什么使用docker
2.1 docker
优势
-
更高效的利用系统资源
-
更快速的启动时间
-
一致的运行环境
-
持续交互和部署
-
更轻松的迁移
-
更轻松的维护和扩展
2.2 作用(对于第一点个人深有体会)
-
a. 简化服务器部署:
Docker
让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux
机器上,便可以实现虚拟化。Docker
改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker
中进行管理。方便快捷已经是Docker
的最大优势,过去需要用数天乃至数周的任务,在Docker
容器的处理下,只需要数秒就能完成。 -
b.节省开支:一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,
Docker
改变了高性能必然高价格的思维定势。Docker
与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
3. 对比传统虚拟机
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
4. 基本概念
4.1 镜像
docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变
docker 镜像采用分层存储的架构,镜像构建时,会一层层构建,前一层是后一层的基础,每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己的这一层。即便删除前一层的文件,也仅在当前层标记为该文件已删除。
4.2 容器
容器的实质是进程,容器进程运行属于自己的独立和命名空间。容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID空间。
镜像和容器的关系,就如面向对象程序设计中的类和实例一样。镜像是静态的定义,容器是镜像运行时的实体。
前面提过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,为容器运行读写而准备的容器存储层。
docker最佳实践要求,容器不应该向其存储层写入任何数据,容器存储层要保持无状态化。当所有的文件进行写入操作,都应该使用数据卷,或者绑定宿主目录;读写时跳过容器存储层,直接对宿主进行读写
4.3 仓库
docker仓库是一个集中存储、分发镜像的服务
注意私有仓库和公有仓库
5. docker的安装
docker 支持在主流的操作系统平台使用,包括Ubuntu、Centos7、windows等操作系统
注意事项:ubuntu 安装中要求ubuntu系统的内核版本必须于3.10
通过命令
uname -r
查看系统内核
ubuntu 在线安装
wget -qO- https://get.docker.com/ | sh
6. 镜像详解
6.1 获取镜像
docker pull
6.2 查看镜像
docker images
6.3 搜索镜像
docker search
6.4 删除镜像
docker rmi ID
其中,ID是镜像ID。注意,当镜像容器存在时,镜像默认是无法删除,可先查看存在的容器 docker ps -a
。在容器运行时,也可强制删除镜像docker rmi -f ID
,但不建议。
6.5 创建镜像
创建镜像方法有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。后续将用一个篇章专门记录
- 基于已有镜像容器创建
命令:
docker commit [options]
;参数说明:-a,作者信息
,-m,提交信息
,-p,提交时暂停容器运行
- 基于本地模板导入
关于本地导入模板使用较少,暂不都说明,推荐使用OenVZ 的模板创建
- 存出和载入镜像
存出镜像到本地文件:
docker save
载入镜像(将存入的本地文件导入到本地镜像):
docker load
- 上传镜像
除了上述将镜像保存到本地文件之外,还可使用命令将镜像上传到仓库。命令:
docker push
7. 容器详解
- 新建容器
命令:
docker create 容器
注意:新建容器处于停止状态。可以使用命令
docker start
进行启动
- 新建容器并启动
启动容器方式有两种,第一基于镜像新建容器并启动,第二将终止状态容器重新启动。
命令:
docker run
- 利用
docker run
新建容器并启动容器,docker在后台运行
- 检查本地是否存在指定的镜像,不存在就从共有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读可写
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个IP地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
- 进入容器
命令:
docker run -t -i 镜像 /bin/bash
命令:
docker exec -t -i 镜像 /bin/bash
两者的区别在于,前者直接拉去镜像,并运行容器,进入容器内;后者,主要是在运行容器的基础上进去
- 退出容器
用户可以通过按
Ctrl+d
或输入exit命令来退出容器。注意:在退出容器之后,容器将会自动关闭
在不终止容器的情况下退出容器
Ctrl+q
- 终止容器
命令:
docker stop
- 删除容器
命令:
docker rm
参数说明:
-f 强行终止并删除一个运行中的容器
-l 删除容器连接,但保留容器
-v 删除容器挂载的数据卷
- 导入导出容器
导入导出用的较少,将已有容器重新打包成镜像上传仓库
8. 仓库详情
- 使用registry 镜像创建私有仓库
通过官方提供的registry镜像来简单搭建一套本地私有仓库环境
eg:
sudo docker run -d -p 6666:6666
使用registry创建私有仓库,将自动下载并启动一个registry。也可同时创建数据卷将上传的镜像放到数据卷下
eg:
sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
;默认情况下,会将仓库创建在容器/tmp/registry 目录下,通过-v参数将镜像存放在本地的/opt/data/registry
-
云上的镜像参考(阿里云等)
-
仓库管理使用
查看镜像
docker images
上传镜像
docker push
9. 数据管理
在我们使用docker镜像创建多个容器,其中产生的重要数据需要备份,甚至多个容器之间进行数据共享,这必然涉及到容器数据管理操作的问题。容器中管理数据主要有两种方式:数据卷、数据卷容器
9.1 数据卷
数据卷是一个可供容器使用的特殊目录,其绕过文件系统,提供很多有用的特性:
-
数据卷可在容器之间共享和重用
-
对数据卷的修改会立马生效
-
对数据的更新,不会影响到镜像
-
卷会一直存在,直到没有容器使用
9.2 在容器中创建一个数据卷
- 在使用
docker run
命令运行容器,使用-V标记在容器中创建一个数据卷
eg:
sudo docker run -d -p --name web -v /webapp test/webapp python app.py
;使用test/webapp 镜像创建一个web容器。
- 挂载一个主机目录作为数据卷
使用-v标记也可以指定挂载一个本地的已有目录到容器中去作为数据卷
eg:
sudo docker run -d -p --name web -v /src/webapp:/opt/webapp test/webapp python app.py
;加载主机/src/webapp 目录到容器的/opt/webapp 目录。只要用户将一些程序及数据放到本地目录中,然后,在容器内就可以运行使用。
- 挂载一个本地主机文件作为数据卷
-v 标记可以从主机挂载单个文件到容器中作为数据卷
技巧:记录容器内输入过的历史命令
sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
- 数据卷容器
使用数据卷容器,使容器之间共享一些持续更新的数据
eg:
sudo docker run -it -v /dbdate --name dbdate ubuntu
。创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata。
- 在其它容器中使用–volumes-form来挂载dbdata容器中的数据卷
sudo docker run -it --volume-from dbdata --name db1 ubuntu
sudo docker run -it --volume-from dbdata --name db2 ubuntu
容器db1和db2都挂载同一个数据卷到相同的/dbdata目录
注意:倘若删除了挂载的容器,数据卷并不会消失,数据卷并不会自动删除
9.3 利用数据卷容器迁移数据
可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据迁移。
- 备份
sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
这个命令,首先利用
ubuntu
创建worker
容器,使用--volumes-from dbdat
参数来让woeker
容器挂载dbdata
容器的数据;使用-v$(pwd):/backup
参数来挂载本地的当前目录到worke
r容器的/backup
目录
- 恢复
创建新容器挂载到容器中,并做好备份。