Docker 容器化基础:镜像、容器与仓库的本质解析

Docker 概念与容器化技术

Docker 是一种容器化平台,能够将应用程序及其依赖项打包成一个容器,确保在任何环境中都能一致运行。容器化技术通过操作系统级别的虚拟化,为应用程序提供了一个独立的运行环境。

容器化技术的核心优势
  1. 一致性:Docker 容器确保了开发、测试和生产环境的一致性,减少了环境差异带来的问题。
  2. 隔离性:每个容器都是独立运行的,互不影响,提升了系统的安全性和稳定性。
  3. 便携性:Docker 镜像可以在任何支持 Docker 的环境中运行,无需额外配置。
  4. 高效性:Docker 容器共享宿主机的内核,资源占用更少,启动速度更快。
Docker 架构概述

Docker 的架构包括以下几个核心组件:

  1. Docker Client:用户与 Docker 交互的接口,用于发送命令。
  2. Docker Daemon:后台运行的进程,负责创建、运行和管理容器。
  3. Docker Hub:Docker 镜像的中央仓库,用户可以从中拉取或推送镜像。

Docker 镜像

Docker 镜像是容器运行的基础,一个只读的模板,包含了构建容器所需的代码、配置文件和依赖项。

镜像的结构

Docker 镜像由多个层组成,每一层都是只读的,通过联合文件系统(UnionFS)叠加在一起,形成最终的文件系统。这种分层结构使得镜像的构建、存储和传输更加高效。

镜像的命名规则

Docker 镜像的命名格式为:仓库名/镜像名:标签。其中:

  • 仓库名:镜像所属的仓库,通常是用户名或组织名。
  • 镜像名:镜像的名称,通常是应用程序或服务的名称。
  • 标签 :用于标识镜像的版本或特定配置,默认为 latest
构建 Docker 镜像

Docker 镜像可以通过 Dockerfile 构建。Dockerfile 是一个文本文件,包含了一系列构建镜像的指令。

Dockerfile 示例
dockerfile 复制代码
# 使用官方 Python 镜像作为基础
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制当前目录的 requirements.txt 到工作目录
COPY requirements.txt .

# 安装依赖项
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用程序代码
COPY . .

# 暴露端口
EXPOSE 8000

# 设置环境变量
ENV PYTHONUNBUFFERED=1

# 运行命令
CMD ["python", "app.py"]
构建镜像命令
bash 复制代码
docker build -t my-python-app:latest .
镜像的存储与分发

Docker 镜像可以存储在本地,也可以推送到 Docker 仓库(如 Docker Hub)中,以便在其他环境中使用。

查看本地镜像
bash 复制代码
docker images
删除镜像
bash 复制代码
docker rmi <image-id>

Docker 容器

Docker 容器是从 Docker 镜像创建的运行实例,每个容器都是一个独立的进程,拥有自己的文件系统、网络栈和进程空间。

创建与运行容器
从镜像创建容器并运行
bash 复制代码
docker run -it --name my-container my-image:latest /bin/bash
  • -it:允许交互式 shell。
  • --name:指定容器名称。
  • /bin/bash:容器启动时执行的命令。
后台运行容器
bash 复制代码
docker run -d --name my-container my-image:latest
  • -d:后台运行。
容器的生命周期管理
查看运行中的容器
bash 复制代码
docker ps
停止容器
bash 复制代码
docker stop my-container
启动容器
bash 复制代码
docker start my-container
重启容器
bash 复制代码
docker restart my-container
删除容器
bash 复制代码
docker rm my-container
容器的资源限制

Docker 提供了多种方式来限制容器的资源使用,例如 CPU、内存等。

限制 CPU 资源
bash 复制代码
docker run -it --cpus=2 my-image:latest
限制内存资源
bash 复制代码
docker run -it --memory=512m my-image:latest
容器的网络配置

Docker 提供了多种网络模式,包括:

  1. bridge:默认模式,容器运行在独立的网络栈中,通过 Docker 的网桥进行通信。
  2. host:容器使用宿主机的网络栈。
  3. none:容器没有网络栈,适用于不需要网络通信的场景。
示例:暴露端口
bash 复制代码
docker run -p 8000:8000 my-image:latest
  • -p:将容器的 8000 端口映射到宿主机的 8000 端口。

Docker 仓库

Docker 仓库是存储和分发 Docker 镜像的地方,常用的有 Docker Hub 和私有仓库。

Docker Hub

Docker Hub 是 Docker 官方提供的公共仓库,用户可以在其中拉取和推送镜像。

从 Docker Hub 拉取镜像
bash 复制代码
docker pull python:3.9-slim
推送镜像到 Docker Hub
bash 复制代码
docker tag my-image:latest <your-username>/my-image:latest
docker push <your-username>/my-image:latest
私有仓库

私有仓库可以用于存储内部的镜像,确保安全性和控制权。

使用 Docker Registry

Docker Registry 是一个官方提供的私有仓库镜像,可以用于搭建私有仓库。

bash 复制代码
docker run -d -p 5000:5000 --name registry registry:2
推送镜像到私有仓库
bash 复制代码
docker tag my-image:latest localhost:5000/my-image:latest
docker push localhost:5000/my-image:latest
相关推荐
chen_note2 小时前
Dockerfile及其部署镜像步骤
docker·容器·镜像·dockerfile
Jy_06223 小时前
K8s中,deployment 是如何从 yaml 文件最终部署成功 pod 的
云原生·容器·kubernetes
mobº3 小时前
K8s 集群环境搭建 - yaml 版本(一)
云原生·容器·kubernetes
终端行者3 小时前
K8s中部署Minio集群 如何部署minio集群
云原生·容器·kubernetes·1024程序员节
杨浦老苏8 小时前
开源云文件存储服务器MyDrive
docker·群晖·网盘
PellyKoo8 小时前
Docker容器中中文文件名显示乱码问题完美解决方案
运维·docker·容器
无妄无望8 小时前
在没有网络的环境下安装包pymysql
学习·docker
奥尔特星云大使9 小时前
Docker 拉取 MySQL 5.7 镜像、启动容器并进入 MySQL
数据库·mysql·docker·容器
big男孩9 小时前
Docker使用环境变量的整理
docker
安卓开发者10 小时前
Docker与Nginx:现代Web部署的完美二重奏
前端·nginx·docker