初步认识docker

什么是docker
docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux机器中,也可以实现虚拟化。
docker的目标是实现轻量级操作系统虚拟化的解决方案。(基于Go语言开发)

docker简单原理
docker的基础是linux容器(LXC)、Cgroup技术。
docker是在LXC的基础上进行了进一步的封装,让用户不再需要去关心容器的管理,使得操作更加简便。用户操作docker的容器就像操作一个快速轻量级的虚拟机一样简单。
与传统虚拟户(KVM、XEN等)相比较:
(1)docker是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统
(由下往上:硬件->host操作系统->docker engine->应用库->应用app)

upload successful
(2)传统的虚拟化方式是在硬件的基础上,虚拟出自己的系统,再在系统上部署相关的APP应用
(由下往上:硬件->host操作系统->hypervisor->guest操作系统->应用库->应用app)

upload successful

docker组件
(1)镜像:其实就是模板,跟我们常见的ISO镜像类似,是一个样板
(2)容器:使用镜像常见的应用或系统,我们称之为一个容器(容器相当于启动之后的镜像)
(3)仓库:仓库就是存放镜像的地方,分为公开仓库(public)和私有仓库(private)两种形式

docker技术组件
linux内核的命名空间(namespace),用于隔离文件系统、进程和网络
(1)文件系统隔离:每个容器都有自己的root文件系统
(2)进程隔离:每个容器都运行在自己的进程环境中
(3)网络隔离:容器间的虚拟网络接口和IP地址都是分开的
(4)资源隔离和分组:使用Cgroups(即control group,linux内核特性之一)将cpu和内存之类的资源独立分配给每个docker容器
(5)写时复制:文件系统都是通过写时复制创建的
(6)日志:容器产生的STDOUT、STDIN和STDERR这些IO流都会被收集并记入日志
(7)交互式shell:用户可以创建一个伪tty终端,为容器提供一个交互式shell

docker虚拟化特点
(1)操作启动快
运行时的性能获得极大的提升,管理操作(开始、停止、重启等)都是以秒或者毫秒为单位的
(2)轻量级虚拟化
你会拥有足够的”操作系统”,仅需添加或减少镜像即可。在一台服务器上可以部署100~1000个container容器,但是传统虚拟化虚拟出10~20个虚拟机就已经很好了
(3)开源免费
(4)前景及云支持

使用docker的优势
(1)提供一个简单、轻量的建模方式
用户上手docker非常快,只需要几分钟就可以将自己的程序”docker化”,docker依赖于”写时复制”(copy-on-write)模型,使得修改应用程序也非常迅速。
(2)职责的逻辑分离
使用docker,开发人员只需要关心容器中运行的应用程序,运维人员只需要关心如何管理容器,从而降低”开发时一切正常,肯定是运维问题”的风险。
(3)快速、高效的开发生命周期
docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性、易于构建、易于协作。
(4)鼓励使用面向服务的架构
docker推荐单个容器只运行一个应用程序,这样就形成了一个分布式的应用程序模型。在这种模型下,应用程序或服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序或者扩展应用程序变得简单。

docker安装先决条件
(1)运行64位CPU架构的计算机,不支持32位的CPU
(2)运行linux3.8或更高版本的内核
查看内核版本:
uname -a
目前3.8内核已经可以通过apt-get来安装,内核更新步骤:
apt-get update
apt-get install linux-headers-3.8.0-27-generic
update-grub
reboot
(3)内核必须支持一种适合的存储驱动,默认是Device Mapper
检查主机是否安装Device-mapper:
grep device-mapper /proc/devices
如果没有出现device-mapper的相关信息,可以尝试加载dm_mod模块:
modprobe dm_mod
(4)内核必须支持并开启cgroup和namespace(命名空间)的功能
cgroup和namespace自2.6版本就已经集成到linux内核中,目前为止功能非常稳定

docker安装
默认docker只能在centos6.5以上机器才能使用yum直接安装,如果是其他版本的话需要安装centos扩展源epel。
docker官方要求linux kernel至少要3.8以上。
在centos6.5系统上安装docker:
(1)关闭selinux
(2)安装epel源
wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
(3)安装依赖
yum install lxc libcgroup device-mapper-event-libs
device-mapper* -y
(4)安装docker
yum install docker-io
(5)docker启动
/etc/init.d/docker start
在ubuntu 16.04安装docker:
(1)安装
wget -qO- https://get.docker.com/ | sh
(2)启动
/etc/init.d/docker start
备注:在ubuntu中,如果使用UFW,需要在UFW中启用数据报文转发,才能让docker正常工作。因为UFW默认情况下会丢弃所有转发的数据包。修改/etc/default/ufw,将DEFAULT_FORWARD_POLICY=”DROP”修改为DEFAULT_FORWARD_POLICY=”ACCEPT”,保存修改内容并通过ufw reload重启UFW即可

docker常用命令
docker version #查看docker版本
docker images #查看当前的docker所有镜像
docker info #检查docker是否已经正确安装并运行
docker search centos #搜索可用的docker镜像
docker pull centos #从公有仓库中下载镜像
cat centos.tar | docker import - centos6 #导入镜像,导入centos.tar镜像并重命名为centos6
docker export id > centos6.tar #导出镜像,根据id导出镜像并重命名为centos6.tar
docker ps -l #查看最后一个容器的id
docker ps -a #查看所有容器
docker run centos echo “hello world” #在容器中运行”hello world”
docker run centos yum install ntpdate #在容器中安装ntpdate程序
docker run -i -t centos /bin/bash #在容器中启动一个/bin/bash shell环境,可以登入操作,-t表示打开一个终端,-i表示交互式输入
docker run -d centos:v1 /bin/bash #在后台启动一个/bin/bash shell环境,-d表示在后台以daemon方式启动
docker run -d -p 80:80 -p 8022:22 centos:v2 #-p指定容器启动后docker上运行的端口映射为容器里运行的端口,80:80中第一个80表示docker系统(本机)的80端口,第二个80表示docker虚拟机(docker容器)里面的端口。用户默认访问本机80端口,自动映射到容器里面的80端口
docker commit 2313132 centos:v1 #提交刚修改的容器
docker stop id #关闭容器
docker start id #启动容器
docker rm id #删除容器