Docker 介绍及优势
Docker 简介
Docker 工作流程
工作流程:服务器A上运行docker Engine 服务,在docker Engine 上启动很多容器container,从外网Docker Hub 上把image 操作系统镜像下载来,放到container容器运行。这样一个虚拟机实例就运行起来了。
最后,通过Docker client对docker 容器虚拟化平台进行控制。
- Image 和 Container的关系:image 可以理解为一个系统镜像,Container是 Image 在运行时的一个状态。
- 如果拿虚拟机作一个比喻的话,Image 就是关机状态下的磁盘文件,Container 就是虚拟机运行时的磁盘文件,包括内存数据。
- dockerhub 是docker 官方的镜像存储站点,其中提供了很多常用的镜像供用户下载,如ubuntu,centos 等系统镜像。通过dockerhub用户也可以发布自己的 docker 镜像,为此用户需要注,册一个账号,在网站上创建一个docker仓库。
Docker 核心技术
- 1.Namespace 实现Container的进程、网络、消息、文件系统和主机名的隔离。
- 2.Cgroup-实现对资源的配额和度量。
注:Cgrout的配额,就像 vmware虚拟机中的配置参数:可以指定cpu个数,内存大小等
特性:
- 文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。
- 资源隔离:系统资源,像CPU和内存等可以分配到不同的容器中,使用cgroup。
- 网络隔离:每个进程容器运行在自己的网络空间,虚拟接口和IP地址。
- 日志记录:Docker 将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
- 变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
- 交互式shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。
优点:
1.一些优势和VM一样,但不是所有都一样。
比VM小,比VM快,Docker容器的尺寸减小相比整个虚拟机大大简化了分布到云和从云分发时间和开销。
2.对于在笔记本电脑,数据中心的虚拟机,以及任何的云上,运行相同的没有变化的应用程序,IT的发布速度更快。
- Docker是一个开放的平台,构建,发布和运行分布式应用程序。
- Docker使应用程序能够快速从组件组装和避免开发和生产环境之间的摩擦。
3.您可以在部署在公司局域网或云或虚拟机上使用它。
4.开发人员并不关心具体哪个Linux 操作系统使用Docker,开发人员可以根据所有依赖关系构建相应的软件,针对他们所选择的操作系统。然后,在部署时一切是完全一样的,因为一切都在Dockerlmage的容器在其上运行。开发人员负责并且能够确保所有的相关性得到满足。
5.Google,微软,亚马逊,IBM等都支持Docker。
Docker是什么?
KVM, Virtualbox, Vmware是虚拟出机器,让每个实例看到一个单独的机器;而Docker是虚拟出操作系统,实现应用之间的隔离,让各个应用觉得自己有一个自己的操作系统,而且彼此之间隔离。假设没有Docker,然后有进程1和进程2,它们的运行将类似下图,进程1和进程2共享kernel,它们是同一OS下2个进程,因此必须拥有不同PID,但是又共享网卡,共享IP地址,看到一样的根文件系统(不chroot的情况下)等,可以用Linux IPC手段进程间通信。
有Docker的情况下,假设进程1和进程2运行于不同的容器,那么进程1和进程2都觉得自己和对方没有半毛钱关系,都觉得自己拥有自己的根文件系统,自己的网卡等,然后进程1和进程2的PID还可以一样,比如假设2个都是100。但是,此100非彼100。
Virtualbox等虚拟机的思路则完全不一样,如果进程1和进程2运行于不同的虚拟机,则操作系统都是双份的,它们感觉自己在不同的虚拟电脑上面跑。
由于可见,Docker达到了类似虚拟机的效果,但是又没有虚拟机的开销,它虚拟的层次更加高。Docker不虚拟机器,仅仅虚拟应用的运行环境。
为什么Docker也可以“虚拟化”?
虚拟化,本质上一种虚幻,给你一种幻觉,让你觉得拥有的很多甚至拥有全世界,哪怕你实际是一只蝼蚁。虚拟化的技术分为2种,一种是虚拟一个世界,第二个是虚拟一个氛围。这个是Virtualbox,KVM这种虚拟出一个新世界的思路。虚拟一个氛围,是Docker的做法
Docker的架构
Docker中可能涉及到3个机器或者更多机器,一个运行Docker命令的client, 一个包含images并以容器(container)形式运行image的主机,一个Docker的images仓库。client与Docker host上面的Docker daemon通信。当然Docker client和host可以运行于一台机器(我们做实验的时候是一台),默认的Docker仓库是Docker Hub。
一般的流程中,client发pull命令从仓库把image拉到Docker host,然后通过run命令指挥image到host上面弄一个container来跑这个image。当然也可以是相反的流程,client 通过build命令在host上面创建一个自己的image,然后通过push命令把image推到仓库。之后这个image可以被别的人或者自己pull。
Docker 环境的快速搭建 centos
linux下安装 Docker
配置阿里云docker 源并安装
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y
设置开机启动Docker Daemon进程
systemctl start docker.service
systemctl enable docker.service
systemctl |grep docker #查看docker进程的状态
systemctl disable firewalld #导致docker不能运行
配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6qcpzbml.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker 1.8 以后对centos6 不支持
Windows 下利用 vagrant 快速安装Docker
1 快速创建虚拟环境:
vagrant init centos7
初始化环境 环境类型(镜像)
然后 就会在当前目录下生成 Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.require_version ">= 1.6.0"
boxes = [
{
:name => "docker-host",
:eth1 => "192.168.205.10",
:mem => "1024",
:cpu => "1"
}
]
Vagrant.configure(2) do |config|
config.vm.box = "centos7"
boxes.each do |opts|
config.vm.define opts[:name] do |config|
config.vm.hostname = opts[:name]
config.vm.provider "vmware_fusion" do |v|
v.vmx["memsize"] = opts[:mem]
v.vmx["numvcpus"] = opts[:cpu]
end
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory", opts[:mem]]
v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
end
config.vm.network :private_network, ip: opts[:eth1]
end
end
config.vm.synced_folder "./labs", "/home/vagrant/labs"
config.vm.provision "shell", privileged: true, path: "./setup.sh"
end
#/bin/sh
# install some tools
sudo yum install -y git vim gcc glibc-static telnet bridge-utils net-tools
# install docker
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
# start docker service
sudo systemctl start docker
rm -rf get-docker.sh
2 添加box
vagrant box add centos7 ./boxes/Centos7.box
直接下载太慢,添加本地镜像到box [镜像路径]
3 vagrant 启动
vagrant up #启动
4 vagrant 连接
vagrant ssh #链接到虚拟机,多个实例时,后面跟虚拟机名称
vagrant status #查看状态
vagrant halt # 关闭虚拟机
vagrant destroy # 删除虚拟机
更多虚拟机镜像下载
其他方法
在 Windows 上通过 docker-machine 创建多个安装了docker的虚拟机
C:\Users\Administrator>docker-machine create demo
更多 docker-machine help
docker-machine 1s # 查看虚拟机
在 aws,阿里云上也有类似服务
在Mac上玩Docker
1.Docker for Mac直接装2.通过Virtualbox或者Vmware虚拟化软件直接创建Linux虚拟机,在虚拟机里安装使用Docker3.通过Vagrant +VirtualBox快速搭建Docker host [推荐]4.通过docker-machine快速搭建Docker host
Windows上玩Docker
1.Docker for windows直接装(对系统要求高至少win10)2.通过Virtualbox或者Vmware虚拟化软件直接创建Linux虚拟机,在虚拟机里安装使用Docker3.通过Vagrant + VirtualBox快速搭建Docker host【推荐】4.通过docker-machine快速搭建Docker host
Linux上玩Docker
1.Linux主机2.Linux虚机(支持虚拟化的任何操作系统或者平台)
Error response from daemon: Get https://192.168.153.129:5000/v2/: http: server gave HTTP response to
私有docker registry,docker pull报错,解决方法:
运行命令:
-
echo '{ "insecure-registries":["xxx.xxx.xxx.xxx:5000"] }' > /etc/docker/daemon.json
-
systemctl restart docker
docker push "server gave HTTP response to HTTPS client"问题解决方案
docker push 镜像到本地镜像仓库时报如下错误:
[root@master registry]# docker push 172.20.120.211:32002/harbor-log The push refers to a repository [172.20.120.211:32002/harbor-log] Get https://172.20.120.211:32002/v1/_ping: http: server gave HTTP response to HTTPS client
解决办法是:
在/etc/docker下,修改daemon.json文件,写入:
{"insecure-registries":["172.20.120.211:32002"]}
重启docker
[root@master docker]# systemctl restart docker.service
重新启动registry。
docker push 成功。
摘抄自网络,便于检索查找。