在云计算飞速发展的今天,容器技术已成为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模式 :容器直接使用宿主机网络,无端口映射开销,适合对网络性能要求高的场景。
bashdocker 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 :直接挂载宿主机目录到容器,适合开发环境(实时同步代码)。
bashdocker 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 huawei1 或 docker 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.1;docker 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 net1;docker 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时遇到过哪些问题?欢迎在评论区留言交流!