Docker简易教程

 

 

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。 
 

 

11.png

 

 

Docker引擎

docker引擎是一个c/s结构的应用 
 

 

22.png

 

 

  • Server是一个常驻进程
  • REST API 实现了client和server间的交互协议
  • CLI 实现容器和镜像的管理,为用户提供统一的操作界面

CS框架。Docker后台进程负责创建、运行和发布Docker容器。Docker客户端和后台进程即可运行在同一个机器上, 也可以运行在不同的机器上。Docker客户端通过Sockets或API与后台进程通讯。

功能特征 
隔离环境(系统,网络,文件系统)与应用。 
解决依赖于版本问题。 
易于分发,开箱即用。 
节点与容器快速扩容。 
镜像制作简单便捷,管理方便。

应用场景 
WEB应用的自动化打包和发布 
自动化测试和持续集成发布 
应用服务:Mysql Redis等通过Docker实现快速部署 
K8S私有云

Docker与KVM对比

KVM虚拟化结构 
 

 

33.png

 

 

 


Docker虚拟化结构 
 

 

44.png

 


作为一种虚拟化方式,Docker对比传统虚拟化方式的优势。 
1.Docker容器的启动可以在秒级实现,相比传统的虚拟化方式要快了很多,其次,Docker对系统资源的利用率很高,一台主机可以同时运行数千个Docker容器。 
2.容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的资源占用量非常的小,传统虚拟机方式运行10个不同的应用就要启10个虚拟机,而Docker只需要启动10个隔离的应用即可。 
3.虚拟化技术依赖物理CPU和内存,是硬件级别的,而Docker构建在操作系统上,利用操作系统的containerization技术。 
4.虚拟化系统一般都是指操作系统镜像,而Docker是开源并且轻量的,单个容器适合部署少量应用。 
5.传统的虚拟化技术使用快照来保存状态,而docker在保存状态上不仅更为轻便和低成本,而且引入了类似代码管理机制,将容器的快照形成历史版本一一记录下来,切换成本很低。 
6.传统的虚拟化技术在构建系统的时候较为复杂,需要大量的人力,而docker可以通过dockfile来构建整个容器,重启和构建速度非常的快,更重要的是dockfile可以手动编辑,这样应用程序开发软件可以通过发布Dockfile来指导系统环境和依赖,这样对持续交付十分有利。 
7.在安全性方面,Docker确保运行在容器中的应用程序和其他容器的应用程序是完全分隔与隔离的,在通信流量和管理上赋予你完全的控制权。Docker容器不能窥视运行在其他容器中的进程。每个容器只是用着自己的资源。

场景1:多版本多种类系统与软件

  • 需要一个 CentOS 7系统测试;
  • 需要一个 CentOS 6系统测试;
  • 需要一个 Ubuntu 系统测试;
  • 需要一个 Alpine 系统测试;
  • 需要一个 Mysql 5.7 测试;
  • 需要一个 Mysql 5.5 测试;
  • 需要一个 。。。。。。

千辛万苦配置好了所需的环境,对方用了5分钟要求换个版本。。 
使用Docker,则每个需要都是一条命令(docker run),半分钟就能解决

场景2:环境

  • 很多时候存在多个环境版本一致性问题,如PHP运行环境,涉及到PHP版本,PHP扩展的版本等等;
  • 环境不一致容易导致诸多问题,比如在测试环境正常的项目,到了生产环境却报错了,回退到测试环境不能复现
  • 使用Docker镜像封装运行环境,一次构建,到处运行;
  • 新增的系统也能快速部署,实现高效的节点扩容,保证业务的健康与稳定性;
  • 开发者之间也解决了环境一致性问题,并不必在经常为环境问题烦恼,专心实现业务需求

Docker 的内部机制

要理解 Docker 的内部机理,要知道三种资源:

  • Docker images
  • Docker registers
  • Docker containers

版本选择

  • Docker
    17.03以后版本变为 Docker CE
  • Docker CE
    社区版,Community Edition
  • Docker EE
    企业版, Enterprise Edition 
    收费版, 强调安全性,提供一些高级特征及商业支持

