从入门到实战:Docker核心技能全解析,容器化部署不再难

在云计算飞速发展的今天,容器技术已成为IT从业者必备技能,而Docker作为容器生态的核心工具,更是贯穿了开发、测试、部署全流程。无论是刚接触容器的新手,还是寻求技能进阶的工程师,掌握Docker的核心操作与实战技巧,都能大幅提升工作效率。

一、Docker核心概念:搞懂这3个词,入门就成功了一半

在动手操作前,先理清Docker的核心组件,避免陷入"会操作不会原理"的困境:

  • 容器(Container):Docker的核心运行单元,可理解为"轻量级虚拟机",包含应用及所有依赖,实现"一次构建,到处运行"。与虚拟机不同,容器共享宿主机内核,启动速度快、资源占用低。
  • 镜像(Image):容器的"模板",包含运行应用所需的代码、库、环境变量和配置文件,是只读不可修改的。
  • 仓库(Registry):存储镜像的仓库,类似代码仓库Git,分为公有仓库(如Docker Hub)和私有仓库,方便镜像的共享与分发。

二、Docker基础操作:从0到1部署你的第一个容器

掌握基础操作是使用Docker的前提,以下核心命令覆盖容器生命周期全流程,建议收藏备用:

1. 容器生命周期管理

bash 复制代码
# 创建并启动容器(--name指定名称,-d后台运行,-p端口映射)
docker run --name huawei1 -d -p 8080:80 httpd

# 查看运行中的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 启动/停止/重启容器
docker start/stop/restart huawei1

# 进入运行中的容器(-it交互模式)
docker exec -it huawei1 bash

# 删除容器(-f强制删除运行中的容器)
docker rm -f huawei1

2. 镜像操作核心命令

bash 复制代码
# 拉取镜像(从Docker Hub下载)
docker pull nginx:1.7.9

# 查看本地镜像
docker images

# 构建镜像(基于Dockerfile)
docker build -t myhttpd:v1.0 -f Dockerfile .

# 保存镜像为文件(用于离线传输)
docker save -o myhttpd.tar myhttpd:v1.0

# 加载本地镜像文件
docker load -i myhttpd.tar

实战技巧:快速排查容器问题

  • 查看容器日志:docker logs -f 容器ID(实时查看运行日志,定位启动失败原因)
  • 查看容器详情:docker inspect 容器ID(获取容器IP、挂载、网络等完整信息)

三、镜像构建:2种方式打造专属镜像

镜像构建是Docker的核心技能之一,灵活运用构建方法能满足不同场景需求:

1. docker commit:基于容器的快速构建

适合快速定制镜像,步骤简单直接:

bash 复制代码
# 1. 启动基础容器并修改
docker run -it --name temp-centos centos
# 在容器内安装依赖、配置环境...
yum install -y wget

# 2. 提交为新镜像
docker commit --author "xxx" --message "添加wget工具" temp-centos centos:wget

优点 :操作简单,适合临时定制;缺点:镜像层臃肿,无法追溯构建过程。

2. Dockerfile:标准化构建(推荐)

工业级镜像构建方式,通过文本文件定义构建流程,可版本控制、重复构建:

dockerfile 复制代码
# 基础镜像
FROM httpd
# 作者信息
MAINTAINER xxx@huawei.com
# 执行命令:修改首页内容
RUN echo "Dockerfile构建的httpd服务" > /usr/local/apache2/htdocs/index.html
# 暴露端口
EXPOSE 80

构建命令:

bash 复制代码
docker build -t httpd:custom -f Dockerfile .

核心指令说明

  • FROM:指定基础镜像(必须为第一条指令)
  • RUN:构建时执行的命令(每一条RUN创建一个镜像层)
  • COPY/ADD:复制本地文件到镜像(ADD支持解压压缩包)
  • EXPOSE:声明容器暴露的端口(仅文档说明作用)
  • CMD/ENTRYPOINT:容器启动时执行的命令(CMD可被覆盖,ENTRYPOINT不可)

四、容器网络与存储:解决数据持久化和通信问题

1. 容器网络:3种常用网络模式

