Docker虚拟化技术
什么是Docker?
它是Linux里运行的应用的开源软件,它跟KVM的区别更像是Docker是运行在Linux系统中的一个软件,以应用的形式来模拟成虚拟机使用(想象一下再Windows上运行VMware和QQ),既可以是一个应用,也可以是一台服务,甚至是一个完整的操作系统
Docker与传统虚拟化比较
启动速度更快、计算能力损耗几乎无、性能接近原生超过虚拟机、系统支持量也远远超过虚拟机、隔离性资源限制,而虚拟机完全隔离
Docker的核心概念
镜像:Docker的镜像是创建容器的基础,可以理解是一个安装系统环境的镜像,也可以理解为是安装一个应用程序的镜像
容器:Docker的容器是从镜像创建来的运行实例,可以创建、启动、停止和删除,所创建的每个容器都是相互隔离、互不可见的,可以保证平台安全
仓库:Docker的仓库是用来存储镜像的地方可以把创建的镜像使用push命令上传上去,其他容器使用可以直接pull下来
安装Docker
安装Docker的两种方式|:curl获得安装脚本安装和yum仓库进行安装
注意:这里是在CentOS7.2下yum进行安装,目前Docker只支持64位系统
1.下载安装docker
yum -y install docker
2.启动docker服务
systemctl start docker
查看docker版本信息:docker version
一、Docker的镜像和容器的操作
搜索镜像:docker search 关键字
比如:docker search nginx
下载镜像:docker pull docker.io/linuxserver/nginx
查看镜像信息:docker images
REPOSITORY:镜像属于的仓库
TAG:镜像的标签信息
IMAGE ID:镜像的唯一ID号
CREATED:镜像的创建时间
VIRTUAL SIZE:镜像的大小
可以通过红线圈起来的ID号查看该镜像的详细信息:docker inspect fb5ca9bbaab4
本地镜像添加新的标签:docker tag 名称 新名称:新标签
比如:docker tag docker.io/linuxserver/nginx nginx:nginx
删除镜像:docker rmi nginx:nginx
注意:当镜像拥有多个标签时,该命令只是删除该镜像的一个标签而已,删除命令后面跟ID时,确保该镜像没有被容器使用,会先删除所有标签,再删除该镜像本身,如果该镜像被容器使用,正确做法是先删除依赖该镜像的所有容器再删除该镜像
镜像的导出和载入(从一台机器上导出镜像,然后复制镜像文件可以载入到其他机器上使用该镜像)
导出镜像:docker save -o 存储文件名 存储的镜像
比如:docker save -o nginx docker.io/linuxserver/nginx
载入镜像:docker load < nginx 或者 docker --input nginx
上传镜像:在公共仓库成功注册一个账号,登录使用push命令上传
比如这个账号为admin:
docker tag docker.io/linuxserver/nginx admin/nginx:nginx
docker login
docker push admin/nginx:nginx
创建容器:docker create 【选项】镜像 运行的程序环境
-i:让容器输入保持打开
-t:让Docker分配一个伪终端
比如:docker create -it docker.io/linuxserver/nginx /bin/bash
查看所有容器的运行状态:docker ps -a
-a:列出系统最近一次启动的容器
启动容器(通过上图红线的ID号启动):docker start ba7a5dc88d29
补充:创建并启动容器:docker run = docker create + docker start
持续在后台运行容器:docker run -d centos /usr/bin/bash -c "while true;do echo hello;done"
停止容器:docker stop ba7a5dc88d29
进入容器(可以理解为进入虚拟机的shell环境):docker exec -it ba7a5dc88d29 /bin/bash
导出容器:docker export 容器ID/容器名称 > 文件名
比如:docker export ba7a5dc88d29 > nginxtar
导入容器:cat 文件名 | docker import - 生成的镜像名:标签
比如:cat nginxtar | docker import - nginx:nginx
删除容器:docker rm ba7a5dc88d29
-f:强制删除一个正在运行的容器
补充:docker出现下面错误
解决方法:
vim /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl -p
补充:Docker资源控制
限制CPU使用速率(CPU的百分比以1000位单位)
CPU使用率限定为20%:docker run --cpu-quota 20000 容器名
也可以修改Cgroup配置文件(通过echo命令导入)
echo 20000 > /sys/fs/cgroup/cpu/docker/容器编号/cpu.cfs_quota_us
多任务按比例分享CPU
比如:有A、B、C三个容器运行,占用比例分配1:1:2
docker run --cpu-shares 1024 容器A
docker run --cpu-shares 1024 容器B
docker run --cpu-shares 2048 容器C
限制CPU内核使用
限制该容器内的进程只会在编号1、2、3、4的CPU上运行(第一个内核用0开始表示)
docker run --cpuset-cpus 0,1,2,3 容器名
对内存使用的限制:docker run -m 512m 容器名
对blkio的限制:docker run --device-write-bps /dev/sda1:1mb 容器名
二、Docker的数据管理
数据卷:数据卷是一个供容器使用的目录,位于容器中,可以在容器之间挂载,可将宿主机的目录挂载到数据卷上,实现数据的迁移
docker run -it -d -v /date1 -v /date2 -p 8888:80 --name my-nginx docker.io/linuxserver/nginx
挂载主机目录作为数据卷
比如:使用httpd:centos镜像创建一个名为web的容器,将宿主机的/var/www/html目录挂载到/date1目录上
docker run -d -v /var/www/html:/date1 --name web httpd:centos
三、Docker网络通信
端口映射
-P:实现随机映射,Docker会把容器自身的80端口随机映射在宿主机的随机端口上
-p:实现指定把容器的哪个端口映射在宿主机的哪个端口上
docker run -d -P httpd:centos
docker run -d -p 8888:80 httpd:centos
容器网络互连
--link name:alias
nme:要连接的容器名称,alias是这个连接的别名
创建源容器:docker run -d -P --name web1 httpd:centos
创建接收容器:docker run -d -P --name web2 --link web1:web1 httpd:centos
测试:(只能接收容器ping通源容器的网络)
四、Docker镜像的创建方法
已有镜像创建
docker commit 【选项】容器ID/名称 仓库名称:标签
-m:显示说明信息
-a:显示作者信息
-p:生成过程中停止容器运行
例:查看到你要创建已有镜像的id,然后执行命令docker commit -m "new" -a "myname" bf249d1747a7 docker:new
下载模板使用模板创建
下载地址为:http://openvz.org/Download/template/precreated
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:new
Docerfile创建镜像
1.创建工作目录
mkdir apache
cd apache
2.创建编写Dockerfile文件
vim Dockerfile
#基于的基础镜像
FROM centos
#维护该镜像的用户信息
MAINTAINER The CentOS Project<cloud-ops@centos.org>
#编写镜像操作指令安装apache的软件包
RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 775 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
3.编写执行脚本
vim run.sh
#!/bin/bash
#清理httpd的缓存
rm-rf /run/httpd*
#启动apache服务
exec /usr/sbin/apachectl -D FOREGROUND
4.创建apache的测试网页
vim index.html
<html><h1>this is docker test!!!</h1></html>
5.使用Dockerfile文件生成镜像
-t:指定镜像的标签信息
docker build -t httpd:centos
6.使用新生成的镜像文件运行容器
docker run -d -p 8888:80 httpd:centos
该命令-p选项实现从本地的8888端口到容器中80端口的映射
7.测试访问该主机ip的8888端口访问网页
补充:构建私有仓库
1.在需要构建私有仓库的服务器上下载registry镜像
docker pull registry
2.在/etc/docker/目录下创建json文件
vim /etc/docker/daemon.json
{"insecure-registries":["192.168.0.101:5000"]}
systemctl restart docker
3.使用下载好的registry镜像启动一个容器(默认仓库存放于容器内的/tmp/registry目录下)
docker run -d -p 5000:5000 -v /date/registry:/tmp/registry registry
4.就可以上传镜像
docker tag nginx 192.168.0.101:5000/nginx(修改标签)
docker push 192.168.0.101:5000/nginx