13 2 2019

docker

容器技术和docker简介

部署演变

  • 在一台物理机部署Application
  • 3台redis部署,可能3台真实机器,3台虚拟机
  • 虚拟化技术——docker是虚拟化技术的一种

容器的必要性

  • 开发人员开发一个Application需要各种环境,各种依赖
  • 运维人员部署Application时也需要搭建各种环境

容器解决的问题

  • 解决了开发和运维之间的矛盾

容器是什么

  • 对软件和其依赖的标准化打包
  • 应用之间相互隔离
  • 共享同一个OS Kernel
  • 可以运行在很多主流操作系统上

虚拟机与容器的区别

  • 虚拟机是物理层面的隔离,容器是Application层面的隔离

docker是什么

  • docker是目前最流行的容器技术的实现
  • 2004~2008年Linux已经出现了LXC,2013年docker包装了LXC,2013年三月开源,2016年docker分为企业版和社区版

docker能做什么

  • 简化配置
  • 提高效率

docker和kubernates

  • docker可以被k8s管理
  • kubernetes,简称k8s

DevOps

  • DevOps ——解决开发和运维间合作和沟通
  • 不仅仅依赖docker,还需要版本管理,持续集成等

docker的应用

  • 在2015年的618大促中,京东大胆启用了基于Docker的容器技术来承载大促的关键业务(图片展现、单品页、团购页),当时基于Docker容器的弹性云项目已经有近万个Docker容器在线上环境运行,并且经受住了大流量的考验
  • 2016年618中,弹性云项目更是担当重任,全部应用系统和大部分的DB服务都已经跑在Docker上,包括商品页面、用户订单、用户搜索、缓存、数据库,京东线上将会启动近15万个Docker容器
  • 京东弹性计算云通过软件定义数据中心与大规模容器集群调度,实现海量计算资源的统一管理,并满足性能与效率方面的需求,提升业务自助上线效率。应用部署密度大幅提升,资源使用率提升,节约大量的硬件资源

docker环境的各种搭建方法

docker的安装介绍

  1. docker在mac系统上安装
  2. docker在windows系统上安装
  3. docker在CentOS系统上安装

更新yum源

删除之前残留的,直接从 运行.txt里复制

安装依赖,直接复制

添加repo,直接复制

列出当前有哪些docker是可以装的

更新成国内云

yum-config-manager --add-repo 

https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装指定版本docker

yum -y install docker-ce-18.06.1.ce-3.el7

启动docker

可以查看进程

设置docker开机自启动

查看版本

实现helloWorld

虚拟机备份

  1. docker在Ubuntu系统上安装
  2. docker-machine的使用
  • Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在虚拟机中安装 Docker
  • 可以通过 docker-machine 命令来管理这些虚拟机和 Docker

docker palyground

  • 直接使用云端的docker

docker的镜像和容器

docker的底层技术实现架构

  • docker提供了打包运行app的平台
  • 将app与底层基础设施隔离

docker engine

  • docker engine是核心,里面有后台进程dockerd,提供了REST API接口,还提供了CLI接口,另外,docker就是一种C/S的架构

整体架构

底层技术支持

  • Namespaces:做隔离,隔离pid net ,隔离后,各个容器是不相干的
  • Control groups:做资源限制,限制容器只用多少内存,或者容器是多少CPU
  • Union file systems:image是分层实现

docker image概述

  • 是文件和meta data的集合
  • 可以从官方拉取现成的镜像

可以看到此时本机的所有镜像

制作baseImage

  • baseImage:基于系统的基础镜像

创建dockerfile

在当前目录,构建镜像

docker build -t gochaochao/hello-world .

可以查看到自己制作的镜像

可以查看镜像的制作过程

将image运行起来

container概念和使用

  • container可以理解为运行时的实例,与image不同
  • image是只读的,container是可读可写的

可以查看本机存在的容器

可以跑起来一个镜像,查看运行时的容器

运行并进入容器

此时,另一个会话是可以查看到正在运行的容器

可以exit退出进入的系统

以下命令,可以删除所有的容器实例

以下命令,可以删除没有在运行的所有的容器

