You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

463 lines
12 KiB

2 years ago
![[Docker.svg]]
> 说明
- 学习来源
- [学习 Docker 看完哪篇超详细的教程就足够了? - 知乎 (zhihu.com)](https://www.zhihu.com/question/485967221)
- [【docker教程】2022新完整版docker容器教程,入门到精通3天光速搞定_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1AZ4y1b7ev/)
------
[toc]
# 📙一、 系统介绍
## 1 概括性介绍
### 1.1 Docker Run做了什么
- 查找本地镜像
- 查找网络镜像
### 1.2 Docker工作机制
> 作者:步尔斯特
> 链接:https://www.zhihu.com/question/485967221/answer/2556644950
> 来源:知乎
> 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket从客户端访问,DockerServer(守护进程)接受到DockerClient(客户端)的指令,就会执行这个命令。
守护进程管理运行在主机上的容器 。
容器,是一个运行时环境,就是我们前面说到的集装箱。
### 1.3 Docker比VMware快的原因
> 作者:步尔斯特
> 链接:https://www.zhihu.com/question/485967221/answer/2556644950
> 来源:知乎
> 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- `docker有着比虚拟机更少的抽象层`。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
- `docker利用的是宿主机的内核,而不需要Guest OS`。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。
- **Docker底层共用物理机的实际资源,而虚拟机需要模拟物理机的操作系统资源,所以Docker加载得更快,而虚拟机更慢。**
![[Docker和VMware区别.png]]
> Docker是一个解决了运行环境和配置问题,并且方便做持续集成以及有助于整体发布的容器虚拟化技术。
- 镜像
- 容器
- 仓库
-----
# 📦二、 安装
## 1 脚本安装
```bash
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ DRY_RUN=1 sh ./get-docker.sh # 了解脚本在安装过程中将执行哪些步骤
$ sudo sh test-docker.sh # 直接执行
```
## 2 package包
- 转到 [`https://download.docker.com/linux/debian/dists/`](https://download.docker.com/linux/debian/dists/),选择您的 Debian 版本,然后浏览到 、选择 、 或 ,然后下载您要安装的 Docker 引擎版本的文件。`pool/stable/``amd64``armhf``arm64``.deb`
- 安装
```bash
$ sudo dpkg -i package.deb
```
- 运行
```bash
$ sudo docker run hello-world
```
## 3 软件源
参考:
> [在 Debian | 上安装 Docker 引擎泊坞窗文档](https://docs.docker.com/engine/install/debian/)
>
> [Debian安装Docker(国内源) - 简书 (jianshu.com)](https://www.jianshu.com/p/e9873d92ebbd)
>
> [容器镜像服务 (aliyun.com)](https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors)
### 3.1 卸载
#### 3.1.1 普通卸载
卸载内容:`docker` `docker.io` `docker-engine`
```bash
$ sudo apt-get remove docker docker-engine docker.io containerd runc
```
将保留 的内容,包括映像、容器、卷和网络。
#### 3.1.2 完全卸载
- 卸载泊坞引擎、CLI、容器化和泊坞窗撰写包:
```bash
$ sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
$ # purge不保留配置文件
```
- 主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有映像、容器和卷:
```bash
$ sudo rm -rf /var/lib/docker
$ sudo rm -rf /var/lib/containerd
```
您必须手动删除任何已编辑的配置文件。
### 3.2 安装
#### 3.2.1 设置源
1. ##### 基础源
```bash
$ # 编辑/etc/apt/sources.list
# 阿里云源
deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb https://mirrors.aliyun.com/debian-security/ bullseye-security main
deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main
deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
```
2. ##### 设置Docker源
- 官方源
- 添加Docker官方的GPG key
- 设置stable源
```bash
# 添加Docker官方的GPG key
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置stable源
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
- 国内源
- 添加Docker官方的GPG key
- 设置stable源
```bash
# 添加Docker官方的GPG key
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL http://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置stable源
$ echo \
"deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] http://mirrors.ustc.edu.cn/docker-ce/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
3. ##### 安装
- 更新包索引安装最新的Docker
```bash
$ sudo apt-get update
```
- 查看可用版本
```bash
$ apt-cache madison docker-ce
docker-ce | 5:20.10.18~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.17~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.16~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.15~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.14~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.13~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.12~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.11~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.10~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.9~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.8~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.7~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
docker-ce | 5:20.10.6~3-0~debian-bullseye | https://download.docker.com/linux/debian bullseye/stable amd64 Packages
```
- 安装最新版
```bash
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
- 安装指定版本,版本号为`5:20.10.8~3-0~debian-bullseye`
```bash
$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin
```
4. ##### 运行测试
- 通过运行`hello-world`镜像来验证是否正确安装了 Docker 引擎。
```bash
$ sudo docker run hello-world
```
5. ##### 设置仓库(配置docker加速器)
```bash
$ sudo mkdir -p /etc/docker
$ sudo touch /etc/docker/daemon.json
# 编辑此文件,加入以下内容
{
"registry-mirrors" : [
"https://8xpk5wnt.mirror.aliyuncs.com" # 自己的阿里云镜像源,每个人不一样
# https://docker.mirrors.ustc.edu.cn # 中科大的源
]
}
# 重启
systemctl daemon-reload
systemctl restart docker
# 设置开机启动
systemctl enable docker
#查看是否运行
ps aux | grep docker
docker ps
docker images
docker version
```
### 3.3 以非root身份运行
#### 3.3.1 查看用户组
```bash
$ sudo cat /etc/group |grep docker
# docker:x:998:表示存在
```
#### 3.3.2 创建用户组
```bash
$ sudo groupadd docker
```
#### 3.3.3 将用户添加到用户组
```bash
$ sudo usermod -aG docker $USER
$ newgrp docker # 激活组更改,无效的话尝试重连ssh,退出登录,重启计算机等
```
### 3.4 为Docker指定DNS服务器
[Linux |的安装后步骤泊坞窗文档 (docker.com)](https://docs.docker.com/engine/install/linux-postinstall/#specify-dns-servers-for-docker)
### 3.5 CentOS上安装
> 大同小异,参考[在 CentOS |上安装Docker引擎文档 (docker.com)](https://docs.docker.com/engine/install/centos/)
-----
# 📒三、入门
## 1 基础组件
### 1.1 ⭐Docker引擎
![[Docker Engine.png]]
### 1.2 ⭐Docker核心
![[Docker核心.png]]
### 1.3 ⭐Docker平台组成
![[Docker平台组成.png]]
### 1.4 ⭐Docker生命周期
![[Docker生命周期.png]]
### 1.5 ⭐Docker分层原理
![[镜像分层原理.png]]
-----
# 🔯四、命令
## 镜像
### 查看本地镜像列表
```bash
docker images
```
### 搜索镜像
```bash
docker search imagesName
```
### 拉取镜像
```bash
docker pull imagesName/id
docker pull imagesName:Tag
```
### 保存镜像
```bash
docker save imagesName/id -o 镜像保存的位置和名称
```
### 导入镜像
```bash
docker load -i 镜像位置
```
### 删除镜像
```bash
#删除一个
docker rmi -f 镜像名/镜像ID
#删除多个 其镜像ID或镜像用用空格隔开即可
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
#删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
```
## 容器
### 容器列表
```bash
docker ps # 正在运行的
docker ps -a # 所有的容器
```
### 创建和删除容器
```bash
# 创建容器
docker run -it -d --name 要取的别名 -p 宿主机端口:容器端口 -v 宿主机文件存储位置:容器内文件位置 镜像名:Tag /bin/bash
#删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq)
```
参数含义
> - -it 表示 与容器进行交互式启动
> - -d 表示可后台运行容器 (守护式运行)  
> - --name 给要运行的容器 起的名字  
> - /bin/bash  交互路径
> - -p 将容器的端口映射到宿主机上,通过宿主机访问内部端口
> - -v 将容器内的指定文件夹挂载到宿主机对应位置
### 启动和停止容器
```bash
# 启动
docker start 容器ID/名称
docker restart 容器ID/名称
# 停止
docker stop 容器名/id
```
### 退出和进入容器
```bash
exit
# Ctrl + D 直接退出并关闭容器
# CTRL + P + Q 退出到后台
docker attach 容器ID/名称 # 需要Ctrl + P + Q才可以退出至后台,Ctrl + D会直接退出,exit也会直接退出
docker exec -it 容器ID/名称 bash # Ctrl + D可以直接退出到后台
```
### 修改容器名
```bash
# 修改容器名称
docker rename 原容器名 要修改的容器名
```
### 暂停和恢复容器
```bash
# 暂停容器
docker pause 容器名
# 恢复容器
docker unpause 容器名
```
### 生成镜像
**使用场景:**
- 构建临时的测试镜像;
- 容器被入侵后,使用docker commit,基于被入侵的容器构建镜像,从而保留现场,方便以后追溯。
**弊端:**
- 使用docker commit构建的镜像包含了编译构建、安装软件,以及程序运行产生的大量无用文件,这会导致镜像体积很大,非常臃肿。
- 使用docker commit构建的镜像会丢失掉所有对该镜像的操作历史,无法还原镜像的构建过程,不利于镜像的维护。
```bash
docker commit 容器ID 镜像名称:TAG
```