ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Docker - 入门教程

Docker - 入门教程

官网

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 pushdocker images、docker rmidocker run、docker ps、docker rm

2.Docker与Docker Desktop对比

Linux 下:原生 Docker vs Docker Desktop 对比

对比项原生 Docker(命令行)Docker Desktop(桌面版)
正式名称Docker EngineDocker 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-ce

3.安装 Docker 软件包

安装docker

sudoaptinstalldocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#启动dockersudosystemctl startdocker#查看docker版本dockerversion

4.配置 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 startdocker

5.验证是否安装成功

#验证镜像#此命令下载测试镜像并将其运行在容器中。当容器运行,打印确认消息并退出sudodockerrun hello-world

显示下面内容则安装成功

添加用户权限,防止Ubuntu系统docker命令前面还要每次加sudo

#将当前用户添加到 docker 组sudousermod-aGdocker$USER#刷新组权限(无需重启)newgrpdocker

Docker 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 version

3.创建配置文件目录

#找个位置存着cd/service/docker# 存放 docker-compose.yml 配置文件sudomkdir-pcompose#安装查看目录树工具sudoaptinstalltree# version 2.1.1-2ubuntu3.24.04.2#查看目录树tree /service/docker
cd/service/docker/compose#修复目录权限# 赋予ubuntu用户对该目录的所有权限sudochown-Rubuntu:ubuntu /service/docker/compose# 确保目录有写入权限sudochmod-R755/service/docker/compose#安装vimsudoaptinstallvim#创建 docker-compose.yml 文件(用 vim 编辑,新手也可用 nano)vimdocker-compose.yml

4.创建配置文件

这里以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 config

5.停止并删除容器

因为之后使用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-a

6.使用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 config

2.启动容器

# 一键启动 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-a

3.访问管理页面

#首次登录需要设置密码https://localhost:9443

Docker常用命令

1.启动类命令

#启动dockersystemctl startdocker#停止dockersystemctl stopdocker#重启dockersystemctl restartdocker#查看docker状态systemctl statusdocker#开机启动systemctlenabledocker#查看docker概要信息dockerinfo#查看docker总体帮助文档docker--help#查看docker命令帮助文档docker具体命令--help

2.镜像命令

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:latest
4. 删除镜像
# 正常删除dockerrmi<镜像ID或名称># 强制删除(忽略运行中的容器依赖)# 不太建议使用,容器可能会残留,建议先删除容器,再删除镜像dockerrmi-f<镜像ID># 删除所有镜像(谨慎使用!)dockerrmi$(dockerimages-q)#删除所有未被使用的镜像(悬空镜像)dockerimage prune# 强制清理(无需确认)dockerimage prune-f
5. 查看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:v1
7. 从文件加载镜像

从.tar文件导入镜像:

dockerload-i<文件名>.tar# 示例dockerload-imyapp.tar
8. 标记和推送镜像
#为镜像打标签(常用于推送到私有仓库):dockertag<原镜像名><新镜像名>:<标签># 示例dockertag myapp:v1 myregistry.com/myapp:v1#将镜像推送到远程仓库(需先登录):dockerpush<镜像名>:<标签># 示例dockerpush myregistry.com/myapp:v1

Docker 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
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进