创建Image的两种方式

  • 基于image创建container后,如果在container做了一些变化,例如安装了某个软件,可以将这些改变,commit成一个新的image,也可以简写为docker commit

跑起来一个容器

在里面的centos,安装个软件

退出容器

根据刚才修改后的container,创建一个新的image

  • 使用Dockerfile,通过build制作image,可以简写为docker build

创建Dockerfile,写入如下内容

根据Dockerfile,构建镜像

docker build -t gochaochao/centos-lrzsz-new .

可以查看到新制作的image

推荐第二种方式

Dockerfile详解

  • FROM:从哪开始

FROM centos #使用已有的base image

FROM ubuntu:14:04 #从指定版本开始

FROM scratch # 从头开始,最小可用的系统

  • LABEL:等于是加注释

LABEL name=”sjc”

LABEL version=”1.0”

  • RUN:执行命令,每执行一条RUN,多一个分层,尽量写成一层

RUN yum -y update && yum -y install lrzsz \

net-tools

  • WORKDIR:创建并目录,尽量不要用相对路径

WORKDIR /root #进入/root目录

WORKDIR /test #创建/test目录

WORKDIR demo

RUN pwd #输出当前目录,/test/demo

  • ADD and COPY:将本地文件,添加到image里

ADD:将本地文件添加进容器,并且可以解压

COPY:没有解压功能

ADD tt.py /

ADD tt.py.gz /

WORKDIR /root

COPY tt.py test/ #最终会放到如下目录: /root/test/tt.py

  • ENV:环境变量,增加Dockerfile的可读性

官方的mysqli里这么用:

ENV GOSU_VERSION 1.7 # 将1.7定义为一个常量,便于维护

  • CMD and ENTRYPOINT

Dockerfile——CMD vs ENTRYPOINT

  • Shell和Exec格式
  • ENTRYPOINT与CMD

分享docker image

  • image名字一定要以自己docker hub的用户名开头

分享Dockerfile

  • docker image不如分享Dockerfile,更加安全

搭建私有docker registry

  • github是公开的,也可以创建自己的私有仓库

Dockerfile案例

  • 创建一个python的web应用,然后打包成docker image运行

运行中对container操作

  • exec命令用于调用并执行指令的命令

Dockerfile案例2

  • 快速搭建stress

对容器资源限制

  • 对内存的限制
  • 对CPU的限制

docker的网络

网络分类

  • 单机

    • Bridge Network
    • Host Network
    • None Network
  • 多机

    • Overlay Network

Linux网络命名空间namespace

  • 命名空间是docker底层重要的概念

Bridge详解

  • 进行多容器通信

容器通信

  • 有时写代码时,并不知道要请求的IP地址

端口映射

  • 实现外界访问

网络的none和host

  • none应用场景:安全性要求极高,存储绝密数据等
  • host网络类似于NAT

多容器部署和应用

  • flask做web服务,redis做自增

多机器多容器通信

  • 例如一台做redis,一台做web处理
  • app.py

from flask import Flask

from redis import Redis

import os

import socket

app = Flask(name)

redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)

\@app.route('/')

def hello():

redis.incr('hits')

return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())

if _name_ == "main":

app.run(host="0.0.0.0", port=5000, debug=True)

  • Dockerfile

FROM python:2.7

LABEL maintaner="sjc_job\@126.com"

COPY . /app

WORKDIR /app

RUN pip install flask redis

EXPOSE 5000

CMD [ "python", "app.py" ]

overlay网络和etcd通信

  • 多机多容器部署时,需要保证地址不冲突

docker的持久化存储和数据共享

数据持久化引入

  • 容器中数据存在丢失的风险

数据持久化方案

  • 基于本地文件系统的Volume
  • 基于plugin的Volume

Volume的类型

  • 受管理的data Volume:由docker后台自动创建
  • 绑定挂载的Volume:具体挂载位置可以由用户指定

数据持久化——data Volume

数据持久化——bind mouting

  • 可以指定一个与容器同步的文件,容器变化,文件同步变化

docker Compose多容器部署

