初识docker

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参数来挂载本地的当前目录到worker容器的/backup目录

  • 恢复

创建新容器挂载到容器中,并做好备份。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值