Docker-基础知识

2021/6/23 Docker
// 虚拟化的优点(虚拟机)
1. 资源池:一个物理机的资源分配到了不同的虚拟机里
2. 很容易扩展:加物理机器 or 加虚拟机
3. 很容易云化:亚马逊AWS、阿里云等
----------------------------------------------------------------------------------------------
// 虚拟化的局限性
1. 每一个虚拟机都是一个完整的操作系统,要给其分配资源,当虚拟机数量增多时,操作系统本身消耗的资源势必增多
2. 当然第一点并不是导致容器产生的主要原因,而是容器可以解决环境不同的问题
----------------------------------------------------------------------------------------------
// 容器解决了什么问题
1. 解决了开发和运维之间的矛盾
2. 在开发和运维之间搭建了一个桥梁,是实现 devops 的最佳解决方案
----------------------------------------------------------------------------------------------
// 什么是容器
1. 对软件和其依赖的标准化打包
2. 应用之间相互隔离
3. 共享同一个 OS Kernel 即操作系统内核
4. 可以运行在很多主流操作系统上
----------------------------------------------------------------------------------------------
// 容器和虚拟机的区别
1. 容器是 App 层面的隔离
2. 虚拟化是物理资源层面的隔离
3. 虚拟化和容器也可以一起使用
----------------------------------------------------------------------------------------------
// 使用 Vagrant 和 VirtualBox 安装 liunx 虚拟机
1. 新建文件夹
2. cmd
3. vagrant init centos/7 // 初始化文件,生成 vagrantfile
4. vagrant up // 寻找 vagrantfile 中的依赖,如本地有则使用本地,否则会自动到 vagrant cloud 下载
5. vagrant ssh // 连接新建的 VirtualBox 虚拟机
6. exit // 退出虚拟机
7. vagrant status // 查看当前虚拟机状态
8. vagrant halt // 停止当前虚拟机
9. vagrant destroy // 删除当前虚拟机
----------------------------------------------------------------------------------------------
// docker 简介
1. Docker Hub:镜像仓库,存放 image
2. Docker Enterprise:docker 火了之后,就将 docker 分为了企业版和社区版,企业版是 docker EE  社区版是 CE
3. Docker Engine:就是我们通常用的 docker,它是一个 client-server application
4. Docker Desktop:包括Docker Engine、Docker CLI 客户端、Docker Compose、 Docker Content Trust、 Kubernetes和Credential Helper
5. Docker Machine:// 作用就是为了安装 docker 和管理 docker
  1. 能在虚拟机上自动安装 Docker Engine 的工具,也可以通过自己手动安装 docker 不使用 Docker Machine
  2. 新版 Docker Desktop 中已经不包含 Docker Machine,如需使用需要单独下载
  3. 命令
    1. docker-machine create test // 创建一台已安装 docker 的 linux 虚拟机
    2. docker-machine ls // 查看当前已有的机器
    3. docker-machine ssh test // 连接虚拟机
    4. docker-machine stop test // 停止虚拟机
    5. docker-machine start test // 启动虚拟机
    6. docker-machine env test // 查看环境变量
    7. docker-machine // 查看更多命令
----------------------------------------------------------------------------------------------
// Docker 安装
1. 在 Mac 上玩 Docker
  1. Docker for Mac 直接安装
  2. 通过 VirtualBox 或 Vmware 虚拟化软件直接创建 linux 虚拟机,在虚拟机里安装 Docker
  3. 通过 Vagrant + VirtualBox 快速搭建 Docker host
  4. 通过 docker-machine 快速搭建 Docker host
2. 在 Windows 上玩 Docker
  1. Docker for Windows 直接安装(win10)
  2. 通过 VirtualBox 或 Vmware 虚拟化软件直接创建 linux 虚拟机,在虚拟机里安装 Docker
  3. 通过 Vagrant + VirtualBox 快速搭建 Docker host
  4. 通过 docker-machine 快速搭建 Docker host
3. 在 Linux 上玩 Docker
  1. 通过官网的命令下载
  2. 使用 Docker Machine 下载
  3. 使用 docker playground // 云服务,有时间限制,不是自己的虚拟机
4. 在云上玩 Docker
  1. Docker-machine + driver(AWS、Aliyun等)
  2. 直接使用云服务商提供的容器服务
    1. AWSECS
    2. Aliyun 的 Container Service
