Docker 基础与实践:从入门到镜像推送

1. 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):

  1. 下载安装脚本

    curl -fsSL https://get.docker.com -o install-docker.sh
  2. 验证脚本内容

    cat install-docker.sh
  3. 预运行检查步骤

    sh install-docker.sh --dry-run
  4. 执行安装

    sudo sh install-docker.sh

2.1 配置镜像源

在中国,由于网络限制,下载镜像可能失败。可通过配置镜像源加速:

  1. 编辑 Docker 配置文件:

    sudo mkdir -p /etc/docker
    sudo nano /etc/docker/daemon.json
  2. 添加镜像源:

    {
       "registry-mirrors": [
           "https://docker.m.daocloud.io",
           "https://docker.1panel.live",
           "https://hub.rat.dev"
      ]
    }

    保存(Ctrl+O, Enter, Ctrl+X)。

  3. 重启 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 203ad09fc156

3.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:80

4. 构建与推送自定义镜像

通过 Dockerfile 可创建自定义镜像。以下以 FastAPI 应用为例。

4.1 编写代码

创建以下文件:

  • main.py

    from fastapi import FastAPI
    import uvicorn

    app = FastAPI()

    @app.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

  1. 登录 Docker Hub:

    docker login

    按提示输入用户名和密码,或使用浏览器验证(无法登录参考:https://zhuanlan.zhihu.com/p/661644999)。

  2. 构建并推送:

    docker build -t sangui571/docker_test .
    docker push sangui571/docker_test
  3. 验证:在 https://hub.docker.com/r/sangui571/docker_test 查看镜像。

5. Docker 网络

Docker 提供三种网络模式:

  1. 桥接模式(Bridge)

    • 默认模式,容器分配内部 IP(如 172.17.x.x),通过 Docker DNS 解析容器名(如 ping <container_name>)。

    • 创建自定义网络:

      docker network create my_network
  2. 主机模式(Host)

    • 容器共享宿主机网络,无需端口映射,直接使用宿主机 IP 和端口。

    • 示例:

      docker run --network host nginx
  3. 无网络模式(None)

    • 容器无网络连接,适合高隔离场景。

6. Docker Compose

Docker Compose 通过 YAML 文件管理多容器应用,简化编排。例如:

services:
web:
  image: nginx
  ports:
    - "8081:80"
  volumes:
    - nginx_html:/usr/share/nginx/html
app:
  image: sangui571/docker_test
  ports:
    - "8000:8000"
  depends_on:
    - web
volumes:
nginx_html:
  • 运行:

    docker-compose up -d
  • 适用场景:单机多容器应用,适合开发和测试。企业级场景推荐 Kubernetes。

7. 技术原理

Docker 利用 Linux 内核的 CgroupsNamespaces 实现容器化:

  • Cgroups:限制容器资源(如 CPU、内存),防止相互干扰。

  • Namespaces:隔离进程视图(如 PID、网络、文件系统),使容器表现为独立系统。

示例:进入容器查看进程:

docker exec -it <container_id> ps -ef
  • 微信
  • 赶快加我聊天吧
  • QQ
  • 赶快加我聊天吧
  • weinxin
三桂

发表评论 取消回复 您未登录,登录后才能评论,前往登录