Docker 从入门到实战系列(二):镜像与容器核心操作命令
在上一篇文章中,我们完成了 Docker 的核心概念认知和 CentOS 7 下的环境搭建,而 Docker 的日常使用,核心围绕镜像和容器展开:镜像是应用的 “模板”,容器是镜像的 “运行实例”,掌握二者的操作命令,是使用 Docker 的基础。本文作为系列第二篇,将详细讲解 Docker 镜像和容器的所有常用命令,包括基础操作、进阶使用,同时讲解网络映射、数据卷挂载等核心功能,让你轻松上手 Docker 的日常操作。
一、Docker 基础通用命令
在学习镜像和容器命令前,先掌握几个 Docker 的通用命令,用于查看信息、获取帮助,这是日常排错和学习的基础:
# 查看Docker版本信息(客户端+服务端) docker version # 查看Docker系统信息,包括镜像、容器数量,内核版本等 docker info # 查看Docker命令的帮助文档,可接具体命令(如docker images --help) docker 命令 --help Docker 的官方帮助文档非常详细,地址:https://docs.docker.com/engine/reference/commandline/docker/,遇到不懂的命令可随时查阅。
二、Docker 镜像核心操作命令
镜像是 Docker 的基础,所有容器都基于镜像创建,镜像的操作主要包括查看、搜索、拉取、删除四大核心,以下为详细命令及使用示例。
1. 查看本地镜像:docker images
# 基础命令:查看本地所有已下载的镜像 docker images # 可选参数 -a # 列出所有镜像(包括中间层镜像,一般无需使用) -q # 只显示镜像的ID,常用于批量删除镜像 执行docker images后,终端会显示 5 列信息:
- REPOSITORY:镜像的仓库源(如 hello-world、mysql、tomcat);
- TAG:镜像的标签(用于区分版本,如 latest、5.7、8.5,latest 表示最新版);
- IMAGE ID:镜像的唯一 ID(唯一标识一个镜像,可通过 ID 操作镜像);
- CREATED:镜像的创建时间;
- SIZE:镜像的大小。
2. 搜索仓库中的镜像:docker search
用于在 Docker Hub(或配置的国内仓库)中搜索指定名称的镜像,语法:docker search 镜像名
# 示例:搜索mysql镜像 docker search mysql 执行后会显示镜像的名称、描述、星级(STARS)、是否官方(OFFICIAL)、是否自动构建(AUTOMATED),优先选择官方(OFFICIAL) 镜像,安全性和稳定性更高。
3. 拉取(下载)镜像:docker pull
从配置的镜像仓库中下载指定镜像到本地,语法:docker pull 镜像名:标签,标签不写默认拉取 latest(最新版)。
# 示例1:拉取mysql最新版镜像(默认tag=latest) docker pull mysql # 示例2:拉取mysql5.7版本镜像(指定标签,推荐生产环境使用) docker pull mysql:5.7 # 示例3:拉取tomcat8.5版本镜像 docker pull tomcat:8.5 Docker 的镜像采用分层下载(联合文件系统),下载新版本时,只会下载与老版本不同的层,节省磁盘空间和下载时间。
4. 删除本地镜像:docker rmi
删除本地指定的镜像,语法:docker rmi -f 镜像名/镜像ID,-f表示强制删除(若镜像有运行的容器,需先停止容器再删除)。
# 示例1:通过镜像ID删除单个镜像 docker rmi -f 1b6b1fe7261e # 示例2:通过镜像名:标签删除单个镜像 docker rmi -f mysql:5.7 # 示例3:删除多个镜像,用空格分隔ID/名称 docker rmi -f 镜像ID1 镜像ID2 镜像名3:标签 # 示例4:删除本地所有镜像(慎用!) docker rmi -f $(docker images -aq) $(docker images -aq)表示获取本地所有镜像的 ID,结合docker rmi -f实现批量删除。
三、Docker 容器核心操作命令
容器是镜像的运行实例,应用的实际运行在容器中完成,容器的操作比镜像更丰富,核心包括查看、创建、启动、停止、进入、退出、删除,同时还有日志查看、进程查看等进阶操作,以下为详细命令及使用示例。
前置说明:容器的两种运行状态
Docker 容器有两种核心运行状态,对应不同的创建命令,日常使用中需根据需求选择:
- 前台交互式运行:容器启动后,进入容器的交互终端,关闭终端则容器停止,适用于调试容器;
- 后台守护式运行:容器启动后,在后台运行,不占用终端,适用于生产环境运行应用。
1. 查看容器:docker ps
# 基础命令:查看当前正在运行的容器 docker ps # 可选参数 -a # 查看所有容器(包括运行中、已停止的) -q # 只显示容器的ID,常用于批量删除容器 -l # 查看最近创建的一个容器 执行docker ps后,终端会显示 7 列信息:
- CONTAINER ID:容器的唯一 ID;
- IMAGE:容器基于的镜像名;
- COMMAND:容器启动时执行的命令;
- CREATED:容器的创建时间;
- STATUS:容器的状态(Up:运行中,Exited:已停止);
- PORTS:容器的端口映射关系;
- NAMES:容器的名称(创建时可指定,未指定则 Docker 自动生成)。
2. 创建并启动容器:docker run
这是最核心的容器命令,语法:docker run [可选参数] 镜像名 [容器内执行的命令],核心可选参数是重点,需熟练掌握。
核心可选参数(必记)
--name="容器名" # 为容器指定一个自定义名称,避免Docker自动生成,便于识别 -d # 后台守护式运行容器(生产环境首选) -it # 前台交互式运行,进入容器的交互终端(/bin/bash) -p # 指定端口映射,格式:宿主机端口:容器端口(核心,实现外网访问容器) -P # 随机端口映射,Docker随机分配一个宿主机端口映射到容器的暴露端口 -v # 数据卷挂载,格式:宿主机目录:容器目录(核心,实现宿主机与容器文件共享) -e # 设置容器的环境变量(如设置mysql的root密码:-e MYSQL_ROOT_PASSWORD=123456) 常用创建示例
# 示例1:前台交互式创建tomcat容器,指定名称tomcat01,进入/bin/bash终端 docker run -it --name tomcat01 tomcat /bin/bash # 示例2:后台守护式创建tomcat容器,指定名称tomcat02,端口映射8080:8080 docker run -itd --name tomcat02 -p 8080:8080 tomcat # 示例3:创建mysql5.7容器,后台运行,端口3306:3306,设置root密码,数据卷挂载 docker run -itd --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/data:/var/lib/mysql mysql:5.7 3. 停止容器:docker stop
停止正在运行的容器,语法:docker stop 容器ID/容器名
# 示例:停止容器tomcat02 docker stop tomcat02 # 强制停止容器(适用于容器无响应时,慎用) docker kill 容器ID/容器名 4. 启动已停止的容器:docker start
启动之前创建并停止的容器,语法:docker start 容器ID/容器名
# 示例:启动已停止的tomcat02 docker start tomcat02 5. 重启容器:docker restart
重启运行中或已停止的容器,语法:docker restart 容器ID/容器名
# 示例:重启tomcat02 docker restart tomcat02 6. 进入运行中的容器:docker exec /docker attach
当容器以-d(后台)方式运行时,需要进入容器内部进行操作,有两种命令,推荐使用 docker exec,二者的核心区别:
docker exec:在容器中开启一个新的终端,执行命令,退出终端不影响容器运行;docker attach:进入容器的原有终端,退出终端则容器停止(适用于调试)。
# 推荐:进入后台运行的容器,开启新终端(/bin/bash) docker exec -it 容器ID/容器名 /bin/bash # 示例:进入tomcat02容器 docker exec -it tomcat02 /bin/bash 进入容器后,终端提示符会变为root@容器ID:/#,此时可执行 Linux 命令(如 ls、cd、mkdir),容器的底层是精简版的 Linux 系统。
7. 退出容器
在容器的交互终端中,有两种退出方式,对应不同的容器状态:
# 方式1:停止容器并退出(前台运行的容器适用) exit # 方式2:不停止容器,仅退出终端(后台运行的容器适用,必记) Ctrl + P + Q 8. 删除容器:docker rm
删除已停止的容器,语法:docker rm -f 容器ID/容器名,-f表示强制删除(可删除运行中的容器)。
# 示例1:删除单个已停止的容器 docker rm tomcat01 # 示例2:强制删除单个运行中的容器 docker rm -f tomcat02 # 示例3:删除多个容器,用空格分隔ID/名称 docker rm -f 容器ID1 容器名2 # 示例4:删除所有容器(慎用!) docker rm -f $(docker ps -aq) 9. 容器进阶操作命令
(1)查看容器日志:docker logs
查看容器的运行日志,用于排错,语法:docker logs [可选参数] 容器ID/容器名
# 核心可选参数 -t # 显示日志的时间戳 -f # 实时跟踪日志输出(类似tail -f) --tail 数字 # 只显示最后N行日志 # 示例:查看mysql01容器的最后10行日志,带时间戳 docker logs -tf --tail 10 mysql01 # 退出日志跟踪:Ctrl + C (2)查看容器内的进程:docker top
查看容器中正在运行的进程,类似 Linux 的top命令,语法:docker top 容器ID/容器名
# 示例:查看tomcat02容器的进程 docker top tomcat02 (3)查看容器的元数据:docker inspect
查看容器的详细信息(元数据),包括容器的 IP、端口映射、数据卷挂载、环境变量等,语法:docker inspect 容器ID/容器名
# 示例:查看mysql01容器的详细信息 docker inspect mysql01 (4)宿主机与容器之间的文件拷贝:docker cp
实现宿主机和容器之间的文件互传,语法:
# 宿主机 → 容器:docker cp 宿主机路径 容器ID/容器名:容器内路径 docker cp /home/test.txt tomcat02:/usr/local/tomcat/webapps # 容器 → 宿主机:docker cp 容器ID/容器名:容器内路径 宿主机路径 docker cp tomcat02:/usr/local/tomcat/webapps/index.html /home 四、Docker 核心功能:网络映射与数据卷挂载
单纯的创建容器无法满足实际应用需求,因为容器和宿主机默认网络不通、文件不共享,而网络映射(-p) 和数据卷挂载(-v) 是解决这两个问题的核心功能,也是 Docker 实战中必须掌握的。
1. 网络映射(-p):实现外网访问容器
Docker 容器默认拥有独立的网络空间,与宿主机、外网不通,通过-p参数将宿主机的端口映射到容器的暴露端口,外网访问宿主机的端口时,请求会被转发到容器内部,实现外网访问容器中的应用。
端口映射的三种格式
-p 宿主机IP:宿主机端口:容器端口 # 指定宿主机IP和端口(适用于多网卡服务器) -p 宿主机端口:容器端口 # 不指定IP,绑定宿主机所有网卡(最常用) -p 容器端口 # 随机分配宿主机端口映射到容器端口 实战示例:外网访问 Tomcat 容器
Tomcat 的默认暴露端口是 8080,将宿主机的 3344 端口映射到容器的 8080 端口:
# 创建tomcat容器,后台运行,端口映射3344:8080 docker run -itd --name tomcat03 -p 3344:8080 tomcat 此时,在外网通过http://宿主机IP:3344即可访问容器中的 Tomcat 服务(需开放服务器安全组的 3344 端口)。
2. 数据卷挂载(-v):实现宿主机与容器文件共享
数据卷(Volume)是 Docker 的持久化存储方案,通过-v参数将宿主机的目录与容器的目录建立映射,二者的文件实时同步、相互共享,核心价值:
- 数据持久化:容器被删除后,数据仍保存在宿主机的目录中,不会丢失;
- 方便修改配置:直接在宿主机修改文件,无需进入容器,同步到容器中;
- 实现容器间数据共享:多个容器挂载同一个宿主机目录,实现数据互通。
数据卷挂载的语法
-v 宿主机绝对路径目录:容器内目录 # 最常用,指定宿主机目录映射 -v 容器内目录 # 匿名挂载,Docker自动创建宿主机目录(/var/lib/docker/volumes/) -v 卷名:容器内目录 # 具名挂载,指定卷名,Docker管理宿主机目录 注意:宿主机目录必须是绝对路径,若目录不存在,Docker 会自动创建。
实战示例 1:Tomcat 容器配置与项目挂载
Tomcat 官方镜像的webapps目录默认无文件,将宿主机的/tmp/webapps目录挂载到容器的/usr/local/tomcat/webapps目录,直接在宿主机上传项目,容器即可识别:
# 创建tomcat容器,端口映射8080:8080,数据卷挂载webapps目录 docker run -itd --name tomcat04 -p 8080:8080 -v /tmp/webapps:/usr/local/tomcat/webapps tomcat 将 Tomcat 项目包上传到宿主机的/tmp/webapps目录,容器会自动同步,外网通过http://宿主机IP:8080/项目名即可访问。
实战示例 2:MySQL 容器数据持久化
MySQL 的核心数据存储在容器的/var/lib/mysql目录,将宿主机的/home/mysql/data目录挂载到该目录,即使容器被删除,MySQL 的数据仍保存在宿主机中:
# 创建mysql5.7容器,端口映射3306:3306,设置root密码,数据卷挂载数据目录 docker run -itd --name mysql02 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/data:/var/lib/mysql mysql:5.7 五、常用镜像的快速部署实战
掌握了镜像、容器命令和核心功能后,我们来实战部署几个最常用的镜像(JDK、Tomcat、MySQL、Nginx),覆盖日常开发的绝大多数场景,直接复制命令即可使用。
1. 部署 JDK8 容器
# 拉取JDK8镜像 docker pull kdvolder/jdk8 # 创建并启动JDK8容器,前台交互式运行 docker run -it --name jdk8 kdvolder/jdk8 /bin/bash # 进入容器后,验证JDK版本 java -version 2. 部署 Tomcat 容器(带项目挂载)
# 拉取Tomcat8.5镜像 docker pull tomcat:8.5 # 创建宿主机项目目录 mkdir -p /tmp/tomcat-webapps # 创建并启动Tomcat容器,端口8080:8080,挂载项目目录 docker run -itd --name tomcat85 -p 8080:8080 -v /tmp/tomcat-webapps:/usr/local/tomcat/webapps tomcat:8.5 3. 部署 MySQL5.7 容器(数据持久化 + 外网访问)
# 拉取MySQL5.7镜像 docker pull mysql:5.7 # 创建宿主机MySQL数据目录 mkdir -p /home/mysql57/data # 创建并启动MySQL5.7容器,端口3306:3306,设置root密码,挂载数据目录 docker run -itd --name mysql57 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql57/data:/var/lib/mysql mysql:5.7 # 进入容器,修改MySQL权限(允许外网访问root) docker exec -it mysql57 /bin/bash mysql -uroot -p123456 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; FLUSH PRIVILEGES; exit 修改完成后,可通过 Navicat、DBeaver 等工具,用宿主机IP:3306、用户名 root、密码 123456 连接 MySQL。
4. 部署 Nginx 容器(配置 + 页面挂载)
# 拉取Nginx最新版镜像 docker pull nginx # 创建宿主机Nginx配置和页面目录 mkdir -p /home/nginx/conf /home/nginx/html # 先创建临时Nginx容器,拷贝默认配置文件到宿主机 docker run -itd --name tmp-nginx nginx docker cp tmp-nginx:/etc/nginx/nginx.conf /home/nginx/conf/ docker cp tmp-nginx:/usr/share/nginx/html/index.html /home/nginx/html/ # 删除临时容器 docker rm -f tmp-nginx # 创建并启动Nginx容器,端口80:80,挂载配置和页面目录 docker run -itd --name nginx01 -p 80:80 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/html:/usr/share/nginx/html nginx 直接在宿主机的/home/nginx/html目录修改 index.html,或上传静态项目,外网通过http://宿主机IP即可访问;修改/home/nginx/conf/nginx.conf可配置 Nginx 反向代理、跨域等功能。