----------------------------------------------------------------------------------------------
// Docker 架构和底层技术
1. Docker 提供了一个开发、打包、运行 app 的平台,把 app 和底层 infrastructure 隔离开来
   即:infrastructure ——> Docker Engine ——> Application
2. Docker Engine:client 接口(docker 命令)——> REST API Server ——> 后台进程(dockerd 即 Docker host)
3. 底层技术支持
    1. Namespaces:做隔离 pid、net、ipc、mnt、uts
    2. Control groups:做资源限制
    3. Union file systems:Container 和 Image 的分层
----------------------------------------------------------------------------------------------
// Docker Image 镜像概述
1. Image 是文件和 meta data 的集合(root file system)// 文件和 base image 即 linux 系统的集合
2. Image 是分层的,并且每一层都可以添加改变删除文件,成为一个新的 Image
3. 不同的 Image 可以共享相同的 layer
4. Image 本身是 read-only 的
5. root file system 指的是 base image,即 linux 发行版的系统
6. boot file system 指的是 linux kernel,即 linux 核心
7. root file system 构建在 boot file system 之上,image 构建在 root file system 之上
8. 命令:
  1. docker image ls // 查看当前的 Image 列表
  2. docker history id // 查看该 Image 的分层
  3. docker image rm id // 删除该 Image,简写 docker rmi id
----------------------------------------------------------------------------------------------
// Docker Image 的获取,1 和 3 优先选择 1
1. Build from Dockerfile
  Dockerfile 内容:
    FROM centos // 表示使用 base image 即 linux 的系统
    FROM scratch // 表示不依赖其他的 base image,相当于制作一个 base image
    LABEL maintainer="chenjie" // LABEL 相当于代码中的注释,标识
    LABEL version="1.0" // LABEL 相当于代码中的注释,标识
    LABEL description="this is description" // LABEL 相当于代码中的注释,标识
    // RUN 执行命令,注意的是每执行一次 RUN 就会多生成一层分层
    // 所以可以用 && 来连接需要执行的命令,减少分层,为了美观,可以使用反斜杠进行换行避免太长
    RUN apt-get update && apt-get install -y redis-server \
    WORKDIR /root // 设定当前工作目录,相当于 linux 的 cd,尽量使用 WORKDIR 不使用 RUN cd,并且使用绝对路径
    // 大部分情况下 COPY 优先于 ADD,ADD 还可以解压缩,添加远程文件或目录时请使用 curl 或者 wget
    ADD hello.txt test/ // 把本地文件添加到 docker image 里面的 test 目录下,如果是压缩文件则会自动解压缩
    COPY hello.txt test/ // 把本地文件添加到 docker image 里面的 test 目录下,如果是压缩文件不会自动解压缩
    ENV MYSQL_VERSION 5.6 // 设置常量,在 RUN 命令中可以通过 apt-get install mysql-server="${MYSQL_VERSION}" 方式引用
    EXPOSE 6379 // 暴露的端口
    ENTRYPOINT ["/usr/bin/redis-server"] // 程序的入口
  运行 docker build -t chenjie/redis:lates .
2. Pull from Registry // Docker Hub:镜像仓库,存放 image,和 github 类似
  运行 docker pull imageName
3. 通过 docker container commit 生成一个在某一个 container 基础上修改的 Image
----------------------------------------------------------------------------------------------
// Shell 格式命令和 Exec 格式命令
1. Shell 格式
  RUN apt-get install -y vim
  CMD echo "hello docker"
  ENTRYPOINT echo "hello docker"
2. Exec 格式
  RUN ["apt-get", "install", "-y", "vim"]
  CMD ["/bin/echo", "hello docker"]
  ENTRYPOINT ["/bin/echo", "hello docker"]
----------------------------------------------------------------------------------------------
// Dockerfile 中的 RUN、CMD、ENTRYPOINT 的区别
1. RUN:执行命令并创建新的 Image Layer,构建镜像时运行
2. CMD:设置容器启动后默认执行的命令和参数,启动容器时运行
  1. 容器启动时默认执行的命令
  2. 如果 docker run 指定了其他命令,CMD 命令会被忽略
  3. 如果定义了多个 CMD,只有最后一个会执行
3. ENTRYPOINT:设置容器启动时运行的命令
  1. 让容器以应用程序或者服务的形式运行
  2. 不会被忽略,一定会执行
  3. 最佳实践:写一个 shell 脚本作为 entrypoint
