Docker 从入门到精通:全流程命令与实战指南

在容器化技术普及的当下,Docker 已成为开发、测试、运维领域的必备工具。本文基于 CentOS 环境,系统梳理 Docker 的安装配置、核心命令、常用软件部署、Dockerfile 编写及私有仓库搭建,覆盖从新手入门到进阶应用的全场景,所有命令均经过实测验证,可直接复制使用。

一、Docker 基础:安装与启动

1.1 环境说明

官方推荐在 Ubuntu 中使用 Docker(更新迭代最快),本文以CentOS 7为例演示安装,适用于服务器 / 虚拟机环境。

1.2 分步安装流程

(1)更新系统依赖

bash

  1. # 升级yum包到最新版本,确保依赖兼容
  2. sudo yum update -y

(2)安装 Docker 依赖工具

bash

  1. # yum-utils提供yum-config-manager,后两者为devicemapper驱动依赖
  2. sudo yum install -y yum-utils device-mapper-persistent-data lvm2

(3)配置阿里云镜像源

默认官方源速度较慢,替换为阿里云镜像加速安装:bash

  1. sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(4)安装 Docker CE(社区版)

bash

  1. # 安装最新稳定版Docker
  2. sudo yum install -y docker-ce
  3. # 验证安装成功(显示版本号即正常)
  4. docker -v

1.3 镜像加速器配置(USTC)

USTC 镜像无需注册,适合快速配置:bash

  1. # 编辑Docker守护进程配置文件
  2. sudo vi /etc/docker/daemon.json

在文件中添加以下内容(保存并退出esc + :wq):json

  1. {
  2. "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
  3. }

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

  1. # 基础语法:后台启动+命名+端口映射+环境变量
  2. docker run -d --name [容器名] -p [宿主机端口:容器端口] -e [键=值] [镜像名]
  3. # 示例:启动MySQL容器(映射3306端口,设置root密码123456)
  4. 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

  1. docker exec -it [容器ID/容器名] /bin/bash
  2. # 示例:进入MySQL容器
  3. docker exec -it docker_mysql /bin/bash

注意:exec 不会启动新容器,attach 会进入容器的主进程,推荐用exec 避免退出容器后进程终止。

  • 文件拷贝(宿主机与容器互传):

bash

  1. # 宿主机→容器:宿主机路径 容器名:容器内路径
  2. docker cp /local/file.txt docker_mysql:/root/
  3. # 容器→宿主机:容器名:容器内路径 宿主机路径
  4. docker cp docker_mysql:/root/file.txt /local/
  • 目录挂载(数据持久化,避免容器删除后数据丢失):

bash

  1. # 语法:-v 宿主机目录:容器内目录
  2. 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. # 方式1:查看完整信息(在NetworkSettings.IPAddress字段)
  2. docker inspect docker_mysql
  3. # 方式2:直接输出IP
  4. docker inspect --format '{{.NetworkSettings.IPAddress}}' docker_mysql
  • 查看容器日志(排查问题必备):

bash

  1. # 语法:docker logs [参数] 容器名
  2. # 示例1:查看最近30分钟日志
  3. docker logs --since 30m docker_mysql
  4. # 示例2:实时查看日志(-f跟踪,-t显示时间)
  5. docker logs -ft --tail=10 docker_mysql

(5)网络配置(容器间通信)

创建自定义虚拟网卡,实现容器与宿主机、容器间的网络互通:bash

  1. # 创建名为redis-net的网卡
  2. docker create network redis-net
  3. # 查看所有网卡
  4. docker network ls
  5. # 启动容器时指定网卡(示例:Redis容器加入redis-net)
  6. docker run -di --name=myredis --net redis-net -p 6379:6379 redis

三、实战部署:常用软件 Docker 化

基于上述命令,实战部署 6 类高频软件,步骤统一为 “拉取镜像→创建容器→验证启动”。

3.1 MySQL 部署

