【容器化】Docker容器技术入门基础教程
Docker
容器技术
Docker 是一种开源的容器化平台,通过轻量级的虚拟化技术,帮助开发者高效地构建、部署和运行应用程序。它解决了传统环境配置复杂、依赖管理困难以及资源利用率低的问题。Docker 基于 Linux 容器(LXC) 技术,利用内核的 Cgroup(资源隔离) 和 命名空间(进程隔离) 实现应用的独立运行环境。与传统虚拟机(VM)不同,容器无需模拟完整的操作系统,仅包含应用程序及其依赖项。
Docker与虚拟机的区别
- 资源占用更少:容器共享宿主机的操作系统内核,避免冗余的系统资源消耗(如虚拟机需为每个实例分配独立操作系统内存) 。
- 启动速度更快:容器启动仅需几秒,而虚拟机通常需要几分钟。
- 可移植性强:容器可在任何支持 Docker 的环境中一致运行,实现“一次构建,随处运行”。
虚拟机使用的是Hypervisor(KVM、Xen等),那么,容器是怎么实现和下层计算机硬件和操作系统交互的呢?为什么它会具有高效轻便的隔离特性呢?
Linux操作系统内核之中,为资源隔离提供了三种技术:namespace
、cgroup
、chroot
。
- 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
ARG
、ENV
它们区别在于 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发行版的命名方式“花样”太多了。
另外,有的标签还会加上 slim
、fat
,来进一步表示这个镜像的内容是经过精简的,还是包含了较多的辅助工具。
通常 slim
镜像会比较小,运行效率高,而 fat
镜像会比较大,适合用来开发调试。
-
Docker Hub
注册; -
docker tag
打上标签再用docker push
推送; -
离线环境,镜像归档
docker save
把镜像存成压缩包,再用docker load
从压缩包恢复成镜像。
docker save ngx-app:latest -o ngx.tar
docker load -i ngx.tar
容器
容器(Container)是镜像的运行实例,是动态的、隔离的轻量级环境。容器可启动、停止、删除,且相互隔离。
共享主机文件
-
拷贝文件
docker cp
的用法模仿了操作系统的拷贝命令。 -
共享文件
docker run
命令启动容器的时候使用-v
参数就行,具体的格式是“宿主机路径:容器内路径”。
配置网络互通
Docker提供了三种网络模式,分别是null、host和bridge。
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 等场景中广泛应用,彻底改变了传统虚拟机主导的部署模式。