----------------------------------------------------------------------------------------------
// Docker Container 容器概述
1. Container 是通过 Image 创建的
2. Container 是在 Image layer 之上建立一个 container layer (可读写),Image 是只读的
3. 类似类和实例的关系,Image 是类,Container 是实例
4. Image 负责 app 的存储和分发,Container 负责运行 app
5. 命令:
  // 创建容器,-it 表示是可交互的,不然可能会运行完就退出,-d 表示后台运行
  // -p 表示把虚拟机的 80 端口映射到主机的 80 端口,--name 表示把当前的容器起名为 test
  // 还可以加入参数用来限制这个容器的 cpu、内存等
  1. docker run -it -d -p 80:80 --name test ImageNmae
  2. docker container ls -a // 查看当前的 Container 列表,-a 表示包含已退出的 Container,简写 docker ps -a
  3. docker container commit // 在某一个 container 的基础上做了改变生成一个新的 Image,简写 docker commit
  4. docker image build // 生成 image,简写 docker build
  5. docker exec -it id /bin/bash // 对当前 id 容器进行一些指令操作
  6. docker container stop id // 停止当前 id 容器的运行,简写 docker stop id
  7. docker start id // 启动当前 id 容器
  8. docker container rm id // 删除当前 id 容器,简写 docker rm id
----------------------------------------------------------------------------------------------
// Image 镜像发布
1. docker login // 登录,需要输入用户名和密码
// 注意只能 push 以自己用户名开头的镜像,否则会报无权限错误
2. docker image push chenjie/hello-world:latest // 简写 docker push chenjie/hello-world:lates
3. 一般发布镜像是通过 github 和 docker hub 进行关联,上传 dockerfile 到 github,docker hub 自动 build 镜像 // 安全性
4. 如果是公司内部的镜像仓库,可以通过运行官方的命令搭建起一个私有的仓库
----------------------------------------------------------------------------------------------
// Docker 网络
1. ping 命令只能验证 IP 的可达性 // 如有防火墙限制可能 ping 不通
2. telnet 命令可以验证服务的可用性
----------------------------------------------------------------------------------------------
// Docker 的持久化存储和数据共享
1. 正常的 container 写数据会写到 container layer 上,如果把 container 删除,数据则会删除
   Volume 可以把数据写到另一个专门存储的地方
2. Docker 持久化数据的方案
  1. 基于本地文件系统的 Volume,可以在执行 Docker create 或 Docker run 时
     通过 -v 参数将主机的目录作为容器的数据卷,这部分功能便是基于本地文件系统的 volume 管理
  2. 基于 plugin 的 Volume,支持第三方的存储方案,比如 NAS、aws
3. Volume 的类型
  1. 受管理的 data Volume,由 docker 后台自动创建
  2. 绑定挂载的 Volume,具体挂载位置可以由用户指定
4. Data Volume:// 指定存储路径
  1. docker run -v volumeName:/var/lib/data container // 在创建容器的时候加 -v 参数并指定名称和存储路径
5. Bind Mouting:// 映射存储路径
  1. docker run -v $(pwd):/usr/share container // 在创建容器的时候加 -v 参数并指定映射路径
6. 相关命令:
  1. docker volume ls // 查看本地的 volume 列表
  2. docker volume rm id // 删除此 id 的 volume
  3. 在创建容器的时候使用第三点的 Data Volume 就会自动创建 volume
----------------------------------------------------------------------------------------------
// Docker Compose
1. Docker Compose 是一个工具
2. 这个工具可以通过一个 yml 文件定义多容器的 docker 应用
3. 通过一条命令就可以根据 yml 文件的定义去创建或管理多个容器
4. Docker Compose3 和 Docker Compose2 最大的区别是 3 可以让容器运行在不同的 linux 上,而 2 只能运行在同一台 linux 上
5. 三大概念
  1. Services
    1. 一个 services 代表一个 container,这个 container 会从 docker hub 的 image 来创建
       或者从本地的 dockerfile build 出来的 image 来创建
    2. service 的启动类似 docker run,我们可以给其指定 network 和 volume,所以可以给 service 指定 network 和 volume 的引用
  2. Networks
  3. Volumes
6. 相关命令:
  1. docker-compose up --scale name=3 // 执行 yml 文件,--scale 表示扩展 3 台名称为 name 的服务
  2. docker-compose ps // 查看当前 compose 中的容器列表
  3. docker-compose build xxx // 构建容器
  4. docker-compose down // 停止所有服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
Last Updated: 2024/6/11 14:20:38
    飘向北方
    那吾克热-NW,尤长靖