当前位置: 首页 > news >正文

【容器化】Docker容器技术入门基础教程

Docker容器技术

Docker 是一种开源的容器化平台,通过轻量级的虚拟化技术,帮助开发者高效地构建、部署和运行应用程序。它解决了传统环境配置复杂、依赖管理困难以及资源利用率低的问题。Docker 基于 Linux 容器(LXC) 技术,利用内核的 Cgroup(资源隔离) 和 命名空间(进程隔离) 实现应用的独立运行环境。与传统虚拟机(VM)不同,容器无需模拟完整的操作系统,仅包含应用程序及其依赖项。

Docker与虚拟机的区别

  • 资源占用更少:容器共享宿主机的操作系统内核,避免冗余的系统资源消耗(如虚拟机需为每个实例分配独立操作系统内存) 。
  • 启动速度更快:容器启动仅需几秒,而虚拟机通常需要几分钟。
  • 可移植性强:容器可在任何支持 Docker 的环境中一致运行,实现“一次构建,随处运行”。

虚拟机使用的是Hypervisor(KVM、Xen等),那么,容器是怎么实现和下层计算机硬件和操作系统交互的呢?为什么它会具有高效轻便的隔离特性呢?

Linux操作系统内核之中,为资源隔离提供了三种技术:namespacecgroupchroot

  • namespace是2002年从Linux 2.4.19开始出现的,和编程语言里的namespace有点类似,它可以创建出独立的文件系统、主机名、进程号、网络等资源空间,相当于给进程盖了一间小板房,这样就实现了系统全局资源和进程局部资源的隔离。
  • cgroup是2008年从Linux 2.6.24开始出现的,它的全称是Linux Control Group,用来实现对进程的CPU、内存等资源的优先级和配额限制,相当于给进程的小板房加了一个天花板。
  • chroot的历史则要比前面的namespace、cgroup要古老得多,早在1979年的UNIX V7就已经出现了,它可以更改进程的根目录,也就是限制访问文件系统,相当于给进程的小板房铺上了地砖。

Docker的架构

Docker的命令

常用镜像操作命令清单

镜像

镜像(Image)是静态模板,包含应用程序运行所需的所有文件、库和依赖项。例如,一个 Python 应用的镜像可能包含代码、Python 解释器及第三方库。

创建容器镜像:如何编写正确、高效的Dockerfile

Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义的镜像。

最简单的Dockerfile实例:

# Dockerfile.busybox
# 选择基础镜像
FROM busybox
# 启动容器时默认运行的命令                  
CMD echo "hello world"        
docker build -f Dockerfile.busybox .Sending build context to Docker daemon   7.68kB
Step 1/2 : FROM busybox---> d38589532d97
Step 2/2 : CMD echo "hello world"---> Running in c5a762edd1c8
Removing intermediate container c5a762edd1c8---> b61882f42db7
Successfully built b61882f42db7

RUN、COPY

# 拷贝脚本到/tmp目录
COPY setup.sh  /tmp/                # 添加执行权限
# 运行脚本然后再删除
RUN cd /tmp && chmod +x setup.sh \  && ./setup.sh && rm setup.sh    

ARGENV

它们区别在于 ARG 创建的变量只在镜像构建过程中可见,容器运行时不可见,

ENV 创建的变量不仅能够在构建镜像的过程中使用,在容器运行时也能够以环境变量的形式被应用程序使用。

ARG IMAGE_BASE="node"
ARG IMAGE_TAG="alpine"ENV PATH=$PATH:/tmp
ENV DEBUG=OFF

EXPOSE

声明容器对外服务的端口号

# 默认是tcp协议
EXPOSE 443 
# 可以指定udp协议         
EXPOSE 53/udp        

Docker Hub镜像命名规则

镜像标签的格式是应用的版本号加上操作系统

