从本文起,记录一些学习微信公众号CloudMan的Docker的文章。
本文是第一篇 《Docker基本概念与快速入门》
1. 快速入门
安装和更新docker时,可能要把防火墙、安全卫士等关闭。
Architecture
docker client —> docker host <–> Docker Hub
- docker client: run docker commands
- docker host: run containers which loads images
- Docker Hub: docker repository
Typical way
client:
- docker pull: pull image from Docker Hub to docker host
- docker run: run a container to load this image
client:
- docker build: create a new image
- docker push: push this image to repository
Concepts
Docker Image
Docker镜像是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
可以理解为一个预配置的系统光盘,插入电脑后就可以启动一个操作系统。当然由于是光盘,所以你无法修改它或者保存数据,每次重启都是一个原样全新的系统。Docker 里面镜像基本上和这个差不多。
使用实例
挂载
docker run -it -v [host_dir]:[container_dir]
将D:\挂载到/home/www
docker run -it -v D::/home/www –rm ubuntu:16.04
2. 容器生态系统
容器生态系统: (核心技术、平台技术、支持技术)
容器核心技术
- 容器规范
runtime spec
image format spec - 容器runtime
runtime 是容器真正运行的地方。runtime 需要跟操作系统 kernel 紧密协作,为容器提供运行环境。
容器好比是Java程序,runtime则好比是JVM. JVM 为 Java 程序提供运行环境。同样的道理,容器只有在 runtime 中才能运行。
包括:lxc、runc、rkt - 容器管理工具
对内与 runtime 交互,对外为用户提供 interface,比如 CLI。
包括:lxd、docker engine(daemon, cli)、rkt cli - 容器定义工具
允许用户定义容器的内容和属性,这样容器就能够被保存,共享和重建。
包括:docker image、dockerfile、ACI(App Container Image)
docker image 是 docker 容器的模板,runtime 依据 docker image 创建容器。
dockerfile 是包含若干命令的文本文件,可以通过这些命令创建出 docker image。
ACI (App Container Image) 与 docker image 类似,不过它是由 CoreOS 开发的 rkt 容器的 image 格式。 - Registries
容器是通过 image 创建的,需要有一个仓库来统一存放 image,这个仓库就叫做 Registry
常见的Registry有:Docker Registry、Docker Hub、Quay.io - 容器OS
容器 OS 是专门运行容器的操作系统。与常规 OS 相比,容器 OS 通常体积更小,启动更快。因为是为容器定制的 OS,通常它们运行容器的效率会更高。
常见的容器OS有:CoreOS、atomic、ubuntu core
- 容器规范
容器平台技术
容器编排引擎
所谓编排(orchestration),通常包括容器管理、调度、集群定义和服务发现等。
通过容器编排引擎,容器被有机的组合成微服务应用,实现业务需求。
主流的包括:- docker swarm是 Docker 开发的容器编排引擎
- kubernetes 是 Google 领导开发的开源容器编排引擎,同时支持 Docker 和 CoreOS 容器
- mesos 是一个通用的集群资源调度平台,mesos 与 marathon 一起提供容器编排引擎功能
容器管理平台
容器管理平台是架构在容器编排引擎之上的一个更为通用的平台。
通常容器管理平台能够支持多种编排引擎,抽象了编排引擎的底层实现细节,为用户提供更方便的功能,
比如 application catalog 和一键应用部署等。
Rancher 和 ContainerShip 是容器管理平台的典型代表。基于容器的PaaS
基于容器的 PaaS 为微服务应用开发人员和公司提供了开发、部署和管理应用的平台,
使用户不必关心底层基础设施而专注于应用的开发。
Deis、Flynn 和 Dokku 都是开源容器 PaaS 的代表。
容器支持技术
容器网络
用户需要专门的解决方案来管理容器与容器,容器与其他实体之间的连通性和隔离性。
docker network 是 Docker 原生的网络解决方案。
另外还有第三方开源解决方案,如 flannel、weave、calico服务发现
当负载增加时,集群会自动创建新的容器;负载减小,多余的容器会被销毁。
容器也会根据 host 的资源使用情况在不同 host 中迁移,容器的 IP 和端口也会随之发生变化。
服务发现技术,就是让 client 能够知道如何访问容器提供的服务。
服务发现会保存容器集群中所有微服务最新的信息,比如 IP 和端口,并对外提供 API,提供服务查询功能。
etcd、consul、zookeeper 是服务发现的典型解决方案。监控
docker ps/top/stats 是 Docker 原生的命令行监控工具。
除了命令行,Docker 也提供了 stats API,用户可以通过 HTTP 请求获取容器的状态信息。
sysdig、cAdvisor/Heapster、Weave Scope 是其他开源的容器监控方案。数据管理
容器经常会在不同的 host 之间迁移。
如何保证持久化数据也能够动态迁移,是 Flocker 这类数据管理工具提供的能力。日志管理
docker logs 是 Docker 原生的日志工具。
而 logspout 对日志提供了路由功能,它可以收集不同容器的日志并转发给其他工具进行后期处理。安全性
OpenSCAP 能够对容器镜像进行扫描,发现潜在的漏洞。
3. 运行第一个容器(在CentOS上)
安装文档:
https://docs.docker.com/engine/installation/linux/docker-ce/centos/
主要步骤:
yum remove docker docker-common container-selinux docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce
systemctl start docker
docker -v
Docker version 17.03.1-ce, build c6d412e
docker info
docker run hello-world
道云镜像加速
道云主页点击右上角的加速器,进入网址:https://www.daocloud.io/mirror#accelerator-doc
另一个实验
运行:
docker run -d -p 80:80 httpd
在浏览器上键入: http://
即可看见: It Works!
4. 容器架构
为什么需要容器?容器到底解决的是什么问题?
简要的答案是:容器使软件具备了超强的可移植能力。
Docker 服务器
Docker daemon 运行在 Docker host 上,负责创建、运行、监控容器,构建、存储镜像。
默认配置下,Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听,步骤如下:
1. 编辑配置文件 /etc/systemd/system/multi-user.target.wants/docker.service,
在环境变量 ExecStart 后面添加 -H tcp://0.0.0.0,允许来自任意 IP 的客户端连接。
重启Docker daemon
systemctl daemon-reload
systemctl restart docker假设服务器IP为192.168.50.2,在客户端的命令行里加上 -H 参数,即可与远程服务器通信。
比如:docker -H 192.168.50.2 info
Docker镜像
将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile,
通过执行 docker build 命令可以构建出 Docker 镜像。
Docker容器
Docker 容器就是 Docker 镜像的运行实例。
docker images 可以查看到 httpd 已经下载到本地。
docker ps 或者 docker container ls 显示容器正在运行。