Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
认识Docker
Docker自2013年以来非常火热,无论是从 github上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。
1.0 Docker 架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
1.1 Docker 特性
由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku), 构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。
- 构建标准化的运行环境,现有的方案大多是在一个baseOS上运行一套puppet/chef,或者一个image文件,其缺点是前者需要base OS许多前提条件,后者几乎不可以修改(因为copy on write 的文件格式在运行时rootfs是read only的)。并且后者文件体积大,环境管理和版本控制本身也是一个问题。
- PaaS环境是不言而喻的,其设计之初和dotcloud的案例都是将其作为PaaS产品的环境基础
- 因为其标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来
- 因为LXC轻量级的特点,其启动快,而且docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源
1.2 Docker 应用场景
- Automating the packaging and deployment of applications(使应用的打包与部署自动化)
- Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
- Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
- Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)
1.3 Docker到底是什么?
来举个简单的例子。docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付,如同乐高积木,用户只需要选择合适的积木组合,并且在最顶端署上自己的名字(最后一个标准化组件是用户的app)。这也就是基于docker的PaaS产品的原型。
v安装Docker
2.0 版本检测
正如上文所说,Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r
命令查看你当前的内核版本
2.1 安装docker
Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令:yum -y install docker
2.2 启动docker服务
通过 service docker start
和 systemctl start docker
均无法启动docker。错误信息: Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
。如下图:
于是在网上找各种类似错误,试过关闭防火墙,关闭selinux,重装系统,等等网上能查到的方法都解决不了。
在docker里禁用selinux( vim /etc/sysconfig/docker
), –selinux-enabled=false
,重启启动服务解决问题。
更新后的完整配置: OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'
2.3 测试运行 hello-world
docker run hello-world
但是在运行:docker run hello-world的时候报错:
container_linux.go:235: starting container process caused "process_linux.go:258: applying cgroup configuration for process caused \"Cannot set property TasksAccounting, or unknown property.\""
/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:235: starting container process caused "process_linux.go:258: applying cgroup configuration for process caused \"Cannot set property TasksAccounting, or unknown property.\"".
解决:主要原因还是centos系统版本兼容性问题,如果将系统做更新升级,即可解决。
yum update
此时重新运行 docker run hello-world
,结果如下:
2.4 修改镜像源
docker默认的源为国外官方源,下载速度较慢,可改为国内。
# vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
service docker restart
国内的阿里和网易等都可以,或者直接使用官方->国内的。
2.5 设置docker开机自动启动
systemctl enable docker
docker已经成功启动,至此,docker已经安装完毕。
v探索Hello World
3.0 docker hello world
可以使用docker run 命令来在容器内运行一个应用程序,比如输出Hello World。
docker run centos /bin/echo "Hello World"
参数解析:
-
docker
: Docker 的二进制执行文件。 -
run
:与前面的 docker 组合来运行一个容器。 -
centos
:指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。 -
/bin/echo "Hello world"
: 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 centos
镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world"
,然后输出结果。
3.1 运行交互式的容器
我们通过docker的两个参数 -i -t,让docker运行的容器实现"对话"的能力 docker run -i -t centos /bin/bash
参数解析:
-
-t
:在新容器内指定一个伪终端或终端。 -
-i
:允许你对容器内的标准输入 (STDIN) 进行交互。
此时我们已进入一个centos系统的容器.我们尝试在容器中运行命令cat /proc/version
和 ls
分别查看当前系统的版本信息和当前目录下的文件列表
我们可以通过运行exit命令或者使用CTRL+D来退出容器。
3.2 启动容器(后台模式)
使用 docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"
命令创建一个以进程方式运行的容器
a2274d84c6e8025623a17d1262f1a65dfaa9ce982de94d2301f4c0fff049ed7e
这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。
我们需要确认容器有在运行,可以通过 docker ps
来查看
CONTAINER ID
:容器ID; NAMES
:自动分配的容器名称
在容器内使用docker logs命令,查看容器内的标准输出 docker logs a2274d84c6e8
3.3 停止容器
我们使用 docker stop
命令来停止容器
至此,docker hello world就完毕了。