Docker 基础与实践:从入门到镜像推送
Docker 是一种高效的容器化技术,用于简化软件部署。它通过容器化和镜像两大核心概念实现应用的隔离与可移植性。
1.1 容器化技术
容器化技术为应用程序提供独立的运行环境,每个运行环境称为一个容器,运行容器的计算机称为宿主机。与虚拟机相比,Docker 容器共享宿主机的操作系统内核,无需完整的操作系统镜像,因此更轻量、启动更快、资源占用更少。容器本质上是一个隔离的进程,但内部表现如同独立系统。
1.2 镜像
镜像作为容器的模板,类似于软件安装包。容器是从镜像实例化运行的程序。类比现实场景,镜像就像模具,容器则是模具制作的糕点。一个镜像可生成多个容器,也可分享到 Docker Hub(https://hub.docker.com),供他人下载使用。Docker Hub 是官方镜像仓库,存储了大量社区和官方镜像。
2. 在 Linux 上安装 Docker
Docker 原生支持 Linux 系统,Windows 和 macOS 通过虚拟 Linux 子系统运行 Docker。为获得最佳性能,建议使用 Linux 宿主机。以下是基于 Ubuntu 的安装步骤(参考官方文档:https://get.docker.com):
下载安装脚本:
curl -fsSL https://get.docker.com -o install-docker.sh验证脚本内容:
cat install-docker.sh预运行检查步骤:
sh install-docker.sh --dry-run执行安装:
sudo sh install-docker.sh
2.1 配置镜像源
在中国,由于网络限制,下载镜像可能失败。可通过配置镜像源加速:
编辑 Docker 配置文件:
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json添加镜像源:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1panel.live",
"https://hub.rat.dev"
]
}保存(
Ctrl+O,Enter,Ctrl+X)。重启 Docker 服务:
sudo systemctl restart docker
3. 常用 Docker 命令
以下介绍 Docker 的核心命令,涵盖镜像管理、容器运行与调试。
3.1 拉取镜像
docker pull 从仓库下载镜像。例如:
sudo docker pull nginx命令解析:
默认从 Docker Hub 拉取(省略
docker.io)。nginx是镜像名,library是官方命名空间(可省略)。:latest表示最新版本,可指定版本如:1.28.0。
示例(私有仓库):
sudo docker pull docker.n8n.io/n8nio/n8n从 n8n 私有仓库下载,命名空间为
n8nio,镜像名为n8n。
3.2 查看镜像
docker images列出本地镜像信息,例如:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 203ad09fc156 7 weeks ago 192MB
3.3 删除镜像
sudo docker rmi nginx或使用镜像 ID:
sudo docker rmi 203ad09fc1563.4 运行容器
sudo docker run -d -p 80:80 nginx-d:后台运行。-p 80:80:将宿主机端口 80 映射到容器端口 80,格式为<宿主机端口>:<容器端口>。说明:容器网络默认隔离,需通过端口映射访问容器服务。例如,访问
localhost:80可查看 Nginx 默认页面。
3.5 挂载卷
挂载卷实现数据持久化,容器删除后数据仍保留。例如:
sudo docker run -d -p 80:80 -v /website/html:/usr/share/nginx/html nginx-v /website/html:/usr/share/nginx/html:将宿主机的/website/html映射到容器的/usr/share/nginx/html。替代方式:使用 Docker 卷:
sudo docker volume create nginx_html
sudo docker run -d -p 80:80 -v nginx_html:/usr/share/nginx/html nginx查看卷位置:
sudo docker volume inspect nginx_html输出示例:
[
{
"CreatedAt": "2025-10-07T07:19:10Z",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/nginx_html/_data",
"Name": "nginx_html",
"Scope": "local"
}
]
3.6 其他常用命令
查看容器:
sudo docker ps # 查看运行中的容器
sudo docker ps -a # 查看所有容器(包括停止的)启动/停止容器:
sudo docker start <container_id>
sudo docker stop <container_id>进入容器:
sudo docker exec -it <container_id> /bin/sh示例:在容器内查看文件:
sudo docker exec -it <container_id> ls /usr/share/nginx/html输出:
50x.html index.html。查看日志:
sudo docker logs -f <container_id>检查容器详情:
sudo docker inspect <container_id>
3.7 调试容器
若容器缺少工具(如 vi),可安装。例如,Nginx 镜像基于 Debian:
sudo docker exec -it <container_id> /bin/sh
apt update
apt install vim然后编辑文件:
vi /usr/share/nginx/html/index.html
curl localhost:804. 构建与推送自定义镜像
通过 Dockerfile 可创建自定义镜像。以下以 FastAPI 应用为例。
4.1 编写代码
创建以下文件:
main.py:from fastapi import FastAPI
import uvicorn
app = FastAPI()
.get("/")
def read_root():
return {"Hello": "World"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)requirements.txt:fastapi
uvicorn
4.2 创建 Dockerfile
在项目目录下创建 Dockerfile:
FROM python:3.13-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python3", "main.py"]4.3 构建镜像
docker build -t sangui571/docker_test .4.4 运行容器
docker run -d -p 8000:8000 sangui571/docker_test访问 localhost:8000,返回 {"Hello": "World"}。
4.5 推送至 Docker Hub
登录 Docker Hub:
docker login按提示输入用户名和密码,或使用浏览器验证(无法登录参考:https://zhuanlan.zhihu.com/p/661644999)。
构建并推送:
docker build -t sangui571/docker_test .
docker push sangui571/docker_test
5. Docker 网络
Docker 提供三种网络模式:
桥接模式(Bridge):
默认模式,容器分配内部 IP(如
172.17.x.x),通过 Docker DNS 解析容器名(如ping <container_name>)。创建自定义网络:
docker network create my_network
主机模式(Host):
容器共享宿主机网络,无需端口映射,直接使用宿主机 IP 和端口。
示例:
docker run --network host nginx
无网络模式(None):
容器无网络连接,适合高隔离场景。
6. Docker Compose
Docker Compose 通过 YAML 文件管理多容器应用,简化编排。例如:
services
web
imagenginx
ports
"8081:80"
volumes
nginx_html:/usr/share/nginx/html
app
imagesangui571/docker_test
ports
"8000:8000"
depends_on
web
volumes
nginx_html运行:
docker-compose up -d适用场景:单机多容器应用,适合开发和测试。企业级场景推荐 Kubernetes。
7. 技术原理
Docker 利用 Linux 内核的 Cgroups 和 Namespaces 实现容器化:
Cgroups:限制容器资源(如 CPU、内存),防止相互干扰。
Namespaces:隔离进程视图(如 PID、网络、文件系统),使容器表现为独立系统。
示例:进入容器查看进程:
docker exec -it <container_id> ps -ef- 微信
- 赶快加我聊天吧

- 赶快加我聊天吧
