![[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= docker-ce-cli= 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 ```