Video Reference:【Docker教程】真上头,七天看完了价值2W的100集Docker容器践行DevOps理念教程,系统学习根本停不下来_哔哩哔哩_bilibili
1 Docker 简介

1.1 到底什么是Docker?

虚拟机技术经过几年的发展现在基本上是深入人心,通过虚拟化技术,可以通过创建虚拟机的方式让不同的应用运行在不同的虚拟机里面实现应用的运行时环境的隔离。
容器技术同样也可以做到应用的隔离,而且容器的速度要比虚拟机技术更加的方便,更加的小巧;因为在容器技术中并不需要虚拟化这一层以及GuestOS(即虚拟机的操作系统);是直接在本地的操作系统之上实现的APP的一个隔离。
1.2 Docker 能干什么?
- 简化配置
- 代码流水线管理
- 提高开发效率
- 隔离应用
- 整合服务器
- 调试能力
- 多租户
- 快速部署
1.3 容器时代的”双城记”
- Docker:

- Kubernetes:

Kubernetes 是一个容器编排的工具,所谓的容器编排就是对容器的创建管理调度运维等。在生产环境中一般会有成千上万的容器需要去维护创建,也就需要容器编排工具去帮助管理员做这个事情。当然容器编排工具不只有Kubernetes,例如:Docker Swarm,Mesos。
1.4 DevOps
DevOps =文化+过程+工具

1.5 课程章节和内容介绍
- 第一章:容器技术和Docker简介
- 第二章:Docker环境的各种搭建方法
- 第三章:Docker的镜像和容器
- 第四章:Docker的网络
- 第五章:Docker的持久化存储和数据共享
- 第六章:Docker Compose多容器部署
- 第七章:容器编排Docker Swarm
- 第八章:DevOps初体验——Docker Cloud和Docker企业版
- 第九章∶容器编排Kubernetes
- 第十章:容器的的运维和监控
- 第十一章:Docker+DevOps实战——过程和工具
- 第十二章∶总结
1.6 架构

2 Long Long Time Ago
2.1 传统技术

- 部署非常慢
- 成本非常高
- 资源浪费
- 难以迁移和扩展
- 可能会被限定硬件厂商
:::color2 ** 部署慢(在安装物理机时要对主机进行存放,运行tomcat,必须安装jvm等)
** 成本高 (一个外网的应用服务器,进行采购价格都很高)
** 资源浪费 (资源不平衡,比如一个应用是计算密集型的,那么对cpu的要求很高,对内存磁盘资源要求不高,这样闲置的内存和磁盘无法被其他应用使用)
** 难以扩展和迁移(要进行横向扩展,比如要进行win到linux平台的应用迁移,难以扩展)
** 受限于硬件:比如早期的solaris有自己的硬件配置,在sloris上开发的应用很难直接在window上使用,虽然JVM技术出现后,受制于硬件的情况减少了,但是JVM也有自己的局限性,要解决受制于硬件的问题,需要搭建立一套统一的标准,但是硬件依然很难解决。
:::
2.2 虚拟化技术出现以后

虚拟化技术就是在原先的物理服务器上通过一层Hypervisor虚拟化层(作用就是做物理资源的虚拟化,物理资源例如CPU资源,内存资源,磁盘资源等),在虚拟化层之上安装操作系统Guest OS。[ 虚拟化层可以做物理资源的限定,引擎的调度,从而实现物理资源利用率的最大化 ]
- 一个物理机可以部署多个APP
- 每个APP独立运行在一个VM里
:::color2 虚拟化的优点
:::
资源池:一个物理机的资源分配到了不同的虚拟机里
很容易扩展:加物理机器or加虚拟机
很容易云化:亚马逊AWS,阿里云等
:::color2 虚拟化的局限性
:::
每一个虚拟机都是一个完整的操作系统,要给其分配资源,当虚拟机数量增多时,操作系统本身消耗的资源势必增多
:::color2 ** 多部署: 在一台物理主机上可以创建多个虚拟机,每个虚拟机之间都有自己独立的资源,彼此独立,互不影响。
** 资源池: 虚拟化技术可以将主机的硬件资源看成一个池子。当前的物理机有自己的物理硬件,在硬件资源上有自己的操作系统,在操作系统上有一个组件Hypervisor,这个组件可看称是虚拟机和主机操作系统之前的桥梁,它可以对虚拟机资源进行分配,并对虚拟机进行管理。VMWAre就是典型的使用Hypervisor实现的一个产品。VMWare启动后Hypervisor,就会对主机上的所有资源进行统计,当创建新的虚拟机时,由Hypervisor为它分配资源。
** 资源隔离: 当Hypervisor为这个虚拟机分配了资源后,这个资源就是这个虚拟机独享的,其他的资源不会去抢占
** 很容易扩展: 当虚拟机的内存不够时,Hypervisor直接从资源池里直接分配就行。
VM需要安装操作系统: 比如一个很小的应用,可能只需要一个几百k的内存就行,但是为了支撑这个应用,需要安装操作系统,但是操作系统占用测内存和硬件资源比这个应用多得多,在操作系统层面也浪费了很多资源。:::
2.3 开发和运维面临的挑战

