【Linux】Docker的使用
核心概念:容器、镜像与仓库
镜像 (Image):
Docker 镜像打包了运行应用程序所需的一切,包括代码、函数库、环境变量和配置文件。容器 (Container):
容器是镜像运行中的实例。如果将镜像视为面向对象编程中的“类 (Class)”,容器则是这个类的“对象 (Object)”。我们可以通过一个镜像创建任意数量的容器。每个容器都在一个隔离的环境中运行,拥有自己的文件系统、网络和进程空间,但它们共享主机的操作系统内核。这使得容器非常轻量且启动迅速。仓库 (Registry):
镜像仓库是专门用来集中存放和分发 Docker 镜像的地方。最知名的公开仓库是 Docker Hub,它托管了海量的官方和用户分享的镜像。此外,还有许多国内的镜像仓库(或称为“镜像站”),它们可以提供更快的镜像下载速度。
Docker 安装与配置
1. 一键安装
可以参考 Docker 官方的示例:https://get.docker.com。
- 下载安装脚本
1
curl -fsSL https://get.docker.com -o install-docker.sh
- 执行安装脚本
1
sudo sh install-docker.sh
- 验证安装
1
sudo docker --version
2. 配置国内镜像加速
- 编辑 Docker 配置文件
1
sudo vi /etc/docker/daemon.json
- 添加镜像站地址
1
2
3
4
5
6
7
8{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://docker.fxxk.dedyn.io"
]
} - 重启 Docker 服务
1
sudo systemctl restart docker
- 查看 Docker 服务的状态
1
systemctl status docker
镜像与容器基础操作
1. 镜像管理
- 拉取镜像:
sudo docker pull <仓库地址>/<镜像名称>:<标签>- 例:从 docker.fxxk.dedyn.io 拉取1.25版本的 nginx 镜像
1
sudo docker pull docker.fxxk.dedyn.io/nginx:1.25
- 若仓库地址为官方 Docker Hub,则
<仓库地址>/可省略 latest是一个特殊的标签,通常指向该镜像的最新版本,也可以省略- 例如:从官方 Docker Hub 拉取最新版本的 nginx 镜像
1
sudo docker pull nginx
- 例:从 docker.fxxk.dedyn.io 拉取1.25版本的 nginx 镜像
- 查看本地镜像:
docker images1
sudo docker images
- 删除本地镜像:
sudo docker rmi <镜像ID 或 镜像名称:标签>如果镜像正在被某个容器使用,需要先删除该容器才能删除镜像,或者使用1
sudo docker rmi nginx:latest
-f参数强制删除。
2. 容器生命周期管理
1. 运行容器 (docker run)
这是最核心的命令,用于从镜像创建并启动一个容器。它有许多实用的参数:
-d: 后台运行(Detached mode) :如果不加此参数,容器会直接在前台运行并占据终端。-p <主机端口:容器端口>: 端口绑定:用于将主机的网络端口映射到容器内部的端口。--name <容器名称>: 指定容器名称。-v,--volume: 目录/卷绑定:可以将主机(Host)上的目录或 Docker 管理的卷(Volume)挂载到容器内部。分为 绑定挂载 (Bind Mount) 和 命名卷挂载 (Named Volume) 两种方式。- 绑定挂载 (Bind Mount) :直接将主机的目录映射到容器中。语法:
-v <宿主机上的绝对路径:容器内的路径>。 - 命名卷挂载 (Named Volume) :Docker 推荐的方式,由 Docker 来管理卷,更便于跨平台和备份。语法:
-v <卷的名字:容器内的路径>。更详细的命名卷操作见后文 。
- 绑定挂载 (Bind Mount) :直接将主机的目录映射到容器中。语法:
-e <KEY=value>,--env: 传递环境变量。-it, (--interactive --tty): 交互模式:,控制台直接进入容器进行交互,通常用于调试或执行临时命令。--rm: 自动删除容器:当容器停止运行时,自动将其删除。通常会和-it结合使用用于临时调试容器。--restart: 重启策略。always: 只要容器停止了就立即重启。unless-stopped: 除非手动停止(例如使用docker stop命令),否则任何情况下都自动重启。
示例: 以后台模式 (-d)启动 一个名为 my-nginx (--name my-nginx)且设置了自动重启策略 (--restart unless-stopped) 的 Nginx 容器 (nginx:latest),并将主机的 8080 端口映射到容器的 80 端口 (-p 8080:80),并使用本地的 ~/my-nginx-content 目录作为网站文件来源 (-v ~/my-nginx-content:/usr/share/nginx/html)。
1 | sudo docker run -d \ |
随后即可通过浏览器的 http://您的主机IP:8080 来访问这个由主机文件驱动的 Nginx 欢迎页面。即使重启了 Docker 或者服务器,这个容器也会自动重新启动。
2. 创建容器 (docker create)
docker create的用法和docker run非常相似,只创建容器但不启动- 例:
1
docker create -it --name my-stopped-container ubuntu:latest
3. 查看容器 (docker ps)
sudo docker ps: 查看当前正在运行的容器。sudo docker ps -a: 查看所有容器,包括已停止的。
4. 启动与停止容器
1 | sudo docker start <容器ID 或 容器名称> |
5. 删除容器 (docker rm)
语法: sudo docker rm <容器ID 或 容器名称>
1 | sudo docker rm my-nginx |
如果要删除一个正在运行的容器,需要先 stop 它,或者使用 -f 强制删除。
6. 查看容器日志 (docker logs)
对于在后台运行的容器,这个命令非常有用。
1 | sudo docker logs my-nginx |
7. 进入容器执行命令 (docker exec)
在一个已经运行的容器内部执行命令。
1 | # -it 参数让我们可以获得一个交互式的终端 |
进入后,您就处于容器的隔离环境中了,可以像在一个迷你的 Linux 系统中一样操作。
8. Volume 命令
1 | sudo docker volume create my-vol # 创建一个 Volume |
Dockerfile:自定义镜像
当官方镜像无法满足需求时,我们可以通过编写 Dockerfile 来创建自己的镜像。Dockerfile 是一个文本文件,包含了用于构建镜像的所有指令。
Dockerfile 主要指令
1. 基础指令
- FROM: 指定基础镜像,作为构建的起点
- WORKDIR: 设置工作目录,后续指令将在此目录下执行
- COPY/ADD: 将文件或目录从构建上下文复制到镜像中
- RUN: 在镜像构建过程中执行命令,通常用于安装软件包
2.运行时指令
- CMD: 指定容器启动时的默认命令(可被覆盖)
- ENTRYPOINT: 指定容器启动时的入口点(不可被覆盖)
- EXPOSE: 声明容器运行时监听的端口
- ENV: 设置环境变量
3.元数据指令
- LABEL: 添加镜像的元数据信息
示例:
一个完整的 Python Web 应用程序 Dockerfile
1 | # Dockerfile |
构建命令:docker build
1 | # -t 用于指定新镜像的名称和标签 |
Docker Compose:编排多容器应用
当应用程序由多个服务(如 Web 服务器、数据库、缓存)组成时,手动管理多个
docker run命令会变得很繁琐。Docker Compose允许您使用一个YAML文件来将一系列相互关联的docker自动启动并为每个服务创建子网可以通过ai把一系列docker run命令转成docker compose文件
示例: 一个包含 WordPress 和 MySQL 的
docker-compose.yaml文件。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30# docker-compose.yaml
version: '3.8'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: example_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress_password
restart: unless-stopped
wordpress:
image: wordpress:latest
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress_password
WORDPRESS_DB_NAME: wordpress
depends_on:
- db
restart: unless-stopped
volumes:
db_data:在这个文件中,我们定义了
db和wordpress两个服务,并设置了它们的镜像、卷、环境变量和依赖关系。Docker Compose 会自动为它们创建一个专属的网络,让wordpress服务可以通过主机名db来访问数据库。常用命令:
- 在后台启动所有服务
1
sudo docker compose up -d
- 停止并移除由 compose 创建的容器、网络
1
sudo docker compose down
- 停止服务(不移除)
1
sudo docker compose stop
- 重新启动服务
1
sudo docker compose start
- 在后台启动所有服务
参考
https://github.com/tech-shrimp/docker_installer
https://www.bilibili.com/list/watchlater/?bvid=BV1THKyzBER6