计算机系统应用教程网站

网站首页 > 技术文章 正文

《docker技术入门与实践》读后小结

btikc 2024-10-14 08:46:54 技术文章 4 ℃ 0 评论

前言

最近书读得不少,但是能进脑子的不多,这本书读完也有两个星期了想着再不拿出来回忆一波就完全白送了。毕竟实战的机会不多,更多的还得靠脑子想。为了看一下自己脑子装的是浆糊还是水,写这篇笔记时尽可能不看资料,不翻原书,纯手工编写,不做CV搬运工。

书评

总的来说这是一本不错的书,应该是一本入门比较好的书籍了(虽然我学得不怎么样...)。单纯看官网的时候一脸懵逼,完全不知道在说什么,看完这本书了之后,至少对docker有了一个较为清晰的认识,相信自己也算是半只脚入了门。

docker简介与核心概念

docker是一个基于linux虚拟化的容器技术。与传统VMware之类基于操作系统的虚化不同,docker提供的是基于应用程序的虚拟化,因此docker无论是性能还是速度都是非常厉害。

docker里面有许多概念,但这些概念与我们常用的技术还是比较相似的,多多少少可以从平常的使用或者看到的内容中看到一些相似的影子。当我们需要安装一个操作系统时,我们通常会使用 “系统镜像”来安装。在docker中也是一样,我们需要运行一个容器,则我们需要先有一个镜像(image) 。镜像想要在互联网上快速分发,就需要一个统一的资源仓库,这个官方的资源仓库就是docker hub。镜像往资源库的上传、下载操作,就像源代码的拉取推送操作。除此之外docker还有文件与网络等一些比较重要的内容。

docker镜像

当我们需要指定一个镜像时,我们需要用仓库+名称+标记来标识,如果是docker官方的仓库则使用名称+标记即可,而标记通常使用的是版本号。当然如果不用版本号也可以,它表示了我们将使用最新版本(latest)。当然docker并不建议使用latest,因为latest代表的永远是最新的版本,这是一个变化的版本,在生产环境中更需要一个稳定的场景。

docker镜像操作非常之多,想要全部精通还是不容易的。沿着增删改查的思路,梳理一下镜像操作。

查询操作

  • docker images 查询镜像列表
  • docker inspect 【IMAGE NAME】查询单个镜像内容

拉取镜像

  • docker pull 【IMAGE】

删除镜像

  • docker rmi 【IMAGE NAME】删除镜像
  • docker image rm 【IMAGE NAME】删除镜像

构建镜像

  • docker build 利用docker file构建镜像

还有一些其它操作,比如说 导入导出用于镜像文件拷贝传递之类操作等等。


docker容器

容器是docker最核心的概念,

查看容器

  • docker ps [-a] 查看所有的容器(-a 可以看到未运行的容器)
  • docker inspect 【CONTAINER NAME】 查看容器的明细信息

启停容器

  • docker start 【CONTAINER NAME】启动容器
  • docker stop 【CONTAINER NAME】停止容器
  • docker run 【IMAGE】 拉取镜像并启动

docker run 是平时自己玩的时候使用最多的命令,从0到1一步到位直接启动容器。

删除容器

  • docker rm 【CONTAINER NAME】

网络

网络是docker在使用中比较重要的部分之一,docker提供了三种网络模式 bridge、host、null,其中host是主机共享模式,也就是直接使用主机网卡与网络;bridge是桥接模式,也是最为常见的一种网络模式。

桥接模式既可以提供网络隔离也可以提供网络共享,因此桥接模式的使用也是最广泛的。

查看网络

  • docker network ls 查看网络列表
  • docker network inspect 【NAME】 查看网络明细

网络隔离的实现

当我们新建一个桥接网络(或者使用默认的桥接网络)时,该网络会分派一段子网ip地址,例如我环境中的docker0的子网为172.17.0.1/16。由于是子网,所以在默认的情况外部是无法访问到该子网的。如果我们建立多个不同的桥接网络时,这些网络也将会相互相互不连通从而达到网络隔离。

每次新建一个容器并使用桥接网络时,docker会分派一对虚拟网卡,进行1对1通讯,一个在容器内部,一个在容器的外部。在容器内外可以通过ip addr命令查看网卡信息,可以看到匹配的网卡。




跨主机互联

桥接模式通过子网的方式提供内部网络,而子网是不能直接与主机外部网络通信的,想要通信则需要网络转发,这也就是nat。nat全名network address tranlation将内部容器对外的请求和外部对内部容器的请求进行翻译处理,例如当子网访外网时,主机的nat将请求的请求ip地址改为了主机的ip地址。

在容器启动时,可以通过参数-P或者-p指定端口,此时会在nat表产生相关的记录。可以通过sudo iptables -t nat -nvL 查看。


文件与数据

除了网络的使用,docker也会使用文件系统。docker是通过UFS(联合文件系统)来实现的文件管理。将文件分为一层一层的,这个从镜像拉取时比较明显。而这些层都是只读的,最后会在上面加上一个可写层构成最终的文件系统。虽然docker的联合文件系统号称高性能,但是跟直接进行文件读写操作性能还是差了太多。

除了性能较差之外,docker容器内部的文件会随着docker容器删除而消息,这对于一些重要的数据文件(比如数据库),是不可接受的。因此docker提供了相应方案可以让文件直接放在主机上,再挂载到容器中,这就是数据卷。

数据卷命令

  • docker volume ls 查看数据卷列表
  • docker volume inspect 【卷ID】 查看卷详细信息
  • docker volume create 创建数据卷
  • docker volume rm 删除数据卷

常规的数据卷的指定在dockerfile中就完成了,不需要启动容器的单独处理。

数据卷数据位置

在主机上数据卷的位置可以从 docker volume inspect中看到,默认为 /var/lib/docker/volumes/{卷ID}/_data 这个路径。而在容器内部的地址则可以通过 docker container inspect 查看容器信息中的mounts节点可以看到。例如mysql,内部映射的地址为 /var/lib/mysql。


结尾

docker的内容很多,留下深刻印象的也就是以上的一些东西了。像仓库与私有化部署、数据卷容器等等之类的东西大多只能记住是干什么的了。而像compose、wasm、k8s之类由于没有实战机会,估计学起来会更加困难了。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表