docker这几年越来越热,大家肯定都听说过, 今天就来聊下docker到底是啥,docker为什么能这么流行,它和之前的虚拟化技术有何不同,以及能给我们带来什么帮助。
一 什么是Docker
1. 基于Go语言的开源容器虚拟化平台
- Docker 从 17.03之后分为 CE(Community Edition) 和 EE(Enterprise Edition)
-从1.13.1飞跃到17, 17.03可以看做1.13.1的Bug修复版
- CentOs 6.x :目前配套安装的docker版本为1.7
2. 基于Linux容器技术(LXC)
- 命名空间:用于隔离:进程,网络,IPC,挂载,UTS,用户
- 控制组:资源配额和度量。
- 联合文件系统:轻量级、高性能的分层文件系统
- Linux网络虚拟化:虚拟网络设备(veth pair)
3. 口号:Build, Ship and Run Any App, Anywhere
一次构建,到处运行,有些类似于当年java的口号。
二 Docker为什么能流行
Docker's success is more the result of being in the right place at the right time for a trend that's much bigger than Docker.
核心:通过容器来打包应用,解耦了应用和运行平台,实现了应用的快速分发和部署——Docker第一次为应用的开发、运行和部署提供了”一站式“的实用解决方案。
DevOps的梦想:只需一次创建或配置,之后应用可以在任何地方,任意时间正常运行。Docker是实现这一梦想的瑞士军刀:
- 更快速的交付和部署:环境标准统一
- 更高效的资源利用: 内核级的轻量虚拟化
- 更方便的迁移和扩展:目前各种运行平台都支持
- 更简单的分发管理:Dockfile,类Git机制,存储复用,增量更新
Docker VS 传统虚拟机
三 安装Docker
Docker requires a 64-bit installation regardless of your CentOS version. Also, your kernel must be 3.10 at minimum. CentOS 7 runs the 3.10 kernel, 6.5 does not. We make an exception for CentOS 6.5.To run Docker on CentOS-6.5 or later, you need kernel 2.6.32-431 or higher.
Centos 6.x
1. 添加yum源
[xiaoju@kvm96061 ~]$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
2. 更新yum源缓存: sudo yum update
3. 安装:sudo yum install -y docker-engine
四 Docker 核心概念和架构
三大核心概念:
1. 镜像image:只读模板,由若干层layer组成。
2. 容器Container:从镜像创建的应用运行实例,一个轻量级沙盒,启动时在最上层创建了一个可写层。
3. 仓库Repository:类似git的project,保存同一类镜像文件,分为Public & Private。
VS 仓库注册服务器(Registry,类似于git server,最著名的是Docker Hub)
五 Docker基础用法
1. exported-imported VS saved-loaded
导出后再导入(exported-imported)的镜像会丢失所有的历史,而保存后再加载(saved-loaded)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚(可以执行docker tag来回滚之前的层)
2. docker commit
我们运行的容器可能在镜像的基础上做了一些修改,有时候我们希望保存起来,封装成一个更新的镜像
docker自己提供的有commit功能
我们以centos为例,现在我们要在一个裸的centos上面安装vim编辑器,并且把这个功能保存下来,封装成一个能执行vim命令的centos镜像
拉去最新centos镜像:docker pull centos
进入镜像内部: docker run -it centos /bin/bash 备注:/bin/bash不要忘了
[root@202 ~]# docker run -it centos /bin/bash
[root@afcaf46e8305 /]#
afcaf46e8305是产生的容器ID,前面运行的时候不要-d后台运行了,不然会进不去容器内部的
[root@afcaf46e8305 /]# yum update
[root@afcaf46e8305 /]# yum install -y vim
安装完了后:exit退出容器
然后把容器打包成镜像:
root@202 ~]# docker commit afcaf46e8305 centos-vim
完成后docker images查看镜像就会发现centos-vim这个镜像了
我们再用刚刚的方法进去centos-vim这个镜像,
[root@7f2d42f3e0a3 /]# vim --version
就可以看到vim的信息了
Demo:
docker run mycentos /bin/echo "hello"
docker run -it --name demo /bin/sh, docker top,docker attach
六 Dockerfile
一行行命令语句组成,支持 #注释
dockerfile分为四部分:基础镜像信息,维护者信息,镜像操作命令和容器启动时执行命令。
创建镜像:docker build
.dockerignore 忽略不需要的文件和目录
TIPS:
==- 精简镜像用途
- 正确使用版本号
- 减少镜像层数(尽量合并指令)
七 Docker compose (require engine>=1.10.0)
Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose
允许用户通过一个单独的模板配置文件docker-compose.yml来定义一组相关联的应用容器为一个项目(project),非常适合组合使用多个容器进行开发的场景。
例子:
`version:'2'services:web:image:wordpress:latestlinks:-
dbports:-"8002:80"environment:WORDPRESS_DB_HOST:db:3306WORDPRESS_DB_PASSWORD:123456db:image:mysqlenvironment:-
MYSQL_ROOT_PASSWORD=123456`
启动项目:docker-compose up