Docker基础上1 Docker的安装1.2 配置镜像加速器1.3 部署服务1.4 Docker 相关信息查看2 Docker 的镜像操作2.1 在Docker Hub中搜索镜像2.2 拉取镜像2.3 查看本地镜像与更改tag2.4 删除镜像2.5 镜像的导入导出3 Docker 的容器操作3.1 启动容器3.2 查看容器3.3 查看指定容器3.4 进入容器执行命令3.5 容器命名与端口映射3.6 停止与删除容器3.7 重启容器正在启动的或者已经停止但未删除的3.8 指定环境变量4 Docker 的数据管理数据持久化4.1 文件挂载4.2 目录挂载4.3 文件拷贝4.5 部署服务通用步骤5 总结1 Docker的安装对于一个新的刚安装好的系统首先我们要修改镜像源把默认镜像源替换成阿里云的镜像源。进入阿里巴巴镜像站在搜索框输入 RockyLinux然后点击搜索结果复制替换命令复制的命令如下sed-es|^mirrorlist|#mirrorlist|g\-es|^#baseurlhttp://dl.rockylinux.org/$contentdir|baseurlhttps://mirrors.aliyun.com/rockylinux|g\-i.bak\/etc/yum.repos.d/Rocky-*.repo dnf makecache然后在服务器上执行上述命令这些命令是为了安装一些必要的命令的时候可以直接去阿里云下载安装提升速度。接下来是安装docker# 安装必备工具yuminstallwgetjq psmiscvimnet-tools telnet yum-utils device-mapper-persistent-data lvm2git-y# 添加软件源信息yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安装docker-ceyuminstalldocker-ce-y# 启动docker并设置为开机自启动systemctlenable--nowdocker关于阿里云的docker源可以这么找1.2 配置镜像加速器拉取 Docker 官方镜像时能加速sudomkdir-p/etc/dockersudotee/etc/docker/daemon.json-EOF { registry-mirrors: [ https://docker.m.daocloud.io, https://dockerhub.icu, https://docker.rainbond.cc, https://docker.mirrors.ustc.edu.cn , https://hub-mirror.c.utas.edu.cn , https://mirror.baidubce.com ] } EOFsudosystemctl daemon-reloadsudosystemctl restartdocker1.3 部署服务使用docker run命令就可以直接部署# 首次执行下面的命令时会先拉镜像dockerrun-d-p8888:80 registry.cn-beijing.aliyuncs.com/dotbalo/counter:v1容器启动后宿主机和容器会有个端口号映射刚刚我们的命令中我们把容器的 80 端口映射到了宿主机的 8888 端口我们可以通过宿主机的IP和端口号进行访问一台宿主机上同一个镜像也可以启动两个容器但和已有的端口号不能冲突容器内的端口无所谓因为隔离了例如可以dockerrun-d-p8080:80 registry.cn-beijing.aliyuncs.com/dotbalo/counter:v11.4 Docker 相关信息查看输入docker version可以看到 Docker 的客户端和服务端版本信息输入docker info可以看到详细信息这里面有一行 Live Restore Enabled如果为 true当重启 docker 时systemctl restart docker容器不会重启也就是docker进程终止了容器还在运行建议设为 falsetrue 只适用于 docker 配置经常改的情况。2 Docker 的镜像操作2.1 在Docker Hub中搜索镜像去Docker Hub的官网然后搜索官方镜像都会带有“Docker Official Image”的表示有蓝色勾号标记的虽然不是官方发布的但也是能用的作者也是经过认证的。另外Docker Hardened ImagesDHI表示这是经过安全加固、最小化且可直接投入生产环境的容器镜像旨在减少漏洞并增强软件供应链安全是Docker Hub官方最推荐的镜像。接下来我们点进去能看到不同的版本也可以在搜索框进行搜索对于Docker镜像而言Docker Hub是最全的镜像仓库阿里云和腾讯云都没这么全所以 Docker Hup 中有的镜像在阿里云中未必有。我经常会部署大模型也可以来这里找镜像比如最近一个月很火的 kimi-k3 模型想用vllm部署就可以在这里搜我最近实测过相比于我在 conda 虚拟环境中安装vllm然后部署大模型实际上是在虚拟机上跑使用docker方便很多。因为物理机上需要进行编译还要下非常多的 cubin 文件这个过程要好几个小时而使用docker容器则是把所有组件都给你编译下载好了可以直接跑。2.2 拉取镜像假如我们要下载一个 nginx 1.22 版的镜像可以在搜索到镜像后复制拉取命令再到终端输入要是去指定镜像仓库拉取镜像命令示例如下dockerpull registry.cn-beijing.aliyuncs.com/dotbalo/counter:v1镜像分为四部分镜像地址也称镜像仓库、镜像目录、镜像名、版本号tag。当然我们经常看到的镜像未必都有着四部分比如直接是docker pull niginx。如果没有指定镜像地址则是去docker hub默认镜像源拉取镜像如果没有指定镜像目录则去镜像地址的根目录library中拉取镜像如果没有版本号则会自动去拉latest即最新的镜像版本必须有tag为latest的镜像否则报错。2.3 查看本地镜像与更改tag输入docker images查看本地已有的镜像带U表示正在使用的。更改tag用下面的命令dockertag nginx:1.22.1-alpine3.17-slim nginx:latest可以看到本地新增了一个镜像与原镜像的 tag 不同但 ID 却一致因为我们对原镜像没有做修改所以 ID 不变修改tag有什么意义后续的课程里会介绍。2.4 删除镜像比如要删除我们刚刚打了tag的 nginx可以使用命令docker rmi nginx:latest也可以用对应的镜像的 ID 来删除但如果执行docker rmi 7d8c7df34592则会报错因为共享ID也就是说通过 ID 删除镜像只能删除那些不共享 ID 的镜像。下面的截图通过ID删除失败后又通过镜像地址删除就成功了2.5 镜像的导入导出对于没有连接公网的机器无法通过拉取操作进行下载只能硬盘进行导入在导入之前需要在环境所在机器上将对应的环境导出。# 导出为tar包dockersave-onginx-v122.tar nginx:1.22.1-alpine3.17-slim# 导入dockerload-inginx-v122.tar导出导入示例如下3 Docker 的容器操作3.1 启动容器容器的启动分为前台启动和后台启动两种前台启动会占用当前终端、日志直接打印、容器随主进程结束而停止后台启动-d则脱离终端、日志需通过 docker logs 查看、容器可持续运行。 两者的本质差异不在于是否占用一个终端窗口而在于容器主进程PID 1与终端的绑定关系。我们先来说一下后台启动# 后台启动detached 模式dockerrun-dredis:6.0.20# 使用参数 -d没有这个参数的一律都是前台启动-d是让容器转入后台stdout/stderr 由 Docker 日志驱动接管与终端解耦。即使你关闭终端会话主进程仍在容器命名空间内继续运行。还可以加上参数--restartalways如果容器异常自动重启当然对我们算法工程师来说这个功能基本用不到因为很少自己搭服务。docker run 的完整语法是dockerrun[OPTIONS]IMAGE[COMMAND][ARG...]每个 Docker 镜像都内置了默认的 COMMAND 参数通过 Dockerfile 的 CMD 定义它表示启动容器后马上执行的命令可以通过命令docker inspect redis:6.0.20 --format {{.Config.Cmd}}查看 redis:6.0.20 镜像的默认 COMMAND 参数相当于你的前端窗口通过ssh连接到了容器也就是说redis 镜像的默认命令为 redis-sever它表示一启动容器后就启动 redis 服务。我们经常可以看到类似于这样的命令docker run -it redis:6.0.20 bash这是指定了 COMMAND 参数为bash也就是使用 bash 覆盖了默认的 redis-sever它的意思是启动 bash一个 shell窗口配合前面的-it参数包含i和t两个参数两个参数连用让你能和容器内进程进行交互相当于通过 SSH 连接到了容器。也就是说使用bash只会启动容器但不会启动默认的服务。如果不是 bash而是其他命令比如docker run -it redis:6.0.20 ls /这会导致执行完 ls 就退出容器部署服务的命令除外3.2 查看容器dockerps# 查看当前运行的容器dockerps-a# 查看所有容器包括已经退出的dockerps-q# 查看正在运行的容器IDdockerps-aq# 查看所有容器的ID包含已退出docker ps -a可以开单到容器状态、创建时间等3.3 查看指定容器dockerinspect 容器ID/容器名称# 查看容器信息重点看IP地址、端口号、数据目录等dockerlogs 容器ID/容器名称# 查看日志dockerlogs-f容器ID/容器名称# 追踪日志即实时更新日志dockerlogs-f容器ID/容器名称--tail5# 只看最后5行日志容器名称是在启动时命名的稍后会介绍如何指定容器名称。3.4 进入容器执行命令前面介绍的前台启动命令docker run -it redis:6.0.20 bash可以直接打开一个交互界面并进入到容器中。而要进入到一个后台运行的容器即之前用-d 命令参数来指定后台运行方式的容器则需要使用下面的命令dockerexec-ti容器ID/容器名称bash进去后就可以执行Linux的常见命令了。3.5 容器命名与端口映射可以在启动容器时给容器命名dockerrun-d--nameweb1 nginx:1.15# 起名为 web1启动后也可以改名dockerrename原容器名称 新容器名称启动容器时指定端口映射dockerrun-d-p1111:80 nginx:1.15# 将宿主机的端口号1111映射到容器的80服务暴露的端口号可以去镜像仓库中的镜像说明里找3.6 停止与删除容器dockerstop 容器ID/容器名称# 停止容器可以填写多个容器名或ID用空格隔开dockerstopdockerps-q# 停止所有容器dockerrm容器ID/容器名称# 删除容器可以填写多个容器名或ID用空格隔开dockerrmdockerps-aq# 删除所有已停止的容器但正在运行的删不掉切会报错对于前台容器在启动时可以添加--rm参数表示前台启动的容器退出后立即删除这样退出后就不需要手动删除了例如dockerrun-ti--rmredis:6.0.20bash3.7 重启容器正在启动的或者已经停止但未删除的dockerrestart 容器ID/容器名称3.8 指定环境变量通过参数-e例如dockerrun\-eHF_ENDPOINThttps://hf-mirror.com\-eHF_HUB_OFFLINE0\--nameweb1\-itnginx:latestbash进入容器后可以输入env查看环境变量4 Docker 的数据管理数据持久化4.1 文件挂载镜像是个不可改变的基础设施在镜像里增、删、改任何文件在容器删除不是停止后下次再启动时都会恢复原样。要想保存对镜像的改动有两种措施一是创建一个新的 tag也就是相当于造了一个新的镜像二是文件挂载把宿主机的目录或文件挂到容器相当于保存到了宿主机。下面是文件挂载的示例dockerrun-ti-p1111:80-v/etc/hosts:/etc/hosts nginxbash# -v 是挂载参数格式是 -v 宿主机上的绝对路径:容器中的绝对路径因为文件挂载不一定会同步也就是容器内改了宿主机上未必修改所以文件挂载用的少一般是目录挂载用的多。4.2 目录挂载目录挂载可以保持宿主机与容器的同步但挂的目的路径已经有相同名字的目录了则会覆盖容器中的目录。dockerrun-ti-p1111:80-v/mnt:/mnt nginxbash# 同样是用参数 -v# 挂多个目录-v 用多次dockerrun-ti-p1111:80-v/mnt:/mnt-v/etc:/etc nginxbash可以把一个目录同时挂载到多个容器上这样就是共享目录两个容器中任何一个在目录中新增、删除、修改了文件宿主机与另一个容器都会同步。另外在拉一个通用镜像并部署服务之前需要在镜像仓库的镜像说明中找数据持久化的地址也就是服务部署起来后数据保存到容器的哪个目录下再把宿主机的相关目录挂到这个目录。下面是redis中关于镜像仓库的说明红框部分说“若启用了持久化功能数据会存储在VOLUME /data中可搭配-v /docker/host/dir:/data使用”。4.3 文件拷贝# 将文件或目录拷贝到容器中dockercpREADME.md 容器ID:容器路径# 就是 docker cp# 也可以将容器中的文件拷贝到宿主机dockercp容器ID:容器文件或目录 宿主机目录4.5 部署服务通用步骤主要分为五步1.确认需要部署的服务即看需要什么通用服务可以完成需求2.找到基础镜像去公开的镜像仓库或者公司自己的镜像仓库找3.了解服务运行需要的基础配置比如端口号、环境变量、数据持久化目录、是否需要用户名和登录密码等4.下载镜像5.确认配置和启动服务6.验证服务服务启动后验证功能是否满足5 总结
