1. 背景
* Docker是Docker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源。
* Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。
* Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机VM额外的操作系统开销,提高资源利用率。
2. 优势
* 部署简单
* 管理简单
* 秒级应用启动
* 与宿主机使用同一个内核,性能损耗小
* 隔离性高
* 镜像一次构建,到处运行
3. 应用场景
* 简化配置,统一配置,通过镜像快速启动(Simplifying)
* 代码流水线管理,开发环境->测试环境->预生产环境->灰度发布->正式发布,docker在这里实现了快速迁移(Code Oioeline Management)
* 开发效率,对开发人员,有了镜像,直接启动容器即可(Developer Productivity)
* 应用隔离,相对于虚拟机的完全隔离会占用资源,docker会比较节约资源(Applsolation)
* 服务器整合,一台服务器跑多个docker容器,提高服务器的利用率(Server Consolidation)
* 调试能力,debug调试(Debugging Capabilties)
* 多租户,一个租户多个用户,类似于阿里公有云的一个project下多个用户(Multi-tenancy)
* 快速部署,不需要启动操作系统,实现秒级部署(Rapid Deplovment)
4. docker相关注意
* 容器不同于虚拟机
* 容器理论推荐单一进程
* 容器不如虚拟机来得成熟
* 容器可以在几分之一秒内启动
* 容器已在大规模环境证明了自身的价值
* IT人员称容器为轻量级
* Docker已成为容器的代名词,但它不是唯一的提供者
* 容器能节省IT人力,加快业务更新效率
5. docker与容器本身意义
* 面向产品: 简化交付流程
* 面向开发: 简化环境配置
* 面向测试: 多版本测试
* 面向运维: 简化环境问题
* 面向架构: 自动化扩容 [ 微服务 ]
6. 使用Docker原因
作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式具有众多的优势。
首先,Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker对系统资源的利用率很低,一台主机上可以同时运行数千个Docker容器。
6. docker相关概念
** 镜像 [ image ]
* Docker镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。
镜像可以用来创建Docker容器。
Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
** 容器 [ container ]
* Docker利用容器来运行应用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
** 仓库 [ registry ]
* 仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问。
当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了。
7. docker实战
* 系统环境 [ docker运行环境推荐在 linux 内核大于 2.6 ]
1
2
3
4
|
[root@docker ~]
# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@docker ~]
# uname -r
3.10.0-327.36.3.el7.x86_64
|
* docker 服务安装
1
|
[root@docker ~]
# yum install docker
|
* 启动 docker 服务
1
|
[root@docker ~]
# systemctl start docker.service
|
* 查看 docker 版本信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@docker ~]
# docker version
Client:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-28.git1398f24.el7.centos.x86_64
Go version: go1.7.4
Git commit: 1398f24
/1
.12.6
Built: Fri May 26 17:28:18 2017
OS
/Arch
: linux
/amd64
Server:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-28.git1398f24.el7.centos.x86_64
Go version: go1.7.4
Git commit: 1398f24
/1
.12.6
Built: Fri May 26 17:28:18 2017
OS
/Arch
: linux
/amd64
|
* 在 docker hub 仓库上搜索镜像[ 默认从docker.io上搜索 ]
docker search 镜像名称:版本号[ 不填默认为latest ]
INDEX: 搜索源
NAME: 镜像名称
DESCRIPTION: 描述
STARS: 下载次数
OFFICIAL: 是否官方
AUTOMATED: 是否自动化
1
2
3
4
5
6
|
[root@docker ~]
# docker search centos
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io
/centos
The official build of CentOS. 3397 [OK]
docker.io docker.io
/jdeathe/centos-ssh
CentOS-6 6.9 x86_64 / CentOS-7 7.3.1611 x8... 70 [OK]
docker.io docker.io
/nimmis/java-centos
This is docker images of CentOS 7 with dif... 26 [OK]
docker.io docker.io
/gluster/gluster-centos
Official GlusterFS Image [ CentOS-7 + Glu... 19 [OK]
|
* 从 docker hub 仓库上获取(下载)镜像至本地库 [ 默认从docker.io上下载 ]
docker pull 镜像名称:版本号[ 不填默认为latest ]
1
|
[root@docker ~]
# docker pull centos
|
* 查看本地库所有镜像
docker images
1
2
3
|
[root@docker ~]
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io
/centos
latest 3bee3060bfc8 9 days ago 192.5 MB
|
* 导出本地库镜像
docker save 镜像名称:版本号 > 导出文件名
1
|
[root@docker ~]
# docker save centos > centos.tar.gz
|
* 删除本地库镜像
docker rmi 镜像名称:版本号
1
2
3
4
|
[root@docker ~]
# docker rmi centos
Untagged: centos:latest
Untagged: docker.io
/centos
@sha256:aebf12af704307dfa0079b3babdca8d7e8ff6564696882bcb5d11f1d461f9ee9
Deleted: sha256:3bee3060bfc81c061ce7069df35ce090593bda584d4ef464bc0f38086c11371d
|
* 导入镜像文件至本地库
docker load < 镜像文件
1
2
|
[root@docker ~]
# docker load < centos.tar.gz
Loaded image: docker.io
/centos
:latest
|
* 新建容器并运行
当利用docker run来创建容器时,Docker在后台运行的标准操作包括:
* 检查本地是否存在指定的镜像,不存在就从公有仓库下载
* 利用镜像创建并启动一个容器
* 分配一个文件系统,并在只读的镜像层外面挂在一层可读写层
* 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
* 从地址池配置一个ip地址给容器
* 执行用户指定的应用程序
* 执行完毕后容器被终止
docker run [option....]
例如:运行一个容器,指定名称为hello, 输出hello之后终止容器
1
2
|
[root@docker ~]
# docker run --name hello centos echo "hello"
hello
|
例如:启动一个容器,指定bash命令,并进入容器内部
-i: 则让容器的标准输入保持打开。
-t: 让Docker分配一个伪终端,并绑定到容器的标准输入上
/bin/bash: 执行一个命令
1
2
3
|
[root@docker ~]
# docker run -it centos /bin/bash
[root@b4473c885f51 /]
# pwd
/
|
* 退出并不关闭容器
ctrl + p + q
1
|
[root@f91270f431bd /]
# [root@docker ~]#
|
* 启动已终止容器
docker start 容器名称
1
2
|
[root@docker ~]
# docker start hello
hello
|
*以守护进程运行
更多的时候,需要让Docker容器在后台以守护形式运行。此时可以通过添加-d参数来实现。
docker run -d [opation...]
1
2
|
[root@docker ~]
# docker run --name daemon -d centos /bin/bash
6fd939dd05004e18248e04d10de88076c61878aea904093e24e122a907371234
|
* 查看正在运行的容器
docker ps
1
|
[root@docker ~]
# docker ps
|
* 查看所有容器
1
2
3
|
[root@docker ~]
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65c0868177e7 centos
"/bin/bash"
34 seconds ago Exited (0) 32 seconds ago daemon
|
* 停止正在运行的容器
docker stop 容器名称或唯一容器ID [容器ID通过ps CONTAINER ID 查看]
1
2
|
[root@docker ~]
# docker stop daemon
daemon
|
* 删除已停止的容器
docker rm 容器名称或唯一容器ID [容器ID通过ps CONTAINER ID 查看]
1
2
|
[root@docker ~]
# docker rm daemon
daemon
|
8. 总结
以需求驱动技术,技术本身没有优略之分,只有业务之分。