📚读书笔记:docker入门

type
status
date
slug
summary
tags
category
icon
password

1. 学习内容

2. Docker 概述

  • Docker 公司发展历程
  • 和 Google 的爱恨情仇
  • Docker 与 CNCF 的关系

3. Docker 安装

3.1. 基本组成

三大基本概念:容器、镜像、仓库

3.2. 安装方法

3.2.1. 官网文档

3.2.2. 发行版安装

  • CentOS
  • Ubuntu

3.3. 二进制安装

3.4. 卸载

3.5. 阿里云安装

3.5.1. 官方脚本安装

3.5.2. 手动安装

  • CentOS
  • Ubuntu
此外,阿里云还有 镜像加速 功能,需要账号并登录。

3.6. 安装检测

3.7. 底层原理

  • docker 为什么比 VM 快
  • docker 与虚拟机的区别

4. Docker 常用命令

4.1. 帮助命令

  • docker 命令
  • docker version
  • docker info
  • docker 命令 --help
  • 官网 https://docs.docker.com/engine/reference/commandline

4.2. 镜像命令

docker images:查看当前镜像
docker search:搜索镜像
docker pull:拉取镜像
docker rmi:删除镜像
比如:递归删除 docker 镜像 => docker rmi -f $(docker images -qa)

4.3. 容器命令

docker run:运行命令
docker ps:查看命名
docker stop:停止容器
docker rm:删除容器

4.4. 其他常用命令

docker run -d:后台运行
docker logs -t --tail n ID:获取容器日志
docker top ID:获取容器进程
docker inspect ID:获取容器元数据
docker exec -it ID /bin/bash:进入正在运行的容器并执行 bash
docker attach ID:直接进入正在运行的容器
docker cp ID:/容器内文件 /主机路径:从容器中复制文件到宿主机
docker stats:查看容器状态
docker history:查看镜像构建历史

4.5. 可视化

  • portainer
  • Rancher

4.5.1. 什么是 portainer

图形化 Docker 管理工具,提供一个后台面板供我们操作!
访问 http://localhost:8088 即可,首次访问需要注册。

5. Docker 镜像

5.1. 镜像是什么

程序以及它所需的环境、运行库一块打包。

5.2. Docker镜像加载原理

  • UnionFS(联合文件系统)
  • Docker 镜像加载原理

5.3. 分层理解

docker 镜像每一层都是只读的,当 run 起来之后,会新建一个可读写的容器层,用户所有操作都是基这个层的。

5.4. Commit 镜像

6. 容器数据卷

6.1. 概念

满足对数据持久化和同步操作需求,将容器内目录挂载到宿主机上的一种技术,容器间也是可以数据共享的。

6.2. 使用数据卷

例如,将 CentOS 的 home 目录挂载到本地 /home/ceshi 目录:

6.3. 匿名挂载

当不指定主机路径时,采用的是匿名挂载:

6.4. 具名挂载

当提供卷名而不是路径时:

6.5. 物理路径

如果没有明确指定挂载目录,默认挂载目录可以通过 inspect 查看,默认在 /var/lib/docker/volumes 下:
  • v 容器内路径:读写属性 ===>>> 匿名挂载
  • v 卷名:容器内路径:读写属性 ===>>> 具名挂载(最常用)
  • v /宿主机路径:容器内路径:读写属性 ===>>> 指定目录挂载
读写属性默认 rw,可以指定 ro;指定 ro 则数据卷必须有宿主机操作。

6.6. 数据卷容器

使用 --volumes-from 将容器的卷挂载到另一个容器上,是一个双向拷贝的过程。比如使用两个容器共享数据库:

6.7. 结论

容器之间的信息传递,数据卷容器的生命周期一直持续到没有容器使用为止。
一旦持久化到本地,将不会随容器销毁而删除。

7. Dockerfile

Dockerfile 就是构建 docker 的脚本。

7.1. 构建步骤

  1. 编写一个 dockerfile 文件,如果默认文件名为 Dockerfile,可不指定 -f 参数;
  1. docker build 成为一个镜像;
  1. docker run 运行镜像;
  1. docker push 发布镜像;

7.2. 基础知识

  1. 每个保留关键字必须大写;
  1. 执行从上到下的程序;
  1. #标识注释;
  1. 每条指令都会创建一个新的镜像层并提交;

