写点什么

2022-Java 后端工程师必会知识点 -(Docker)

作者:自然
  • 2022 年 8 月 02 日
  • 本文字数:4365 字

    阅读完需:约 14 分钟

叨絮

虽然公司用的都是容器,但是这个是容器组他们负责的,你一个搞业务开发的基本上就没能了解到那么全面了,所以今天小六六跟大家来学习了解了解 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 命令查看你当前的内核版本


 $ uname -r
复制代码


2、使用 root 权限登录 Centos。确保 yum 包更新到最新。


$ sudo yum update
复制代码


3、卸载旧版本(如果安装过旧版本的话)


$ sudo yum remove docker  docker-common docker-selinux docker-engine
复制代码


4、安装需要的软件包, yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的


$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
复制代码


5、设置 yum 源


$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
复制代码


6、可以查看所有仓库中所有 docker 版本,并选择特定版本安装


$ yum list docker-ce --showduplicates | sort -r
复制代码



7、安装 docker


$ sudo yum install docker-ce  #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0$ sudo yum install <FQPN>  # 例如:sudo yum install docker-ce-17.12.0.ce
复制代码



8、启动并加入开机启动


$ sudo systemctl start docker$ sudo systemctl enable docker
复制代码


9、验证安装是否成功(有 client 和 service 两部分表示 docker 安装启动都成功了)


$ docker version
复制代码



10、Docker 镜像加速器对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)


{  "registry-mirrors": [    "https://registry.docker-cn.com"  ]}
复制代码


之后重新启动服务。


$ sudo systemctl daemon-reload$ sudo systemctl restart docker
复制代码

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 有我找的许多的资料送给大家

用户头像

自然

关注

还未添加个人签名 2020.03.01 加入

小六六,目前负责营收超百亿的支付中台

评论

发布
暂无评论
2022-Java后端工程师必会知识点-(Docker)_Docker 镜像_自然_InfoQ写作社区