docker部署wordpress

  • wordpress是一个博客网站

docker compose介绍

  • 多容器的APP很难部署和管理,docker compose就类似于批处理

docker compose安装和使用

  • 安装后需要赋权限
  • 用docker-compose的方式部署wordpress

version: '3'

services:

wordpress:

image: wordpress

ports:

- 80:80

environment:

WORDPRESS_DB_HOST: mysql

WORDPRESS_DB_PASSWORD: admin

networks:

- my-bridge

mysql:

image: mysql:5.5

environment:

MYSQL_ROOT_PASSWORD: admin

MYSQL_DATABASE: wordpress

volumes:

- mysql-data:/var/lib/mysql

networks:

- my-bridge

volumes:

mysql-data:

networks:

my-bridge:

driver: bridge

容器扩展和负载均衡

  • 容器扩展
  • 负载均衡

复杂应用部署

  • 6-5项目部署

容器编排docker Swarm

编排swarm简介

  • 服务创建和调度
  • 在swarm manage做决策,决定将worker部署到哪里

三节点swarm集群的搭建

创建维护Service并扩展

使用DockerStack部署VotingApp

使用DockerStack部署可视化应用

使用并管理DockerSecret

更新service版本

docker Cloud和docker企业版

docker公司业务介绍

docker cloud自动化构建

  • 是docker公司第一个CaaS(container-as-a-service)产品,提供容器服务的,是在PaaS(类似于阿里云)之上的,就算在云上搭建docker服务
  • 是提供容器的管理、编排、部署的托管服务
  • docker公司2015年收购了tutum公司,将tutum改装成了docker cloud
  • docker cloud提供的主要模块如下:

  • 使用docker cloud时,需要与github账号关联

docker企业版的在线使用

  • 在线试用时间太短,下面用本地试用的方式

阿里云部署容器

  • 点击立即开通

  • 可以直接支付宝登录

  • 授权

  • 注册

  • 立即开通,可能需要实名认证

  • 成功开通

  • 同意授权

阿里云部署dockerEE

容器编排Kubernetes

  • Kubernetes是Google开源的容器集群管理系统,可能被墙,所以要科学上网
  • 简称k8s,2017年底,docker宣布支持k8s,宣布了k8s取得了阶段性胜利
  • 2014年7月,Docker收购Orchard Labs,由此Docker公司开始涉足容器编排领域,Orchard Labs这家2013年由两位牛逼的年轻人创建的公司,有一个当时非常著名的容器编排工具fig,而这个fig就是docker-compose的前身
  • 2015年初,Docker发布Swarm,开始追赶Kubernetes的脚步,正式进入容器编排领域,与k8s竞争
  • 2017年3月,Docker公司宣布Docker企业版诞生,自此开始区分社区版和企业版,从2016年到2017年初,Docker公司的一些列动作充分展示了一个创业公司的盈利压力。Docker公司的一系列努力,并没有能让Docker Swarm走上容器编排的巅峰,相反,Kubernetes因为其优秀的架构和健康的社区环境,得到迅速发展,在生产环境中得到了广泛的应用,然后用户反馈,社区回应,良性循环了下去。2017年各大厂商都开始拥抱Kubernetes,亚马逊AWS,Microsoft Azure,VMware, 有的甚至抛弃了自家的产品
  • 2017年底,Docker宣布在自家企业版里支持Kubernetes,和Swarm一起作为容器编排的解决方案供用户选择
  • 在容器底层技术领域,Docker还是老大,Kubernetes底层更更多的还是选择使用containerd

  • swarm的架构

  • k8s的架构,主称为master,从称为node

  • k8s的master节点,API Server是对外的,可以通过UI访问,Scheduler是调度模块,Controller是控制模块,etcd就是分布式存储,存储k8s整个的状态和配置

  • k8s的node节点,pod是容器中调度的最小单位,指具有相同namespace的container的组合,kubelet类似于代理,可以做创建容器的管理,kube-proxy和网络有关,做端口代理和转发,Fluentd是做日志的采集、存储和查询

  • k8s整体架构

延伸阅读
    < /body> < /html>