尚硅谷Docker实战教程学习笔记
我不会设置仅粉丝可见,不需要你关注我,仅仅希望我的踩坑经验能帮到你。如果有帮助,麻烦点个 👍 吧,这会让我创作动力+1 😁
文章目录
写在前面
-
封面 | 摘要 | 关键词
尚硅谷Docker实战教程
docker 李英俊 尚硅谷 -
感想 | 摘抄 | 问题
-
什么是云原生:(我的理解)一切在云端,基于容器开发的都会打包push到registry中,然后pull下来进行使用
-
开发流程:
-
面试题快速跳转:
-
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 gccyum -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 dockeryum remove docker-ce docker-ce-cli containerd.iorm -rf /var/lib/dockerrm -rf /var/lib/containerd
-
阿里云镜像加速
-
是什么:https://promotion.aliyun.com/ntms/act/kubernetes.html
-
注册账户,工具台,容器镜像服务,镜像工具,镜像加速器,获取加速器地址链接: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
📖 参考延申
虚悬镜像可能会在以下几种情况下产生:
- 构建过程中出现错误,导致镜像没有被正确标记。
- 用户忘记为新创建的镜像添加标签。
- 用户试图删除一个正在被使用的镜像,但该镜像仍有其他容器在使用。
虚悬镜像可能会带来一些问题:
- 无法找到正确的镜像版本:当用户试图运行一个虚悬镜像时,他们可能无法确定应该使用哪个版本的镜像。这可能导致应用程序运行在不同的环境中,或者在不同版本的代码上运行,从而导致兼容性问题。
- 无法进行有效的更新:虚悬镜像意味着用户无法对其进行更新。即使镜像内部的版本进行了升级,用户也无法通过简单地添加一个新标签来获取这个新版本的镜像。
- 占用存储空间:虽然虚悬镜像不会立即影响应用程序的运行,但是它们会一直占用存储空间,直到有人为它们添加标签。
如何解决虚悬镜像问题,我们可以采取以下几种方案:
- 检查并重新标记镜像:如果发现虚悬镜像,可以尝试查找出现问题的构建过程,并修复其中的错误。然后为镜像添加一个新的标签,以确保用户能够找到正确的版本。
- 使用Dockerfile:Dockerfile可以帮助我们自动化镜像的构建过程,并确保每次构建的镜像都是正确且可重复的。通过编写详细的Dockerfile,我们可以确保每次构建的镜像都带有正确的标签。
- 定期清理虚悬镜像:Docker提供了一些命令来帮助用户管理虚悬镜像,例如
docker rmi --force可以强制删除虚悬镜像。然而,最好的方法还是定期检查并清理这些无用的虚悬镜像,以节省存储空间。
-
-
容器命令
有镜像才能创建容器,这是根本前提
-
docker run 镜像名:新建+启动容器,启动交互式容器(前台命令行)--name=名字:容器新名字,为容器指定一个名称-d:后台运行容器并返回容器ID,启动守护式容器(后台运行)-i:以交互模式运行容器,通常与-t同时使用-t:为容器重新分配一个伪输入中断,通常与-i同时使用,也称交互式容器(前台有伪终端,等待交互)常用:docker run -it ubuntu /bin/bash(以交互模式启动一个容器,在容器内执行 /bin/bash 命令,退出:exit)-P:随机端口映射,大P-p:指定端口映射,小p。例:-p 6379:6379是指外面访问docker的6379服务(宿主机)被映射到容器内的6379服务(docker )
-
docker ps:列出当前所有正在运行的容器-a:列出当前所有正在运行的容器+历史上运行过的-l:显示最近创建的容器-n:显示最近n个创建的容器-q:静默模式,只显示容器编号
-
容器的退出
exit:run进去的容器,exit退出,容器停止(docker ps就没啦)ctrl+p+q:run进去的容器,ctrl+p+q,容器不停止
-
docker start 容器id/容器名:启动已经停止运行的容器 -
docker restart 容器id/容器名:重启容器 -
docker stop 容器id/容器名:停止容器 -
docker kill 容器id/容器名:强制停止容器 -
docker rm [-f] 容器id/容器名:[强制]删除容器一次性删除多个实例:
docker rm -f $(docker ps -a -q)docker ps -a -q | xargs docker rm
-
-
其他
-
启动守护式容器(后台服务器)
-
在大部分得场景下,我们希望docker的服务是在后台运行的,,我们可以通过
-d指定容器的后台运行模式 -
docker run -d 容器名问题:直接用
docker run 容器名启动后用docker ps -a进行查看发现容器已经退出了,需要注意很重要的一点是,Docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。这是docker的机制问题,最佳的解决方案是:**将你要运行的程序以前台进程的形式运行,常见就是命令行模式
-it**,表示我还有交互操作,别中断。 -
以redis为例,用前台交互式的启动肯定不行:
docker run -it redis;所以要用后台守护式启动:docker run -d redis
-
-
docker log 容器id:查看容器日志 -
docker top 容器id:查看容器内运行的进程 -
docker inspect 镜像名/容器id:查看镜像配置/查看容器内部细节 -
进入正在运行的容器,并以命令行交互
docker exec -it 容器id bashShell- 重新进入还有一个命令:
docker attach 容器id
❓ 上述两个命令的区别?工作中用哪一个?
- attach直接进入容器
-
尚硅谷Docker实战教程学习笔记

最低0.47元/天 解锁文章
1017

被折叠的 条评论
为什么被折叠?