Docker默认提供3种网络模式,满足不同通信需求:

  • Bridge模式 (默认):容器通过宿主机网桥连接外网,可通过端口映射对外提供服务。

    bash 复制代码
    # 创建自定义桥接网络
    docker network create --driver bridge mynet
    # 启动容器时加入网络
    docker run -d --name web1 --network mynet nginx
  • Host模式 :容器直接使用宿主机网络,无端口映射开销,适合对网络性能要求高的场景。

    bash 复制代码
    docker run -d --net=host nginx
  • None模式:容器无网络配置,适合仅需本地运行的场景(如离线任务)。

2. 容器存储:3种数据持久化方案

容器默认数据存储在可写层,容器删除后数据丢失,需通过以下方式实现持久化:

  • Volume :Docker管理的存储卷,生命周期独立于容器,适合长期存储。

    bash 复制代码
    # 创建卷
    docker volume create myvol
    # 挂载卷到容器
    docker run -d -v myvol:/usr/local/apache2/htdocs httpd
  • Bind Mount :直接挂载宿主机目录到容器,适合开发环境(实时同步代码)。

    bash 复制代码
    docker run -d -v /root/htdocs:/usr/local/apache2/htdocs:ro httpd

    (:ro表示只读挂载,防止容器修改宿主机文件)

  • Volume Container:专门用于共享数据的容器,适合多个容器共享数据场景。

五、企业级实战:搭建私有镜像仓库

在企业环境中,为保障镜像安全和传输效率,通常需要搭建私有仓库:

bash 复制代码
# 1. 启动私有仓库容器
docker run -d -p 5000:5000 -v /data/registry:/var/lib/registry registry

# 2. 镜像打标签(必须符合仓库格式)
docker tag nginx:1.7.9 192.168.1.100:5000/mynginx:v1.0

# 3. 推送镜像到私有仓库
docker push 192.168.1.100:5000/mynginx:v1.0

# 4. 从私有仓库拉取镜像
docker pull 192.168.1.100:5000/mynginx:v1.0

注意:默认私有仓库为http协议,需配置Docker信任(修改/etc/docker/daemon.json):

json 复制代码
{
  "insecure-registries": ["192.168.1.100:5000"]
}

配置后重启Docker:systemctl restart docker

六、Docker进阶:资源限制与安全

1. 资源限制:避免容器占用过多资源

通过--cpu-shares-m等参数限制容器CPU和内存使用:

bash 复制代码
# 限制容器使用1核CPU,2GB内存
docker run -d --name app --cpus 1 -m 2g nginx

# 限制CPU权重(相对值)
docker run -d --cpu-shares 512 stress --cpu 1

2. 安全最佳实践

  • 避免使用root用户运行容器:在Dockerfile中创建普通用户

  • 限制容器权限:使用--privileged=false禁用特权模式

  • 定期更新镜像:修复基础镜像的安全漏洞

  • 清理无用资源:避免镜像和容器占用过多磁盘

    bash 复制代码
    # 清理悬空镜像
    docker image prune -f
    # 清理所有停止的容器、未使用的网络和卷
    docker system prune -a

七、Docker 常用命令速查表

容器生命周期管理

命令 功能描述 示例
docker run 创建并启动容器 docker run --name httpd1 -d -p 8080:80 httpd(后台运行httpd容器,端口映射8080→80)
docker create 仅创建容器(不启动) docker create --name huawei1 httpd
docker start 启动容器(支持容器名/ID) docker start huawei1docker start 2252def20ce2
docker stop 停止容器 docker stop huawei1
docker restart 重启容器 docker restart httpd1
docker kill 强制停止容器 docker kill 9c4252c22352
docker rm 删除容器 docker rm huawei1(删除停止的容器);docker rm -f httpd1(强制删除运行中的容器)
docker pause 暂停容器 docker pause 9c4252c22352
docker unpause 恢复暂停的容器 docker unpause 9c4252c22352

容器查看与日志

命令 功能描述 示例
docker ps 查看运行中的容器 docker ps
docker ps -a 查看所有容器(含停止状态) docker ps -a
docker inspect 查看容器详细信息(IP、挂载等) docker inspect httpd1
docker logs 查看容器日志 docker logs -f httpd1(实时查看日志)
docker stats 查看容器资源占用情况 docker stats(实时监控CPU/内存/网络使用)