7.3. 常用指令

  1. FROM:基础镜像
  1. MAINTAINER:维护者信息
  1. RUN:执行的操作
  1. ADD:添加内容,会自动解压
  1. WORKDIR:镜像的工作目录
  1. VOLUME:挂载的目录
  1. EXPOST:保留端口的配置
  1. CMD:启动时要运行的命令,只有最后一个生效
  1. ENTRYPOINT:启动时要运行的命令,可追加
  1. ONBUILD:当构建一个被继承的 Dockerfile 就会运行这个 ONBUILD
  1. COPY:类似 ADD,拷贝到容器中
  1. ENV:构建镜像时候的环境变量

7.4. 实战 1:简单测试

Dockerfile 名字可以随意,但是建议使用 Dockfile。

7.5. 实战 2:规范格式

尝试构建:

7.6. 实战 3:tomcat 应用

制作 Tomcat 镜像制作。
  • 准备必要文件
首先下载必要的文件,包括:apache-tomcat-9.0.22.tar.gz,jdk-8u11-linux-x64.tar.gz。
创建说明文件 readme.txt,以及 Dockerfile 文件
  • Dockerfile 文件内容
  • 构建
由于 dockerfile 文件名是 Dockerfile,所以省略 -f DOCKER_FILE_PATH 参数
  • 运行
curl localhost:9090
  • 测试
可以编写一个 index.jsp,然后输出日志。通过浏览器访问,查看是否有日志打印。

7.7. 发布镜像

  1. 注册一个自己的账号: https://hub.docker.com
  1. 有密码且可以登录
docker login -u USERNAME
  1. 推送镜像,最好带上版本号
docker push DOCKER_ID/tomcat:0.1

8. Docker 网络

8.1. docker0 网络详解

结论:
Docker 使用的是 Linux 的桥接,宿主机中是一个 Docker 容器的网桥 docker0,最多可以分配 65535 个;
Docker 使用的网卡是 veth-pair 结束,创建删除都是成对操作的;只要删除
Docker 使用的所有的网络接口都是虚拟的,转发效率高;
notion image

8.2. 自定义网络

8.2.1. 工作方式

  • host:使用宿主机
  • container:基本不使用
  • none:不使用
  • bridge:默认

8.2.2. 创建网络

测试,进入container2内部:

8.2.3. 断开链接

移除网络要求所有容器关闭或者断开与此网络的链接:

9. Docker 小结

  1. Docker 镜像,run =》容器;
  1. DockerFile 构建镜像(服务打包);
  1. docker-compose 启动项目(编排多个服务/环境)
  1. Docker 网络

10. Docker Compose

一种通过编写 yaml 文件的方法来进行容器编排的技术。

10.1. 安装

一般 docker desktop 中已经会携带 docker-compose 命令,如果没有可以单独安装。

10.2. 步骤

基本的 compose 包含三个步骤:
  1. 使用 Dockerfile 定义 APP 的环境,以便于可以在任何地方重建;
  1. 在 docker-compose.yml 中定义 APP 的服务,以便可以绑定在一块运行;
  1. 运行 docker-compose up,使用 compose 会运行完整的 APP;
  1. 运行 docker-compose down 停止服务;

10.3. yaml 规则

学习方法:多写多看,查看官网,学习开源项目。

10.4. 开源项目

  1. 包含下载的项目下包含 docker-compose.yml
  1. 包含需要的 Dockerfile
  1. 选择前台运行、后台运行
docker-compose up
docker-compose up -d
  1. 重新打包
docker-compose up --build

11. Swarm 集群

11.1. 创建主节点

11.2. 加入其他节点

生成 token,然后将输出的命令复制到其他机器执行。
  • 生成 woker 令牌
  • 生成 manager 令牌
  • 加入集群

11.3. Raft 协议

保证大多数机器的可用,至少需要 3 台主节点(manager)。
notion image

11.4. 实战示例

容器 =》服务 =》副本
只要学会创建集群、开启服务、实现扩缩容即可。

11.5. 概念总结

swarm:集群管理和编号,docker 可以初始化一个 swarm 集群,其他节点可以加入。(manager,worker)
node:就是一个 docker 节点,多个节点组成了网络集群。(manager,worker)
service:任务,可以在管理节点或者工作节点中运行,核心概念。
tasks:容器内的命令,细节任务。

12. Docker Stack

查看官网示例,基本已经被 k8s 淘汰。

13. Docker Secret

查看官网示例,基本已经被 k8s 淘汰。

14. Docker Config

查看官网示例,基本已经被 k8s 淘汰。

15. 扩展到 k8s

15.1. 云原生时代

  • 必须掌握 Go 语言
Docker,K8S,etcd 均是由 Go 语言编写。
  • CI / CD
读书笔记:rust圣经读书笔记:构建并使用第二大脑