2022-Java 后端工程师必会知识点 -(Docker)
叨絮
虽然公司用的都是容器,但是这个是容器组他们负责的,你一个搞业务开发的基本上就没能了解到那么全面了,所以今天小六六跟大家来学习了解了解 Docker。
然后下面是前面的文章汇总
大家好,我是小六六,目前在一线互联网公司负责年营收过百亿的支付中台项目,感谢大家的支持,今天我们来看看 Docker
Docker 简介
为啥是 Docker
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验,不知道大家公司是怎么样的,小六六这边就是用的 Docker 容器。
Docker 之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
Docker 的理念
Docker 是基于 Go 语言实现的云开源项目。Docker 的主要目标是 “Build,Ship and Run Any App,Anywhere” ,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的 APP(可以是一个 WEB 应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作
为什么要使用 Docker
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势
更高效的利用系统资源
更快速的启动时间
一致的运行环境
持续交付和部署
更轻松的迁移
对比传统虚拟机总结
Docker 下载
docker 官网:http://www.docker.com
docker 中文网站:https://www.docker-cn.com/
Docker Hub 官网: https://hub.docker.com/
Docker 安装(centos7)
1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本
2、使用 root 权限登录 Centos。确保 yum 包更新到最新。
3、卸载旧版本(如果安装过旧版本的话)
4、安装需要的软件包, yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的
5、设置 yum 源
6、可以查看所有仓库中所有 docker 版本,并选择特定版本安装
7、安装 docker
8、启动并加入开机启动
9、验证安装是否成功(有 client 和 service 两部分表示 docker 安装启动都成功了)
10、Docker 镜像加速器对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
之后重新启动服务。
Docker 镜像
我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也
分层存储
因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
Docker 命令
帮助命令
docker version
docker info
docker --help
镜像命令
docker images(列出本地主机上的镜像)
docker search 某个 XXX 镜像名字 (查找镜像)
docker pull 某个 XXX 镜像名字(下载镜像)
docker rmi 某个 XXX 镜像名字 ID(删除某个镜像)
容器命令
docker run [OPTIONS] IMAGE [COMMAND] (新建并启动容器)
docker ps [OPTIONS] (列出当前所有正在运行的容器)
docker start 容器 ID 或者容器名(启动容器)
docker restart 容器 ID 或者容器名(重启容器)
docker stop 容器 ID 或者容器名(停止容器)
docker kill 容器 ID 或者容器名(强制停止容器)
docker rm 容器 ID(删除已停止的容器)
docker run -d 容器名(启动守护式容器)
docker logs -f -t --tail 容器 ID(查看容器日志)
docker exec -it 容器 ID bashShell (进入正在运行的容器并以命令行交互)
docker cp 容器 ID:容器内路径 目的主机路径(从容器内拷贝文件到主机上)
docker pull 拉取镜像
Docker Client 接受 docker pull 命令,解析完请求以及收集完请求参数之后,发送一个 HTTP 请求给 Docker Server,HTTP 请求方法为 POST,请求 URL 为”/images/create? “+”xxx”;
Docker Server 接受以上 HTTP 请求,并交给 mux.Router,mux.Router 通过 URL 以及请求方法来确定执行该请求的具体 handler;
mux.Router 将请求路由分发至相应的 handler,具体为 PostImagesCreate;
在 PostImageCreate 这个 handler 之中,一个名为”pull”的 job 被创建,并开始执行;
名为”pull”的 job 在执行过程中,执行 pullRepository 操作,即从 Docker Registry 中下载相应的一个或者多个 image;
名为”pull”的 job 将下载的 image 交给 graphdriver;
graphdriver 负责将 image 进行存储,一方创建 graph 对象,另一方面在 GraphDB 中记录 image 之间的关系。
docker run hello-world 运行原理
Docker 数据卷
是什么
Docker 容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了,为了能保存数据在 docker 中我们使用卷。
一句话:有点类似我们 Redis 里面的 rdb 和 aof 文件,也就是我们所说的持久化用的
数据卷的特点
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷
特点:
数据卷可在容器之间共享或重用数据
卷中的更改可以直接生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
容器内添加
直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
DockerFile 添加可在 Dockerfile 中使用 VOLUME 指令来给镜像添加一个或多个数据卷
Dockerfile
是什么
Dockerfile 是用来构建 Docker 镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤
编写 Dockerfile 文件
docker build
docker run
DockerFile 构建过程解析
Dockerfile 内容基础知识
每条保留字指令都必须为大写字母且后面要跟随至少一个参数
指令按照从上到下,顺序执行
#表示注释
每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker 执行 Dockerfile 的大致流程
docker 从基础镜像运行一个容器
执行一条指令并对容器作出修改
执行类似 docker commit 的操作提交一个新的镜像层
docker 再基于刚提交的镜像运行一个新容器
执行 dockerfile 中的下一条指令直到所有指令都执行完成
DockerFile 体系结构
FROM(基础镜像,当前新镜像是基于哪个镜像的)
MAINTAINER(镜像维护者的姓名和邮箱地址)
RUN(容器构建时需要运行的命令)
EXPOSE(当前容器对外暴露出的端口)
WORKDIR(指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点)
ENV(用来在构建镜像过程中设置环境变量)
ADD(将宿主机目录下的文件拷贝进镜像且 ADD 命令会自动处理 URL 和解压 tar 压缩包)
COPY(类似 ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置)
VOLUME(容器数据卷,用于数据保存和持久化工作)
CMD(指定一个容器启动时要运行的命令)
ENTRYPOINT(ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数)
ONBUILD(当构建一个被继承的 Dockerfile 时运行命令,父镜像在被子继承后父镜像的 onbuild 被触发)
本地镜像发布到阿里云
镜像的生成方法
前面的 DockerFile
从容器创建一个新的镜像 docker commit [OPTIONS] 容器 ID [REPOSITORY[:TAG]]
将本地镜像推送到阿里云
阿里云开发者平台https://cr.console.aliyun.com/cn-shanghai/instances/repositories
将镜像推送到 registry
docker login --username=danielyoungchina registry.cn-shanghai.aliyuncs.com
docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]
docker push registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]
从 Registry 中拉取镜像
docker pull registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]
结束
小六六这边给大家整理了下 Docker 的基础知识,因为为啥面试要准备这个呢?我们知道,现在基本上是 k8s 的服务治理,服务的发布基本上是基于容器了,可能在公司用的时候我们很简单,点一下升级按钮就好了,例如下面
但是呢?我们还是需要自己去了解这块东西,这样遇到问题解决起来就会快很多看。
日常求赞
好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是真粉。
创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见
微信 搜 "六脉神剑的程序人生" 回复 888 有我找的许多的资料送给大家
评论