版本号基本上都是主版本号+次版本号+补丁号的形式,有的还会在正式发布前出rc版(候选版本,release candidate)。而操作系统的情况略微复杂一些,因为各个Linux发行版的命名方式“花样”太多了。

另外,有的标签还会加上 slimfat,来进一步表示这个镜像的内容是经过精简的,还是包含了较多的辅助工具

通常 slim 镜像会比较小,运行效率高,而 fat 镜像会比较大,适合用来开发调试。

  1. Docker Hub注册;

  2. docker tag 打上标签再用 docker push 推送;

  3. 离线环境,镜像归档docker save 把镜像存成压缩包,再用 docker load 从压缩包恢复成镜像。

docker save ngx-app:latest -o ngx.tar
docker load -i ngx.tar

容器

容器(Container)是镜像的运行实例,是动态的、隔离的轻量级环境。容器可启动、停止、删除,且相互隔离。

共享主机文件

  1. 拷贝文件 docker cp 的用法模仿了操作系统的拷贝命令。

  2. 共享文件 docker run 命令启动容器的时候使用 -v 参数就行,具体的格式是“宿主机路径:容器内路径”。

配置网络互通

Docker提供了三种网络模式,分别是nullhostbridge

null是最简单的模式,也就是没有网络,但允许其他的网络插件来自定义网络连接。

host的意思是直接使用宿主机网络,相当于去掉了容器的网络隔离(其他隔离依然保留),所有的容器会共享宿主机的IP地址和网卡。这种模式没有中间层,自然通信效率高,但缺少了隔离,运行太多的容器也容易导致端口冲突。

ip addr                    # 本机查看网卡
docker exec xxx ip addr    # 容器查看网卡

bridge,也就是桥接模式,它有点类似现实世界里的交换机、路由器,只不过是由软件虚拟出来的,容器和宿主机再通过虚拟网卡接入这个网桥(图中的docker0),那么它们之间也就可以正常的收发网络数据包了。不过和host模式相比,bridge模式多了虚拟网桥和网卡,通信效率会低一些。

分配服务端口

docker run -d -p 8080:80

镜像仓库

仓库(Repository)是存储和管理镜像的服务,如 Docker Hub,支持版本控制和镜像共享。

搭建私有镜像仓库

本次选择Docker Registry,当然也可以选择功能更完善的CNCF Harbor。

docker pull registry
docker run -d -p 5000:5000 registrydocker tag busybox:latest 127.0.0.1:5000/busybox:latest
docker images
docker push 127.0.0.1:5000/busybox:latest

接下来就可以docker pull拉取自己上传的镜像了。

docker rmi  127.0.0.1:5000/busybox:latest
docker pull 127.0.0.1:5000/busybox:latest

Docker Registry虽然没有图形界面,但提供了RESTful API,也可以发送HTTP请求来查看仓库里的镜像,

具体的端点信息可以参考官方文档(Deprecated products and features | Docker Docs),

下面的这两条curl命令就分别获取了镜像列表和Nginx镜像的标签列表:

base) [root@dev-compile-xs-3-147 ~]# curl 127.1:5000/v2/_catalog
{"repositories":["busybox"]}
(base) [root@dev-compile-xs-3-147 ~]# curl 127.1:5000/v2/busybox/tags/list
{"name":"busybox","tags":["latest"]}

核心优势

  • 环境一致性:开发、测试、生产环境统一,避免“在我机器上能跑”的问题。
  • 高效资源利用:相比虚拟机,容器占用内存和存储更小(通常以兆字节计),单台主机可运行更多容器。
  • 快速部署与迭代:支持持续集成/持续部署(CI/CD),开发者可频繁发布更新,且回滚简便(通过镜像版本控制实现)。
  • 微服务友好:每个微服务可独立打包为容器,便于分布式系统的灵活扩展与管理。

