官网
Docker 官网:http://www.docker.com
Docker Hub 官网(镜像商店):https://hub.docker.com/
官方手册地址(英文):https://docs.docker.com/engine/install/
解决的痛点:
使用Docker容器解决环境重新创建时复杂的配置流程
开发人员利用 Docker 可以消除协作编码时“换台机器不能正常工作”的问题。
与虚拟机的区别:
说白了就是轻量很多,虚拟机还要带着操作系统
Docker 介绍
1.Docker三要素
镜像是容器的“模板”,容器是镜像的“运行态”。镜像提供基础环境,容器在其上实现动态操作。
三者关系: 我们从 仓库 pull (拉取) 镜像到本地,然后以这个镜像为模板,run (运行) 起一个或多个容器。
| 项目 | 仓库(Registry) | 镜像(Image) | 容器(Container) |
|---|---|---|---|
| 生活比喻 | 超市 | 月饼模具 | 用模具做出来的月饼 |
| 作用 | 存放、下载各种镜像 | 只读模板,用来创建容器 | 真正运行、可使用、可修改的实例 |
| 数量关系 | 1 个仓库 包含无数镜像 | 1 个镜像 可创建出无数容器 | 1 个容器 只来自 1 个镜像 |
| 静态/动态 | 静态(存放文件) | 静态(文件模板,不可运行) | 动态(运行状态,占用资源) |
| 是否可修改 | 一般不修改(远程公共) | 只读,不可直接修改 | 可读写,临时修改 |
| 生命周期 | 长期存在(远程服务器) | 本地持久存在 | 启动→运行→停止→删除 |
| 与其他关系 | 提供镜像来源 | 从仓库下载,用于创建容器 | 由镜像创建,依赖镜像存在 |
| 常用命令 | docker pull、docker push | docker images、docker rmi | docker run、docker ps、docker rm |
2.Docker与Docker Desktop对比
Linux 下:原生 Docker vs Docker Desktop 对比
| 对比项 | 原生 Docker(命令行) | Docker Desktop(桌面版) |
|---|---|---|
| 正式名称 | Docker Engine | Docker Desktop |
| 运行方式 | 直接跑在 Linux 内核上 | 跑在QEMU 虚拟机里 |
| 性能 | 极高,几乎无损耗 | 有虚拟机开销,更耗资源 |
| 容器/镜像 | 和系统共享,全局可用 | 独立一套,和原生不互通 |
| 启动速度 | 快 | 慢,要启虚拟机 |
| 图形界面 | 无,纯命令行 | 有 GUI 面板 |
| 适用场景 | 服务器、生产、开发环境 | 本地测试、新手体验 |
| 服务器推荐 | ✅强烈推荐 | ❌不推荐 |
Ubuntu安装Docker Engine
官方手册地址:https://docs.docker.com/engine/install/ubuntu/
这里安装的是纯命令行docker:Docker Engine
1.前置条件
系统版本要求:Ubuntu 22.04、24.04 或最新版本非 LTS 的 x86-64 系统。
网络要求:
检查Ubuntu的网络配置。选择最佳的软件源,连接外网。
网络问题会导致很多莫名其妙的问题。
卸载旧docker
有的Linux系统会自带docker,卸载旧的,防止冲突
如果找不到,说明没安装旧docker,不用管了
sudoaptremove$(dpkg --get-selections docker.iodocker-composedocker-compose-v2 docker-doc podman-docker containerd runc|cut-f1)2.设置apt
在首次在新主机上安装 Docker Engine 之前,您需要设置 Dockerapt仓库。之后,您可以安装和更新来自仓库的 Docker。
# Add Docker's official GPG key:sudoaptupdatesudoaptinstallca-certificatescurlsudoinstall-m0755-d/etc/apt/keyringssudocurl-fsSLhttps://download.docker.com/linux/ubuntu/gpg-o/etc/apt/keyrings/docker.ascsudochmoda+r /etc/apt/keyrings/docker.asc# Add the repository to Apt sources:sudotee/etc/apt/sources.list.d/docker.sources<<EOF Types: deb URIs: https://download.docker.com/linux/ubuntu Suites:$(./etc/os-release&&echo"${UBUNTU_CODENAME:-$VERSION_CODENAME}")Components: stable Signed-By: /etc/apt/keyrings/docker.asc EOFsudoaptupdate执行以下命令,若能看到docker-ce的安装信息,说明配置成功:
apt-cachepolicy docker-ce3.安装 Docker 软件包
安装docker
sudoaptinstalldocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin#启动dockersudosystemctl startdocker#查看docker版本dockerversion4.配置 Docker 镜像加速
注意:阿里云的docker现在只能阿里云服务器用,其它公网连接会报错403
这里配置其他的镜像地址
sudomkdir-p/etc/docker# 创建全新的daemon.json配置文件# min-api-version是为了和后面的Portainer工具适配,不使用的话也可以不配置,否则会有兼容性问题sudotee/etc/docker/daemon.json<<EOF { "registry-mirrors": [ "https://docker.1ms.run", "https://hub-mirror.c.163.com", "https://docker.m.daocloud.io" ], "dns": ["223.5.5.5", "119.29.29.29"], "min-api-version": "1.24" } EOF重启docker
#1、直接重启sudosystemctl restartdocker#2、先停止再启动# 停止Docker服务sudosystemctl stopdocker# 启动Docker服务sudosystemctl startdocker5.验证是否安装成功
#验证镜像#此命令下载测试镜像并将其运行在容器中。当容器运行,打印确认消息并退出sudodockerrun hello-world显示下面内容则安装成功
添加用户权限,防止Ubuntu系统docker命令前面还要每次加sudo
#将当前用户添加到 docker 组sudousermod-aGdocker$USER#刷新组权限(无需重启)newgrpdockerDocker Compose
总结:用来批量管理容器的,避免记很多命令和配置(和镜像关系不大)
1.适用场景
| 场景 | 执行docker compose up -d后的效果 | 对你的价值 | 备注 |
|---|---|---|---|
| 场景1:什么容器都没有 | 新增并运行docker-compose 配置的容器 | 简化多个服务器时的容器配置 | |
| 场景2:容器已运行,yml配置没改 | 输出xxx is up-to-date(容器已是最新),无任何变化 | 验证配置和运行状态一致,确认容器没异常 | |
| 场景3:修改了yml配置(比如Gitea改端口、加重启策略) | 自动停止旧容器 → 按新配置重建/启动容器 → 保留原有数据卷(数据不丢) | 不用手动删容器,一键更新容器配置 | |
场景4:容器已经被手动停止(docker stop gitea) | 直接启动已停止的容器,复用原有配置和数据 | 比docker start更统一,不用记容器名 | 注意,旧容器需要是docker compose启动的才行 |
| 场景5:服务器重启后,容器全部停止 | 一键启动所有配置的容器(按yml里的重启策略/依赖顺序) | 替代逐个执行docker start,批量恢复服务 | |
| 场景6:yml里新增了服务(比如加了Redis) | 只创建+启动新增的Redis容器,原有Gitea/MySQL容器不受影响 | 无缝扩展服务,不用单独跑docker run启动新容器 |
2.安装
#先查看是否安装(按照前面操作新安装的docker会自带)#返回版本号就是已安装dockercompose version#如果没安装#对于Ubuntu和Debian,运行sudoapt-getupdatesudoapt-getinstalldocker-compose-plugin#再次查看是否安装(我这里是自带的5.0.2版本)dockercompose version3.创建配置文件目录
#找个位置存着cd/service/docker# 存放 docker-compose.yml 配置文件sudomkdir-pcompose#安装查看目录树工具sudoaptinstalltree# version 2.1.1-2ubuntu3.24.04.2#查看目录树tree /service/dockercd/service/docker/compose#修复目录权限# 赋予ubuntu用户对该目录的所有权限sudochown-Rubuntu:ubuntu /service/docker/compose# 确保目录有写入权限sudochmod-R755/service/docker/compose#安装vimsudoaptinstallvim#创建 docker-compose.yml 文件(用 vim 编辑,新手也可用 nano)vimdocker-compose.yml4.创建配置文件
这里以Gitea版本控制软件服务端部署为例
Gitea详细使用手册可以参考:https://blog.csdn.net/weixin_46707734/article/details/157969264?spm=1001.2014.3001.5501
services:# Gitea 服务配置gitea: image: gitea/gitea:latest# 使用官方最新镜像,和命令中的镜像一致container_name: gitea# 容器名称,对应 --name gitearestart: unless-stopped# 重启策略,对应 --restart unless-stoppedports: -"3000:3000"# 端口映射,对应 -p 3000:3000volumes:# 数据卷挂载,对应 -v /service/docker/gitea:/data- /service/docker/gitea:/data校验配置文件(需要docker compose 新版本)
# 校验配置语法是否正确(无报错+输出格式化配置即正常)dockercompose config5.停止并删除容器
因为之后使用Docker Compose管理时数据券挂载的目录相同
这一步只是删除容器,并没有删除数据券
所以之后Docker Compose创建容器时数据和配置是相同的
不删除会导致Docker Compose创建容器时报错:容器命名冲突
#查看现在容器情况dockerps-a#这里因为之前已经单独启动容器了,所以会有一个gitea的容器#输出为,可以看到gitea现在正在运行CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6147d7688e77 gitea/gitea:latest"/usr/bin/entrypoint…"7days ago Up14minutes22/tcp,0.0.0.0:3000->3000/tcp,[::]:3000->3000/tcp gitea 7ecc482679e3 hello-world"/hello"7days ago Exited(0)7days ago affectionate_dijkstra# 停止并删除手动创建的 gitea 容器(gitea的数据保存在 /service/docker/gitea)# 如果原来没有重名的旧容容器,这步就不需要操作了dockerstop gitea&&dockerrmgitea#再次查看现在容器情况dockerps-a6.使用Docker Compose启动
默认读取「当前工作目录」下的默认配置文件【docker-compose.yml】
或者 -f 则指定读取的路径和文件。
执行命令时注意所在目录
# Docker Compose启动服务(此时容器归 Compose 管理)dockercompose up-dgitea#执行之后显示为:ubuntu@ubuntu-VMware:/service/docker/compose$dockercompose up-dgitea[+]up1/1 ✔ Container gitea Created# 查看容器是否正常运行,下面两个命令都可以# docker compose命令之后看到纳入docker compose管理的# docker命令可以看到所有的dockercomposepsgiteadockerps-a执行完毕可以尝试是否可以正常打开gitea的页面:http://localhost:3000/
可以重启下ubuntu,测试是否实现开机自动启动服务
可视化工具Portainer
Portainer 本质是一个运行在 Docker 容器中的管理工具,它通过 Docker Engine 提供的 API(默认通过 /var/run/docker.sock 套接字)与 Docker Engine 通信,相当于 “可视化的命令行客户端”,而非替代或修改 Docker Engine。
1.compose新增配置portainer
修改配置文件:docker-compose.yml
新增下面的配置
这里拉取的不是官方的镜像,优点是汉化版本,生产环境不建议使用
官方镜像:
image: portainer/portainer-ce:latest
#Portainer配置portainer: image:6053537/portainer-ce:latest container_name: portainer restart: unless-stopped# 开机自启privileged:true# 确保能访问 Docker 套接字ports: -"9000:9000"# Portainer Web UI HTTP 端口-"9443:9443"# Portainer Web UI HTTPS 端口(推荐使用)-"8000:8000"# 边缘节点通信端口(可选,单机可保留)volumes: - /var/run/docker.sock:/var/run/docker.sock# 核心:连接本地 Docker Engine- /service/docker/portainer:/data# 统一将 Portainer 数据放在和 Gitea 同目录下,便于管理# 挂载宿主机的 passwd 和 group 文件,解决用户识别问题- /etc/passwd:/etc/passwd:ro - /etc/group:/etc/group:ro校验配置文件(需要docker compose 新版本)
# 校验配置语法是否正确(无报错+输出格式化配置即正常)dockercompose config2.启动容器
# 一键启动 Gitea + Portainer 两个服务(后台运行)cd/service/docker/composedockercompose up-d#启动成功则显示ubuntu@ubuntu-VMware:/service/docker/compose$dockercompose up-d[+]up11/11 ✔ Image portainer/portainer-ce:latest Pulled21.0s ✔ Container portainer Created0.3s ✔ Container gitea Running# 查看容器dockerps-a3.访问管理页面
#首次登录需要设置密码https://localhost:9443Docker常用命令
1.启动类命令
#启动dockersystemctl startdocker#停止dockersystemctl stopdocker#重启dockersystemctl restartdocker#查看docker状态systemctl statusdocker#开机启动systemctlenabledocker#查看docker概要信息dockerinfo#查看docker总体帮助文档docker--help#查看docker命令帮助文档docker具体命令--help2.镜像命令
1. 查看本地镜像
#列出所有本地镜像dockerimages# 按名称过滤dockerimages ubuntu -a:列出本地所以镜像(含历史映像号) -q:只显示镜像ID#表头各个选项说明:REPOSITORY:表示镜像的仓库源 TAG:镜像的标签版本号 IMAGE ID:镜像ID CREATED:镜像创建时间 SIZE:镜像大小 同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。 如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 最新镜像#显示镜像的元数据和配置dockerinspect<镜像名>#显示镜像的构建历史(Dockerfile 的层)dockerhistory<镜像名>2. 远程仓库搜索镜像
dockersearch hello-world#显示点赞数最多的前5个镜像dockersearch--limit5hello-world#返回参数NAME:镜像名称。提交者/镜像名称 DESCRIPTION:镜像说明 STARS:点赞数 OFFICIAL:是否经过官方认证 AUTOMATED:是否是自动构建的3. 拉取镜像
从远程仓库(如 Docker Hub)下载镜像:
dockerpull<镜像名>:<标签># 示例dockerpull ubuntu:20.04#没有加<标签>等价于最新版latestdockerpull nginx:latest4. 删除镜像
# 正常删除dockerrmi<镜像ID或名称># 强制删除(忽略运行中的容器依赖)# 不太建议使用,容器可能会残留,建议先删除容器,再删除镜像dockerrmi-f<镜像ID># 删除所有镜像(谨慎使用!)dockerrmi$(dockerimages-q)#删除所有未被使用的镜像(悬空镜像)dockerimage prune# 强制清理(无需确认)dockerimage prune-f5. 查看docker空间
dockersystemdf#返回参数TYPE:类型 TOTAL:总数 ACTIVE:活动中的数量 SIZE:大小 RECLAIMABLE:对应的可伸缩性6. 构建和保存镜像
#通过 `Dockerfile` 构建镜像:dockerbuild-t<镜像名>:<标签><上下文路径># 示例dockerbuild-tmyapp:v1.dockerbuild-tmyapp:dev-f./Dockerfile.dev.#将镜像导出为 `.tar` 文件:dockersave-o<文件名>.tar<镜像名># 示例dockersave-omyapp.tar myapp:v17. 从文件加载镜像
从.tar文件导入镜像:
dockerload-i<文件名>.tar# 示例dockerload-imyapp.tar8. 标记和推送镜像
#为镜像打标签(常用于推送到私有仓库):dockertag<原镜像名><新镜像名>:<标签># 示例dockertag myapp:v1 myregistry.com/myapp:v1#将镜像推送到远程仓库(需先登录):dockerpush<镜像名>:<标签># 示例dockerpush myregistry.com/myapp:v1Docker Compose常用命令
1.基础命令
| 命令 | 作用 | 示例(单个容器/所有容器对比) |
|---|---|---|
docker compose up <服务名> | 前台启动单个容器(实时日志) | 单个:docker compose up gitea所有: docker compose up |
docker compose up -d <服务名> | 后台启动单个容器(生产首选) | 单个:docker compose up -d gitea所有: docker compose up -d |
docker compose up -d --build <服务名> | 重建并后台启动单个容器(修改镜像后) | 单个:docker compose up -d --build gitea所有: docker compose up -d --build |
docker compose stop <服务名> | 停止单个容器(保留容器,数据不丢) | 单个:docker compose stop gitea所有: docker compose stop |
docker compose start <服务名> | 启动已停止的单个容器(复用原有容器) | 单个:docker compose start gitea所有: docker compose start |
docker compose restart <服务名> | 重启单个容器(修改配置后生效) | 单个:docker compose restart gitea所有: docker compose restart |
docker compose down <服务名> | 停止并删除单个容器(保留数据卷) | 单个:docker compose down gitea所有: docker compose down |
docker compose ps <服务名> | 查看单个容器运行状态 | 单个:docker compose ps gitea所有: docker compose ps |
2.日志与排障命令
| 命令 | 作用 | 示例(单个容器) |
|---|---|---|
docker compose logs <服务名> | 查看单个容器所有历史日志 | docker compose logs gitea |
docker compose logs -f <服务名> | 实时跟踪单个容器日志(排障核心) | docker compose logs -f gitea |
docker compose logs --tail=100 <服务名> | 查看单个容器最后100行日志 | docker compose logs --tail=100 gitea |
docker compose exec <服务名> <命令> | 进入单个容器执行命令(调试) | docker compose exec gitea bash(进入Gitea容器)docker compose exec gitea cat /data/gitea/conf/app.ini(查看Gitea配置) |
3.管理命令
| 命令 | 作用 | 示例(单个容器) |
|---|---|---|
docker compose pause <服务名> | 暂停单个容器(临时冻结) | docker compose pause gitea |
docker compose unpause <服务名> | 恢复暂停的单个容器 | docker compose unpause gitea |
docker compose rm <服务名> | 删除已停止的单个容器(清理冗余) | docker compose rm gitea |
docker compose pull <服务名> | 拉取单个容器的最新镜像 | docker compose pull gitea |
docker compose top <服务名> | 查看单个容器内运行的进程 | docker compose top gitea |