尚硅谷Docker实战教程学习笔记
我从没想过因为即将要学习dockerfile而激动,也因这激动而顿感羞愧。————20241029
目录写在前面
-
封面 | 摘要 | 关键词
尚硅谷Docker实战教程
docker 李英俊 尚硅谷
-
感想 | 摘抄 | 问题
-
什么是云原生:(我的理解)一切在云端,基于容器开发的都会打包push到registry中,然后pull下来进行使用
-
开发流程:
graph LR 编码开发微服务-->上线部署容器化-->时时刻刻要监控-->devops -
面试题快速跳转:
-
1. Docker简介
-
是什么
-
为什么会有docker出现
系统平滑移植,容器虚拟化技术
Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
-
docker的理念
-
Docker是基于Go语言实现的云开源项目
-
Docker的主要目标是:Build, Ship and Run Any App, Anywhere。也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能够做到 一次镜像,处处运行
-
Docker解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
-
-
容器与虚拟机比较
-
虚拟机(virtual machine)就是带环境安装的一种解决方案。
- 缺点:资源占用多,冗余步骤多,启动慢
-
由于前面虚拟机存在缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,LXC)。
-
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
-
Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快,占用体积小。
-
-
总结
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需应用进程;
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便;
- 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
-
-
能干嘛
-
技术职级的变化:coder->programmer->software engineer->DevOps engineer
-
开发/运维(DevOps)新一代开发工程师
-
一次构建、随处运行
- 更快的应用交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算资源利用
-
Docker的应用场景
-
-
-
去哪儿下
- docker官网:http://www.docker.com/
- Docker Hub仓库:http://www.hub.docker.com/,安装docker镜像的仓库
2. Docker安装
-
前提说明
- Docker 并非是一个通用的容器工具,它依于已存在并运行的 Linux 内核环境。
- Docker 实质上是在已经运行的 Linux 下制造了个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。
- 因此
Docker 必须部署在 Linux 内核的系统上,如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。 - 获取系统版本内核:
uname -r
-
docker的基本组成
-
镜像,image 类
Redis r1 = docker run 镜像
类似鲸鱼背上的集装箱,就是一个容器实例
-
容器,container 实例
- 上述的 r1、r2、r3...多个实例
- 容器是用镜像创建的运行实例
- 可以看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
-
仓库,repository 存放镜像的地方
- Maven仓库:放各种jar包
- Github仓库:放各种git项目
- Docker Hub:放各种镜像模板
-
小总结:image文件可以看作是容器的模板,Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。
- docker daemon:真正干活的,通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。
-
-
docker平台架构
-
docker是一个C/S模式的架构,后端是一个松耦合架构,众多模块各司其职
-
Docker运行的基本流程:
- 用户使用Docker Client与Docker Daemon建立通信,并发送请求给后者
- Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能,使其可以接收Docker Client的请求
- Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式存在
- Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动Graph driver将下载镜像以Graph的形式存储
- 当需要为Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境
- 当需要限制docker容器运行资源或者执行用户指令等操作时,则通过Exec driver来完成
- Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作
-
-
安装步骤
- 确定版本
- 卸载旧版本
- yum安装gcc相关
- 能上外网(CentOS7)
yum -y install gcc
yum -y install gcc-c++
- 安装需要的软件包
yum install -y yum-utils
- 配置docker库:
yum-config-manager --add-repo https://xxx
- 推荐使用阿里云的加速:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新yum软件包索引:
yum makecache fast
- 安装docker:
yum install docker-ce docker-ce-cli containerd.io
- 启动docker:
systemctl start docker
- HelloWorld:
docker run hello-world
、docker version
- 本地没有hello-world,则会从远程库拉下来运行
- 卸载:
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
-
阿里云镜像加速
-
注册账户,工具台,容器镜像服务,镜像工具,镜像加速器,获取加速器地址链接:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
# 创建目录,将镜像配置反写回文件 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://[你自己的].mirror.aliyuncs.com"] } EOF # 重启docker sudo systemctl daemon-reload sudo systemctl restart docker
-
测试运行hello-world
-
docker run hello-world
-
run到底干了什么
-
-
底层原理:为什么Docker会比VM虚拟机要快
-
docker有着比虚拟机更少的抽象层
由于docker不需要Hypervisor(虚拟机)实现硬件层面的虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上,docker将会在效率上有明显优势。
-
docker利用的是宿主机的内核,而不需要加载操作系统os内核
当新建一个容器时,docker不需要和和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
docker容器 虚拟机VM 操作系统 与宿主机共享OS 宿主机OS上运行虚拟机OS 存储大小 镜像小,便于存储与运输 镜像庞大(vmdk、vdi等) 运行性能 几乎无额外性能损失 操作系统额外的CPU、内存消耗 移植性 轻便、灵活,适用于Linux 笨重,与虚拟化技术耦合度高 硬件亲和性 面向软件开发者 面向硬件运维者 部署速度 快速,秒级 较慢,10s以上 -
3. Docker常用命令
-
帮助启动类命令
systemctl start docker
:启动dockersystemctl stop docker
:停止dockersystemctl restart docker
:重启dockersystemctl status docker
:查看docker状态systemctl enable docker
:开机启动dockerdocker info
:查看docker概要信息docker --help
:查看docker总体帮助文档docker 具体命令 --help
:查看docker命令帮助文档
-
镜像命令
-
docker images
:列出本地主机上的镜像同一个仓库源可以有多个tag版本,代表这个仓库源的不同的版本,我们使用
REPOSITORY:TAG
来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker将默认使用 ubuntu:latest 镜像。REPOSITORY:表示镜像的仓库源 TAG:镜像的标签 IMAGE ID:镜像ID CREATED:镜像创建时间 SIZE:镜像大小
OPTIONS说明:
-a
:列出本地所有的镜像(含历史镜像层)-q
:;只显示镜像ID
-
docker search 镜像名
:默认是从hub.docker.com
上检索镜像列表,一般选第一个官方认证过的,比较靠谱OPTIONS说明:
--limit
:只列出N个镜像,默认25个,例如docker search --limit 5 redis
-
docker pull 镜像名
:下载镜像,docker pull 镜像名字[:TAG]
,没有tag就下载最新版 -
docker system df
:查看镜像/容器/数据卷所占的空间 -
docker rmi [-f] 镜像名/镜像ID
:[强制]删除镜像- 删除多个镜像:
docker rmi -f id1 name2:tag2
- 删除全部镜像:
docker rmi -f $(docker images -qa)
- 删除多个镜像:
❓ 谈谈docker虚悬镜像是什么?
- 是什么:仓库名、标签都是
的镜像,俗称虚悬镜像 dangling image
-