如上图,线上是开发人员所使用的技术和环境,如api节点,分析数据库,队列,用户数据库,静态网站等,下面是运维人员使用的环境,如服务器,各种中间间等。开发人员在开发完后,准备上线,需要将应用打包,数据库导出数据,各种配置文件整理后给运维,运维根据安装文档在各节点进行安装部署。假设有一个参数配置出错,都是导致整体的应用部署失败。
如果开发人员将所有内容和资源都打包成一个文件,运维直接将文件展开后就可以轻松部署,那就可以使用容器化技术了。容器化技术可以提供标准化的应用部署方案,通过容器编排工具可以自动将容器发布到集群各个节点上,自动运行,真正做到一间发布,容器编排工具还可以提供管理功能,当其中一个节点失败了,可以直接进行重新发布,减少运维人工成本。它不仅是一个技术的变化,还有软件开发流程中的一个根本性变化。
:::color2 标准化的应用打包如何做到的?
:::
容器是一个文件,也是一种标准化的部署方式,针对这个容器,它要做的事就是将所有软件运行的资源,比如数据库,队列信息等都放入容器中,运行这个程序的底层硬件资源也放入其中,也就是容器中包含了所有运行的必要条件,只要将这个容器在部署服务器直接展开就能运行。
3 容器引擎 Docker
3.1 容器解决了什么问题?

解决了开发和运维之间的矛盾
在开发和运维之间搭建了一个桥梁,是实现devops的最佳解决方案
3.2 什么是容器?

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

虚拟机中需要安装Guest OS(客户操作系统)才能构建应用,左侧容器化技术,Docker是容器化技术最典型的代表产品,应用直接通过Docker的沙箱机制构建在主操作系统上,应用程序的部署速度和占用资源都小得多。容器化技术比虚拟机更灵活,更小。
现在一般是虚拟化技术和容器化技术结合使用,因为它们解决的问题不同,虚拟机更多是物理资源层面的隔离,如分配多少内存等,而容器是App层面的隔离,底层的硬件资源是共享的。
3.4 虚拟化+容器

虚拟化技术和容器技术可以结合一起使用,先在底层物理资源之上做虚拟化(通过Hypervisor虚拟化)创建VM(安装Linux操作系统),在VM安装容器引擎Docker。
3.5 Docker - 容器技术的一种实现