bash

  1. # 1. 拉取镜像(指定5.7版本,避免最新版兼容性问题)
  2. docker pull mysql:5.7.23
  3. # 2. 创建容器(挂载数据目录+设置密码)
  4. 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
  5. # 3. 验证:宿主机执行mysql客户端连接
  6. mysql -h 127.0.0.1 -u root -p 123456

3.2 Tomcat 部署

bash

  1. # 1. 拉取镜像(指定7-jre7版本,轻量且稳定)
  2. docker pull tomcat:7-jre7
  3. # 2. 创建容器(挂载webapps目录,方便部署项目)
  4. docker run -di --name=docker_tomcat -p 8080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
  5. # 3. 验证:浏览器访问 http://宿主机IP:8080

3.3 Nginx 部署

bash

  1. # 1. 拉取最新版Nginx
  2. docker pull nginx
  3. # 2. 创建容器(映射80端口,挂载配置文件和静态资源)
  4. 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
  5. # 3. 验证:浏览器访问 http://宿主机IP,显示Nginx默认页面

3.4 Redis 部署(单节点 + 集群)

(1)单节点部署

bash

  1. docker pull redis
  2. docker run -di --name=myredis -p 6379:6379 redis
  3. # 验证:宿主机执行redis-cli连接
  4. redis-cli -h 127.0.0.1 -p 6379

(2)Redis 集群部署(6 节点:3 主 3 从)

bash

  1. # 1. 创建6个Redis节点(指定集群配置+密码)
  2. for port in $(seq 6379 6384); do
  3. docker 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
  4. done
  5. # 2. 启动所有节点
  6. docker start redis-node6379 redis-node6380 redis-node6381 redis-node6382 redis-node6383 redis-node6384
  7. # 3. 进入任意节点,初始化集群(--cluster-replicas 1表示1主1从)
  8. docker exec -it redis-node6379 /bin/bash
  9. redis-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
  10. # 4. 验证集群状态
  11. redis-cli -u redis://:123456@192.168.1.100:6379 cluster nodes

3.5 MongoDB 部署

bash

  1. # 1. 拉取镜像
  2. docker pull mongo
  3. # 2. 创建容器(挂载数据目录+自启动)
  4. docker run -di --name=docker_mongo --restart=always -p 27017:27017 -v /usr/local/mongo/data:/data/db mongo
  5. # 3. 设置用户认证(进入容器执行)
  6. docker exec -it docker_mongo /bin/bash
  7. mongo # 进入MongoShell
  8. use admin
  9. # 创建root用户(拥有所有数据库权限)
  10. db.createUser({user:"root",pwd:"123456",roles:["userAdminAnyDatabase"]})
  11. db.auth("root","123456") # 验证登录

3.6 RocketMQ 部署(Server+Broker+Console)

bash

  1. # 1. 拉取所需镜像
  2. docker pull foxiswho/rocketmq:server-4.3.2
  3. docker pull foxiswho/rocketmq:broker-4.3.2
  4. docker pull styletang/rocketmq-console-ng:1.0.0
  5. # 2. 启动NameServer
  6. docker run -di --name=rmqserver -p 9876:9876 -e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" foxiswho/rocketmq:server-4.3.2
  7. # 3. 配置Broker(创建配置文件)
  8. mkdir -p /usr/local/rocketmq/conf
  9. vi /usr/local/rocketmq/conf/broker.conf
  10. # 写入以下内容(替换宿主机IP)
  11. brokerIP1=192.168.1.100
  12. namesrvAddr=192.168.1.100:9876
  13. brokerName=broker_tanhua
  14. # 4. 启动Broker
  15. docker 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
  16. # 5. 启动管理控制台(浏览器访问)
  17. 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
  18. # 验证:浏览器访问 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 镜像

  1. 准备文件
  • 新建目录:mkdir -p /usr/local/dockerjdk8
  • 上传 JDK 压缩包:jdk-8u171-linux-x64.tar.gz