Docker 从入门到精通:全流程命令与实战指南
在容器化技术普及的当下,Docker 已成为开发、测试、运维领域的必备工具。本文基于 CentOS 环境,系统梳理 Docker 的安装配置、核心命令、常用软件部署、Dockerfile 编写及私有仓库搭建,覆盖从新手入门到进阶应用的全场景,所有命令均经过实测验证,可直接复制使用。
一、Docker 基础:安装与启动
1.1 环境说明
官方推荐在 Ubuntu 中使用 Docker(更新迭代最快),本文以CentOS 7为例演示安装,适用于服务器 / 虚拟机环境。
1.2 分步安装流程
(1)更新系统依赖
bash
# 升级yum包到最新版本,确保依赖兼容sudo yum update -y
(2)安装 Docker 依赖工具
bash
# yum-utils提供yum-config-manager,后两者为devicemapper驱动依赖sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(3)配置阿里云镜像源
默认官方源速度较慢,替换为阿里云镜像加速安装:bash
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(4)安装 Docker CE(社区版)
bash
# 安装最新稳定版Dockersudo yum install -y docker-ce# 验证安装成功(显示版本号即正常)docker -v
1.3 镜像加速器配置(USTC)
USTC 镜像无需注册,适合快速配置:bash
# 编辑Docker守护进程配置文件sudo vi /etc/docker/daemon.json
在文件中添加以下内容(保存并退出esc + :wq):json
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]}
1.4 Docker 服务管理命令
| 操作目的 | 命令 | 说明 |
|---|---|---|
| 启动服务 | systemctl start docker |
service docker start 等效 |
| 停止服务 | systemctl stop docker |
停止后容器会中断运行 |
| 重启服务 | systemctl restart docker |
配置修改后需重启生效 |
| 查看状态 | systemctl status docker |
显示是否正常运行 |
| 开机自启 | systemctl enable docker |
避免服务器重启后手动启动 |
| 查看概要信息 | docker info |
包含镜像源、容器数等 |
二、Docker 核心:镜像与容器命令
2.1 镜像管理(基础操作)
镜像为容器的 “模板”,所有容器基于镜像创建,核心命令如下:
| 操作目的 | 命令 | 示例 |
|---|---|---|
| 检索镜像 | docker search [镜像名] |
docker search mysql |
| 拉取镜像 | docker pull [镜像名:版本] |
docker pull mysql:5.7.23 |
| 查看本地镜像 | docker images |
显示镜像 ID、大小、创建时间 |
| 删除单个镜像 | docker rmi [镜像ID/镜像名] |
docker rmi 84c5f6e03bf0 |
| 删除所有镜像 | docker rmi $(docker images -q) |
需先停止所有依赖容器 |
| 删除虚悬镜像 | docker rmi $(docker images grep "^<none>") |
|
| 设置镜像标签 | docker tag [原镜像名] [新镜像名:版本] |
docker tag cluster-redis cluster-redis:5.0.4 |
| 查看镜像详情 | docker inspect [镜像名:版本] |
显示镜像层、环境变量等 |
| 查看镜像历史 | docker history [镜像名:版本] |
追溯镜像构建过程 |
注意:删除镜像前需停止并删除依赖该镜像的所有容器,否则会报错。
2.2 容器管理(实战高频)
容器为镜像的 “运行实例”,支持启动、停止、进入等操作,核心命令按场景分类:
(1)容器创建与启动
bash
# 基础语法:后台启动+命名+端口映射+环境变量docker run -d --name [容器名] -p [宿主机端口:容器端口] -e [键=值] [镜像名]# 示例:启动MySQL容器(映射3306端口,设置root密码123456)docker run -di --name=docker_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.23
参数说明:
-d:后台运行容器(守护态)-i:保持标准输入打开(交互模式)-t:分配虚拟终端(常用-it组合进入交互界面)--name:自定义容器名(默认随机生成)-p:端口映射(宿主机端口对外提供服务,容器端口为内部端口)-v:目录挂载(见下文 “数据持久化”)
(2)容器状态管理
| 操作目的 | 命令 | 示例 |
|---|---|---|
| 查看运行中容器 | docker ps |
仅显示 Up 状态的容器 |
| 查看所有容器 | docker ps -a |
包含 Exited(停止)、Created(未启动)状态 |
| 启动容器 | docker start [容器ID/容器名] |
docker start docker_mysql |
| 停止容器 | docker stop [容器ID/容器名] |
docker stop docker_mysql |
| 重启容器 | docker restart [容器ID/容器名] |
docker restart docker_mysql |
| 删除容器 | docker rm [容器ID/容器名] |
docker rm docker_mysql |
| 强制删除容器 | docker rm -f [容器ID/容器名] |
强制删除运行中的容器 |
(3)容器交互与数据操作
- 进入运行中容器(常用
/bin/bash终端):
bash
docker exec -it [容器ID/容器名] /bin/bash# 示例:进入MySQL容器docker exec -it docker_mysql /bin/bash
注意:
exec不会启动新容器,attach会进入容器的主进程,推荐用exec避免退出容器后进程终止。
- 文件拷贝(宿主机与容器互传):
bash
# 宿主机→容器:宿主机路径 容器名:容器内路径docker cp /local/file.txt docker_mysql:/root/# 容器→宿主机:容器名:容器内路径 宿主机路径docker cp docker_mysql:/root/file.txt /local/
- 目录挂载(数据持久化,避免容器删除后数据丢失):
bash
# 语法:-v 宿主机目录:容器内目录docker run -di -v /usr/local/mysql/data:/var/lib/mysql --name=docker_mysql -p 3306:3306 mysql:5.7.23
注意:CentOS 7 需加
--privileged=true解决挂载目录权限问题(如docker run -di --privileged=true -v /local:/container ...)。
(4)容器信息查询
- 查看容器 IP 地址:
bash
# 方式1:查看完整信息(在NetworkSettings.IPAddress字段)docker inspect docker_mysql# 方式2:直接输出IPdocker inspect --format '{{.NetworkSettings.IPAddress}}' docker_mysql
- 查看容器日志(排查问题必备):
bash
# 语法:docker logs [参数] 容器名# 示例1:查看最近30分钟日志docker logs --since 30m docker_mysql# 示例2:实时查看日志(-f跟踪,-t显示时间)docker logs -ft --tail=10 docker_mysql
(5)网络配置(容器间通信)
创建自定义虚拟网卡,实现容器与宿主机、容器间的网络互通:bash
# 创建名为redis-net的网卡docker create network redis-net# 查看所有网卡docker network ls# 启动容器时指定网卡(示例:Redis容器加入redis-net)docker run -di --name=myredis --net redis-net -p 6379:6379 redis
三、实战部署:常用软件 Docker 化
基于上述命令,实战部署 6 类高频软件,步骤统一为 “拉取镜像→创建容器→验证启动”。
3.1 MySQL 部署
bash
# 1. 拉取镜像(指定5.7版本,避免最新版兼容性问题)docker pull mysql:5.7.23# 2. 创建容器(挂载数据目录+设置密码)docker run -di --name=docker_mysql -p 3306:3306 -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.23# 3. 验证:宿主机执行mysql客户端连接mysql -h 127.0.0.1 -u root -p 123456
3.2 Tomcat 部署
bash
# 1. 拉取镜像(指定7-jre7版本,轻量且稳定)docker pull tomcat:7-jre7# 2. 创建容器(挂载webapps目录,方便部署项目)docker run -di --name=docker_tomcat -p 8080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7# 3. 验证:浏览器访问 http://宿主机IP:8080
3.3 Nginx 部署
bash
# 1. 拉取最新版Nginxdocker pull nginx# 2. 创建容器(映射80端口,挂载配置文件和静态资源)docker run -di --name=docker_nginx -p 80:80 -v /usr/local/nginx/conf:/etc/nginx -v /usr/local/nginx/html:/usr/share/nginx/html nginx# 3. 验证:浏览器访问 http://宿主机IP,显示Nginx默认页面
3.4 Redis 部署(单节点 + 集群)
(1)单节点部署
bash
docker pull redisdocker run -di --name=myredis -p 6379:6379 redis# 验证:宿主机执行redis-cli连接redis-cli -h 127.0.0.1 -p 6379
(2)Redis 集群部署(6 节点:3 主 3 从)
bash
# 1. 创建6个Redis节点(指定集群配置+密码)for port in $(seq 6379 6384); dodocker create --name redis-node$port --net host -v redis-node$port:/data redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-$port.conf --port $port --requirepass "123456" --cluster-announce-ip 192.168.1.100(宿主机IP)done# 2. 启动所有节点docker start redis-node6379 redis-node6380 redis-node6381 redis-node6382 redis-node6383 redis-node6384# 3. 进入任意节点,初始化集群(--cluster-replicas 1表示1主1从)docker exec -it redis-node6379 /bin/bashredis-cli -u redis://:123456@192.168.1.100:6379 --cluster create 192.168.1.100:6379 192.168.1.100:6380 192.168.1.100:6381 192.168.1.100:6382 192.168.1.100:6383 192.168.1.100:6384 --cluster-replicas 1# 4. 验证集群状态redis-cli -u redis://:123456@192.168.1.100:6379 cluster nodes
3.5 MongoDB 部署
bash
# 1. 拉取镜像docker pull mongo# 2. 创建容器(挂载数据目录+自启动)docker run -di --name=docker_mongo --restart=always -p 27017:27017 -v /usr/local/mongo/data:/data/db mongo# 3. 设置用户认证(进入容器执行)docker exec -it docker_mongo /bin/bashmongo # 进入MongoShelluse admin# 创建root用户(拥有所有数据库权限)db.createUser({user:"root",pwd:"123456",roles:["userAdminAnyDatabase"]})db.auth("root","123456") # 验证登录
3.6 RocketMQ 部署(Server+Broker+Console)
bash
# 1. 拉取所需镜像docker pull foxiswho/rocketmq:server-4.3.2docker pull foxiswho/rocketmq:broker-4.3.2docker pull styletang/rocketmq-console-ng:1.0.0# 2. 启动NameServerdocker run -di --name=rmqserver -p 9876:9876 -e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" foxiswho/rocketmq:server-4.3.2# 3. 配置Broker(创建配置文件)mkdir -p /usr/local/rocketmq/confvi /usr/local/rocketmq/conf/broker.conf# 写入以下内容(替换宿主机IP)brokerIP1=192.168.1.100namesrvAddr=192.168.1.100:9876brokerName=broker_tanhua# 4. 启动Brokerdocker run -di --name=rmqbroker -p 10911:10911 -p 10909:10909 -v /usr/local/rocketmq/conf/broker.conf:/etc/rocketmq/broker.conf foxiswho/rocketmq:broker-4.3.2# 5. 启动管理控制台(浏览器访问)docker run -di --name=rmqconsole -p 8080:8080 -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.1.100:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" styletang/rocketmq-console-ng:1.0.0# 验证:浏览器访问 http://宿主机IP:8080
四、进阶操作:Dockerfile 与私有仓库
4.1 Dockerfile:自定义镜像
Dockerfile 是构建镜像的 “脚本”,通过指令定义基础镜像、依赖安装、环境配置等步骤。
(1)核心指令表
| 指令 | 作用 | 示例 |
|---|---|---|
FROM |
指定基础镜像 | FROM centos:7 |
WORKDIR |
设置工作目录(后续命令的执行路径) | WORKDIR /usr/local |
ADD/COPY |
复制文件(ADD 支持解压 / URL,COPY 仅本地) | ADD jdk.tar.gz /usr/local/java |
ENV |
设置环境变量(容器内生效) | ENV JAVA_HOME /usr/local/java |
RUN |
构建时执行命令(可多条) | RUN yum install -y gcc |
EXPOSE |
声明容器暴露端口(仅文档作用) | EXPOSE 8080 |
CMD |
容器启动时执行命令(可被覆盖) | CMD ["java", "-jar", "app.jar"] |
ENTRYPOINT |
容器启动时执行命令(不可被覆盖) | ENTRYPOINT ["java", "-jar"] |
(2)实战:构建 JDK 8 镜像
- 准备文件:
- 新建目录:
mkdir -p /usr/local/dockerjdk8 - 上传 JDK 压缩包:
jdk-8u171-linux-x64.tar.gz到