容器化技术最早在2014年提出,在Solaris系统中提供了容器化技术。2008年Linux也提供了容器化的支持,代号为LXC1.0,是docker的前身。在2013年Docker的创始人Solomon Hykes开始在项目中使用Dcoker,同年进行了开源。2016年进行版本变更,拆分为CE(社区版,免费)和EE(企业版,收费)两个子版本。直到今天Docker成为了容器化技术的代名词。
Docker的官网了解详细: https://www.docker.com/
Docker的官方文档: https://docs.docker.com/
3.6 容器化技术的应用场景
- 标准化的迁移方式 : 开发直接打包,运维直接展开使用
- 统一的参数配置: 与应用程序相关的参数配置,在开发打包时就已配置
- 自动化部署: 镜像还原过程自动完成
- 应用集群监控: Docker和K8s都有监控的职能呢个,可以及时监控应用的运行状况。
- 开发与运维之间的沟通桥梁
3.7 Docker 魅力初体验
范例:一键安装Docker-Compose脚本
#!/bin/bashDOCKER_VERSION="20.10.10"#UBUNTU_DOCKER_VERSION="5:${DOCKER_VERSION}~3-0~`lsb_release -si`-`lsb_release -cs`"DOCKER_COMPOSE_VERSION=1.29.2DOCKER_COMPOSE_FILE=docker-compose-Linux-x86_64COLOR_SUCCESS="echo -e \\033[1;32m"COLOR_FAILURE="echo -e \\033[1;31m"END="\033[m". /etc/os-releasecolor () {RES_COL=60MOVE_TO_COL="echo -en \\033[${RES_COL}G"SETCOLOR_SUCCESS="echo -en \\033[1;32m"SETCOLOR_FAILURE="echo -en \\033[1;31m"SETCOLOR_WARNING="echo -en \\033[1;33m"SETCOLOR_NORMAL="echo -en \E[0m"echo -n "$1" && $MOVE_TO_COLecho -n "["if [ $2 = "success" -o $2 = "0" ] ;then${SETCOLOR_SUCCESS}echo -n $" OK "elif [ $2 = "failure" -o $2 = "1" ] ;then${SETCOLOR_FAILURE}echo -n $"FAILED"else${SETCOLOR_WARNING}echo -n $"WARNING"fi${SETCOLOR_NORMAL}echo -n "]"echo}install_docker(){if [ $ID = "centos" -o $ID = "rocky" ];thenif [ $VERSION_ID = "7" ];thencat > /etc/yum.repos.d/docker.repo <<EOF[docker]name=dockergpgcheck=0#baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/EOFelsecat > /etc/yum.repos.d/docker.repo <<EOF[docker]name=dockergpgcheck=0#baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/8/x86_64/stable/baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/8/x86_64/stable/EOFfiyum clean all${COLOR_FAILURE} "Docker有以下版本"${END}yum list docker-ce --showduplicates${COLOR_FAILURE}"5秒后即将安装: docker-"${DOCKER_VERSION}" 版本....."${END}${COLOR_FAILURE}"如果想安装其它Docker版本,请按ctrl+c键退出,修改版本再执行"${END}sleep 5yum -y install docker-ce-$DOCKER_VERSION docker-ce-cli-$DOCKER_VERSION \|| { color "Base,Extras的yum源失败,请检查yum源配置" 1;exit; }elsedpkg -s docker-ce &> /dev/null && $COLOR"Docker已安装,退出" 1 && exitapt update || { color "更新包索引失败" 1 ; exit 1; }apt -y install apt-transport-https ca-certificates curl software-properties-common || \{ color "安装相关包失败" 1 ; exit 2; }curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -add-apt-repository "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"apt update${COLOR_FAILURE} "Docker有以下版本"${END}apt-cache madison docker-ce${COLOR_FAILURE}"5秒后即将安装: docker-"${UBUNTU_DOCKER_VERSION}" 版本....."${END}${COLOR_FAILURE}"如果想安装其它Docker版本,请按ctrl+c键退出,修改版本再执行"${END}sleep 5apt -y install docker-ce=${UBUNTU_DOCKER_VERSION} docker-ce-cli=${UBUNTU_DOCKER_VERSION}fiif [ $? -eq 0 ];thencolor "安装软件包成功" 0elsecolor "安装软件包失败,请检查网络配置" 1exitfimkdir -p /etc/dockertee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://po13h3y1.mirror.aliyuncs.com","http://hub-mirror.c.163.com","https://mirror.ccs.tencentyun.com","http://f1361db2.m.daocloud.io"],"insecure-registries": ["harbor.kubesphere.com:80"]}EOFsystemctl daemon-reloadsystemctl enable dockersystemctl restart dockerdocker version && color "Docker 安装成功" 0 || color "Docker 安装失败" 1echo 'alias rmi="docker images -qa|xargs docker rmi -f"' >> ~/.bashrcecho 'alias rmc="docker ps -qa|xargs docker rm -f"' >> ~/.bashrc}install_docker_compose(){if [ $ID = "centos" -o $ID = "rocky" ];then${COLOR_SUCCESS}"开始安装 Docker compose....."${END}sleep 1if [ ! -e ${DOCKER_COMPOSE_FILE} ];thencurl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/${DOCKER_COMPOSE_FILE} -o /usr/bin/docker-compose# curl -L https://get.daocloud.io/docker/compose/releases/download/v2.12.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-composeelsemv ${DOCKER_COMPOSE_FILE} /usr/bin/docker-composefichmod +x /usr/bin/docker-composeelseapt -y install docker-composefiif docker-compose --version ;then${COLOR_SUCCESS}"Docker Compose 安装完成"${END}else${COLOR_FAILURE}"Docker compose 安装失败"${END}exitfi}install_dockerinstall_docker_compose
:::color1
传统方式部署博客:- 下载程序,安装数据库,配置……
- compose 应用 => 一键启动
:::
#创建一个项目的文件夹(这就是项目名project)$ mkdir /opt/my_wordpress ; cd /opt/my_wordpress$ vim docker-compose.ymlversion: "3.9"services:db:# We use a mariadb image which supports both amd64 & arm64 architectureimage: mariadb:10.6.4-focal# If you really want to use MySQL, uncomment the following line#image: mysql:8.0.27command: '--default-authentication-plugin=mysql_native_password'volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:- MYSQL_ROOT_PASSWORD=somewordpress- MYSQL_DATABASE=wordpress- MYSQL_USER=wordpress- MYSQL_PASSWORD=wordpressexpose:- 3306- 33060wordpress:image: wordpress:latestports:- 80:80restart: alwaysenvironment:- WORDPRESS_DB_HOST=db- WORDPRESS_DB_USER=wordpress- WORDPRESS_DB_PASSWORD=wordpress- WORDPRESS_DB_NAME=wordpressvolumes:db_data:#启动项目#-d 后台运行#不加 -d 就是默认前台启动$ docker-compose up -d$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES70d3fc3fbb45 wordpress:latest "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp my_wordpress-wordpress-1459eccc745ed mariadb:10.6.4-focal "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp my_wordpress-db-1$ docker port my_wordpress-wordpress-180/tcp -> 0.0.0.0:8080/tcp -> :::80

http://:80 后续的操作就是 WordPress 根据引导进行部署即可



:::color1
目前的IT主流的技术:Linux + Docker + Kubernetes(掌握) 掌握的技术:Docker 基础、原理、网络、服务、集群、错误排查、日志:::