典型场景

  • 微服务架构:将用户服务、支付服务等拆分为独立容器,提升系统的可维护性和扩展性。
  • 测试环境搭建:测试人员可快速部署隔离的容器环境,避免依赖冲突,如使用 Docker 搭建 Selenium 自动化测试环境。
  • 云原生与混合云部署:与 Kubernetes 等编排工具结合,实现跨云平台的应用调度与管理。
  • 简化运维:运维人员可通过容器化统一部署流程,降低环境配置复杂度。

应用案例

Docker搭建WordPress个人博客站点

default.conf

server {listen 80;default_type text/html;location / {proxy_http_version 1.1;proxy_set_header Host $host;proxy_pass http://web:80;}
}

docker-compose.yaml

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,用户可以使用 docker-compose.yml 配置文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务,主要用于开发、测试和部署多容器的应用。如果你还不了解 YML 文件配置,可以先阅读 YAML 入门教程

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
services:db:image: mariadb:10environment:- MARIADB_DATABASE=db- MARIADB_USER=wp- MARIADB_PASSWORD=123- MARIADB_ROOT_PASSWORD=123networks:- mynetworkhealthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]interval: 5stimeout: 10sretries: 5web:image: wordpress:5environment:- WORDPRESS_DB_HOST=db- WORDPRESS_DB_USER=wp- WORDPRESS_DB_PASSWORD=123- WORDPRESS_DB_NAME=dbnetworks:- mynetworkproxy:image: nginx:alpineports:- "80:80"volumes:- ./default.conf:/etc/nginx/conf.d/default.confnetworks:- mynetworknetworks:mynetwork:driver: bridge

执行命令

docker-compose -p wp down -v && docker-compose -p wp up -d

 验证

# 初始化
http://localhost/wp-admin/install.php
# 登录
http://localhost/wp-login.php  

总结

Docker 生态包含 Docker Engine(核心运行时)、Docker Compose(多容器应用定义)、Docker Swarm(集群管理)等工具,并与 AWS、Azure 等云服务商深度集成,进一步简化大规模容器管理。

Docker 通过容器技术革新了软件交付方式,成为云原生时代的基础设施。其轻量、快速、一致性的特点,使其在微服务、CI/CD、DevOps 等场景中广泛应用,彻底改变了传统虚拟机主导的部署模式。

相关文章:

  • 端口隔离基本配置
  • 如何保障服务器租用中的数据安全?
  • ‌2.4GHz无线通信天线布局与优化方法
  • 基于C++的IOT网关和平台7:github项目ctGateway设备协议开发指南
  • AutoDL+SSH在vscode中远程使用GPU训练深度学习模型
  • 论文AI率降低 教程(包过)
  • 分布式、高并发-Day03
  • 人工智能与智能合约:如何用AI优化区块链技术中的合约执行?
  • Paramiko 性能优化详解
  • 生成了一个AI算法
  • 华为设备端口隔离
  • 【Azure Redis】Redis导入备份文件(RDB)失败的原因
  • NVIDIA Halos:智能汽车革命中的全栈式安全系统
  • Selenium模拟人类,操作网页的行为(全)
  • 强啊!Oracle Database 23aiOracle Database 23ai:使用列别名进行分组排序!
  • Oracle04-基本使用
  • 26届秋招收割offer指南
  • JavaScript性能优化实战:深入探讨性能瓶颈与优化技巧
  • 嵌入式面试八股文(十四)·内存管理机制、优先级继承机制以及优先级翻转
  • 多行文本省略
  • 吴清:加强监管的同时传递监管温度,尽力帮助受影响企业应对美加征关税的冲击
  • 同为“东部重要中心城市”后交出首份季报:宁杭苏表现如何?
  • 德国新一届联邦政府宣誓就职
  • 习近平致电祝贺默茨当选德国联邦总理
  • 赵乐际:深入学习贯彻习近平生态文明思想,推动森林法全面有效贯彻实施
  • 起底新型保健品电话销售诈骗:从快递信息中筛选对象,忽悠其高价买药