容器交互操作

命令 功能描述 示例
docker exec 进入运行中的容器(推荐) docker exec -it httpd1 bash(交互模式进入容器终端)
docker attach 附加到容器终端(退出会终止容器) docker attach 9c4252c22352
docker cp 容器与宿主机之间复制文件 docker cp /root/index.html httpd1:/usr/local/apache2/htdocs/(宿主机→容器)

镜像管理

命令 功能描述 示例
docker pull 从仓库拉取镜像 docker pull nginx:1.7.9(指定版本);docker pull httpd(默认latest版本)
docker images 查看本地镜像 docker images
docker rmi 删除本地镜像 docker rmi nginx:v1.1docker rmi -f httpd(强制删除)
docker commit 基于容器创建镜像 docker commit --author "xxx" --message "update index" nginx1 nginx:v1.1
docker build 基于Dockerfile构建镜像 docker build -t httpd:v11 -f dockerfile1 /root/dockerfile(-t指定标签,-f指定Dockerfile路径)
docker tag 为镜像打标签(适配仓库格式) docker tag httpd:v11 127.0.0.1:1000/michael/httpd:v11
docker save 导出镜像为文件(离线传输) docker save -o mynginx.tar nginx:1.7.9
docker load 导入本地镜像文件 docker load -i mynginx.tar

仓库操作(Registry)

命令 功能描述 示例
docker run registry 启动私有仓库容器 docker run -d -p 1000:5000 -v /root/myregistry:/var/lib/registry registry(挂载存储目录)
docker push 推送镜像到仓库 docker push 127.0.0.1:1000/michael/httpd:v11
docker pull 从私有仓库拉取镜像 docker pull 127.0.0.1:1000/michael/httpd:v11
curl 仓库地址/v2/_catalog 查看仓库中的镜像列表 curl 127.0.0.1:1000/v2/_catalog

网络管理

命令 功能描述 示例
docker network ls 查看所有网络 docker network ls
docker network create 创建网络(默认bridge模式) docker network create net1docker network create --subnet 172.10.10.0/24 net2(指定子网)
docker network connect 将容器加入网络 docker network connect net2 centos1
docker network disconnect 将容器退出网络 docker network disconnect net2 centos1
docker network inspect 查看网络详细信息 docker network inspect net1
docker network rm 删除网络 docker network rm net1

存储管理

命令 功能描述 示例
docker volume create 创建数据卷 docker volume create myvolume1
docker volume ls 查看所有数据卷 docker volume ls
docker volume inspect 查看数据卷详情 docker volume inspect myvolume1
docker volume rm 删除数据卷 docker volume rm myvolume1
docker run -v 挂载存储(卷/宿主机目录) 挂载卷:docker run -d -v myvolume1:/usr/local/apache2/htdocs httpd; 挂载宿主机目录:docker run -d -v /root/htdocs:/usr/local/apache2/htdocs:ro httpd(:ro只读权限)
docker run --volumes-from 共享其他容器的存储 docker run --name httpd3 -d -p 1003:80 --volumes-from vc httpd(复用vc容器的挂载配置)

八、资源限制(Namespace与Cgroups)

命令 功能描述 示例
docker run -h 设置容器hostname(UTS Namespace) docker run -h hwhost -it centos
docker run --cpu-shares 设置CPU权重(相对值) docker run --name huawei1 -it --cpu-shares 512 progrium/stress --cpu 1
docker run -m --memory-swap 限制内存和Swap docker run -m 400M --memory-swap=500M -dit centos /bin/bash(内存400M,Swap100M)

系统清理

命令 功能描述 示例
docker system prune 清理无用资源(容器/镜像/网络/卷) docker system prune -a(-a清理所有未使用镜像)
docker image prune 清理悬空镜像(无标签镜像) docker image prune -f(-f强制清理)
docker container prune 清理所有停止的容器 docker container prune

八、总结与展望

如果本文对你有帮助,欢迎点赞、在看、转发三连~ 你在使用Docker时遇到过哪些问题?欢迎在评论区留言交流!