docker基本命令

  1. docker search 镜像名 #查看镜像
  2. docker pull 镜像 #下载镜像,后接版本号,默认下载最新版本
  3. docker images #查看本地下载的镜像
  4. docker build -t 镜像名 . #添加镜像,-t自定义名字,配置文件和脚本的路径
  5. docker run -dit ID或名字 #启动镜像 -d以守护进程后台运行,i命令交互,t伪终端登录。
  6. docker ps / ps -a #查看本地运行的容器,-a 全部容器(包括未运行的同期)
  7. docker run -dit --name 自定义名 容器名 #运行镜像,设置名字
  8. docker attach id/名字 #进入容器
  9. docker stop id/名字 #停止一个正在运行的容器
  10. docker start id/名字 #启动一个容器
  11. docker restar id/名字 #重启一个容器
  12. docker rm id/名字 #删除一个容器,要先停止容器
  13. docker rmi id/名字 #删除镜像,必须先关闭和删除所有容器
  14. docker commit ID/名字 自定义名字 #对修改后的容器,重新保存成一个新的镜像
  15. docker exec 容器名 ls/ #免交互输入命令,不需要进入容器
  16. docker exec -it id/容器名 /bin/bash #新启动一个进程,exit不影响容器正常运行
  17. docker cp docker.sh 容器:/路径/ #拷贝文件到容器的指定路径
  18. docker cp 容器名:/文件路径 /宿主机路径/ #拷贝容器文件到宿主机
  19. docker creat -it 容器名 #创建一个容器,但不运行容器
  20. docker diff id/名字 #让容器与源镜像做对比,查看发生的变化
  21. docker events #实时监控容器发生的变化
  22. docker export id/名字 > /test.tar #导出容器到当前文件夹,命名。
  23. docker import test.tar 容器名 #将导出的容器导入成新的镜像,重命名
  24. docker history 容器名 #查看镜像的修改记录
  25. docker info #查看当前操作系统的docker信息
  26. docker inspect 镜像名 #查看镜像的详细信息
  27. docker kill id/容器名 #强制停止容器,比stop快
  28. docker save 容器名 > Centos.tar #导出镜像定义名字
  29. docker load < cents.tar #导入镜像,与源ID没名字一样,如果导入要首先删除源镜像文件
  30. docker logs id/名字 #查看容器的日志,输入到屏幕上
  31. docker pause id/名字 #暂停容器
  32. docker unpause id/名字 ##恢复容器
  33. docker run -dit --name 容器名 -P 7410:80 名字 #启动一个容器 -p 指定映射端口,让本机的7410端口映射容器的80端口
  34. docker rename 容器名 新容器名 #给容器更改名字
  35. docker stats id/容器名 #查看容器运行状态
  36. docker tag 名字 新名字 #克隆镜像ID号一样
  37. docker top id/容器名 #查看容器里的进程信息
  38. docker version #查看docker版本
  39. docker wait id/名字 #监控指定容器退出
  40. docker volume ls #查看卷 /var/log/docker/volumes/
  41. docker run -dit --name=crow_nginx -p 7410:80 --mount src=nginx-vol dst=/usr/share/nginx/html nginx #开启一个容器指定号端口挂载卷到容器里的nginx里的网页配置文件
  42. docker run -dit --name=crow_nginx_01 -p 7410:80 --mount src=/www/html dst=/usr/share/nginx/html nginx #直接创建文件进行绑定

Docker的网络模式

  • bridge:默认网络Docker启动后默认创建一个docker 0网桥,默认创建的容器也是添加这个网桥中。
  • host:容器不会获得一个独立的network namespace而与宿主机共用一个。
  • none:获取独立的network namespace,但不为容器进行任何的网络配置。
  • container:与指定的容器使用同一个network namespace 网卡配置也会相同的。
  • 自定义:自定义网桥模式,与bridge相同。 
     

 

55.png

 

 

可以通过docker network命令查看

  1. [root@along ~]# docker network ls
  2. NETWORK ID NAME DRIVER SCOPE
  3. f23b4899add1 bridge bridge local
  4. 65520497f693 host host local
  5. a0c5f18e0f04 none null local

docker run --network命令可以指定使用网络模式。(默认是bridge模式)