Docker的镜像管理是日常工作的核心技能之一。熟练掌握常用软件的镜像安装、容器运行以及自定义镜像构建能极大提升工作效率解决环境不一致、部署繁琐等痛点。本文将从常用镜像安装JDK、Tomcat、MySQL、Nginx、自定义镜像构建commit命令Dockerfile两个核心模块结合实操命令、注意事项和实战案例一步步带大家吃透Docker镜像相关操作全程实操可复现新手也能轻松上手一、常用镜像安装本节整理了工作中最常用的4种软件镜像JDK、Tomcat、MySQL、Nginx的安装步骤每一步都附带具体命令和关键注意事项避开新手常见坑确保大家能一次成功运行容器。1. Docker安装JDKJDK是Java项目运行的基础通过Docker安装JDK可避免本地环境配置的繁琐实现环境隔离。搜索镜像从Docker Hub搜索可用的JDK镜像优先选择官方镜像或stars数量多、口碑好的镜像。 命令docker search jdk下载镜像选择合适的镜像版本如jdk8下载至本地。 命令docker pull openjdk:8openjdk为官方镜像轻量且稳定展示镜像查看本地已下载的JDK镜像确认下载成功。 命令docker images可看到openjdk:8的镜像信息包括镜像ID、大小等运行镜像容器启动JDK容器验证是否能正常使用。 命令docker run -it --name jdk8 openjdk:8 /bin/bash验证进入容器后输入java -version若显示JDK版本信息则说明容器启动成功。2. Docker安装TomcatTomcat是Java Web项目的常用容器结合Docker安装可快速部署Web应用无需手动配置Tomcat环境。参考JDK安装流程搜索→下载→展示→运行核心命令如下搜索镜像docker search tomcat下载镜像docker pull tomcat默认下载最新版本展示镜像docker images运行容器docker run -d -p 8080:8080 --name tomcat01 tomcat说明-d表示后台运行-p 8080:8080表示将容器的8080端口映射到宿主机的8080端口--name指定容器名称方便后续操作。注意官方Tomcat镜像默认webapps目录下无应用启动后访问http://宿主机IP:8080可能出现404后续在自定义镜像部分会解决这个问题。3. Docker安装MySQLMySQL是常用的关系型数据库Docker安装MySQL需注意端口映射、环境配置、数据持久化等问题以下是完整实操步骤含核心参数说明和避坑点。搜索镜像搜索MySQL官方镜像支持指定版本如5.7、8.0。 命令docker search mysql下载镜像推荐下载5.7版本稳定兼容性好若需最新版本可省略版本号。 命令docker pull mysql:5.7展示镜像docker images确认mysql:5.7镜像下载成功。运行镜像容器核心步骤 命令docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 --name mysql01 mysql:5.7关键参数说明必看避坑重点创建容器时最末尾不要加入 /bin/bash否则会导致MySQL服务无法正常启动-d后台运行容器避免占用终端-p 3306:3306端口映射宿主机3306端口映射到容器3306端口外部可通过宿主机IP:3306访问MySQL-v卷挂载数据持久化核心将宿主机的/home/mysql/conf配置文件目录和/home/mysql/data数据目录挂载到容器对应目录实现“容器销毁数据不丢失”-e MYSQL_ROOT_PASSWORD123456设置MySQL root用户的密码自定义建议复杂度高一些--name mysql01指定容器名称方便后续操作如进入容器、停止容器使用MySQL数据库进入容器登录MySQL并配置远程访问方便本地工具连接。 ① 进入容器docker exec -it mysql01 /bin/bash② 登录MySQLmysql -u root -p输入步骤4设置的密码123456回车登录。 ③ 配置root用户远程访问必做否则本地无法连接ALTER USER root% IDENTIFIED WITH mysql_native_password BY 2020;密码可自定义此处为示例FLUSH PRIVILEGES;刷新权限使配置生效本地连接测试打开本地MySQL客户端如Navicat、DBeaver输入宿主机IP、端口3306、root用户名和配置的密码点击连接能成功连接则说明MySQL安装配置完成。扩展数据持久化详解 我们通过-v参数实现了卷挂载将MySQL的配置文件和数据目录共享到宿主机这样即使删除容器docker rm mysql01宿主机/home/mysql/conf和/home/mysql/data目录下的内容依然存在后续重新创建容器时只需挂载相同的目录即可恢复之前的数据和配置实现数据持久化。4. Docker安装NginxNginx是常用的Web服务器、反向代理服务器Docker安装Nginx后需通过数据卷挂载实现配置文件修改和项目资源共享方便后续项目部署。搜索镜像docker search nginx拉取镜像docker pull nginx默认最新版本稳定可用创建容器含数据卷挂载 命令docker run -d -p 80:80 -v /usr/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/nginx/html:/usr/share/nginx/html --name nginx01 nginx说明-p 80:80映射端口外部可通过宿主机IP直接访问两个-v参数分别挂载配置文件和项目资源目录。访问测试 ① 本地测试在宿主机输入curl http://localhost若返回Nginx默认欢迎页面则说明容器启动成功。 ② 外网测试在浏览器输入http://宿主机IP能看到欢迎页面即可注意需在宿主机安全组中释放80端口否则外网无法访问。查看Nginx资源信息 查看容器运行状态docker ps可看到nginx01容器处于运行中 查看容器详细信息docker inspect nginx01可查看挂载目录、端口映射等信息修改配置文件核心用于项目部署 后续发布项目时需修改Nginx配置如端口、项目路径通过数据卷挂载我们可直接修改宿主机的配置文件容器会自动同步无需进入容器修改极大提升效率。具体步骤如下关键提示宿主机的/usr/nginx/html目录和/usr/nginx/nginx.conf文件可随时修改修改后重启Nginx容器或等待自动同步即可生效无需重新创建容器。拷贝容器内默认配置文件到宿主机 先创建宿主机挂载目录若未创建mkdir -p /usr/nginx /usr/nginx/html拷贝配置文件docker cp nginx01:/etc/nginx/nginx.conf /usr/nginxnginx01为容器名称可替换为容器ID分析默认配置文件 打开宿主机的nginx.conf文件vim /usr/nginx/nginx.conf核心内容如下http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote_addr - $remote_user [$time_local] $request;access_log /var/log/nginx/access.log main;sendfile on;keepalive_timeout 65;#gzip on;# 引入子配置文件默认包含server配置include /etc/nginx/conf.d/*.conf;}其中include /etc/nginx/conf.d/*.conf;会引入conf.d目录下的default.conf文件default.conf中包含默认的server配置监听80端口、默认项目路径等。修改配置文件合并配置简化操作 为了方便管理我们可注释掉子配置文件引入直接在nginx.conf中编写server配置修改后如下http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote_addr - $remote_user [$time_local] $request;access_log /var/log/nginx/access.log main;sendfile on;keepalive_timeout 65;#gzip on;# 注释子配置文件引入# include /etc/nginx/conf.d/*.conf;# 自定义server配置server {listen 81; # 监听81端口可自定义server_name localhost;location / {root /usr/share/nginx/html; # 项目资源目录对应宿主机/usr/nginx/htmlindex index.html index.htm; # 默认首页}}}创建项目并重启Nginx ① 在宿主机的/usr/nginx/html目录下创建index.html文件模拟项目首页echo 这是Docker部署的Nginx项目 /usr/nginx/html/index.html② 重启Nginx容器使配置生效docker restart nginx01③ 访问测试浏览器输入http://宿主机IP:81能看到刚才编写的内容说明配置修改和项目部署成功。5. 其他常用镜像除了上述4种镜像工作中还可能用到Redis、MongoDB、Elasticsearch等镜像安装流程与上述类似搜索→拉取→运行→配置后续用到时再详细讲解重点掌握上述4种镜像的安装逻辑即可举一反三。二、定制镜像解决环境不一致痛点实际工作中开发、测试、运维环境不一致常常导致项目在本地能正常运行部署到服务器后出现各种问题。Docker的自定义镜像功能可完美解决这个问题开发人员将配置好的容器打包成镜像交给测试人员测试人员验证无误后再将镜像交给运维人员部署实现“一次构建到处运行”。定制镜像主要有两种方式commit命令打包容器为镜像、通过Dockerfile构建镜像推荐可复用、可版本控制。1. 问题与解决方案核心问题开发、测试、运维环境不一致如JDK版本、Tomcat配置、依赖包不同导致项目运行异常。解决方案使用Docker部署应用通过定制镜像将项目运行所需的环境、配置、依赖全部打包到镜像中确保不同环境下镜像一致从而避免环境不一致问题。2. commit命令将容器打包为镜像commit命令的原理与Git提交类似可将一个已修改的容器打包成一个新的镜像后续可直接使用这个新镜像启动容器无需重复修改配置。注意事项必看通过commit打包生成的镜像不包含数据如MySQL的数据、项目文件数据需通过数据卷挂载实现持久化或迁移。Docker通过数据卷-v参数实现数据的迁移和持久化打包镜像时需确保数据卷已正确挂载。实战测试定制修改后的Tomcat镜像官方Tomcat镜像默认webapps目录下无应用我们通过修改容器添加webapps应用再打包为新镜像后续使用新镜像启动容器即可直接访问应用。启动一个默认的Tomcat容器docker run -d -p 8080:8080 tomcat执行后通过docker ps查看容器ID如de57d0ace571。进入容器查看webapps目录docker exec -it 容器ID /bin/bash替换为实际容器ID 进入容器后执行cd /usr/local/tomcat再执行ls webapps会发现webapps目录为空官方默认没有应用。复制webapps.dist下的文件到webapps 官方镜像中webapps.dist目录包含默认应用执行以下命令复制cp -r webapps.dist/* webapps复制完成后执行ls webapps可看到ROOT、docs、examples等应用目录。将修改后的容器打包为新镜像 命令格式docker commit -m描述信息 -a作者 容器ID 目标镜像名:[版本TAG]实际执行docker commit -acsp -madd webapps app de57d0ace571 tomcat02:1.0说明-m为镜像添加描述-a指定作者tomcat02:1.0为新镜像的名称和版本版本TAG可自定义。验证新镜像 执行docker images可看到新生成的tomcat02:1.0镜像后续启动容器时使用该镜像即可直接拥有webapps应用无需再次复制文件docker run -d -p 8081:8080 --name tomcat02 tomcat02:1.03. Dockerfile构建自定义镜像推荐commit命令适合简单的镜像定制但无法实现版本控制、无法复用构建步骤。Dockerfile是一个文本文件包含一系列构建指令可精确控制镜像的构建过程支持版本控制、批量构建是企业级开发中定制镜像的首选方式。Dockerfile核心概念Dockerfile是构建Docker镜像的“脚本”文件中的每一行都是一个构建指令指令需大写指令后面跟随参数通过这些指令可指定基础镜像、安装依赖、配置环境、设置工作目录等。Dockerfile常用指令必记FROM指定基础镜像一切从这里开始构建如FROM centos:7、FROM tomcat是Dockerfile的第一个指令。MAINTAINER指定镜像作者信息姓名邮箱可选。RUN镜像构建时需要运行的命令如安装软件、创建目录可多次使用。ADD将本地文件或目录添加到镜像中支持自动解压压缩包如ADD jdk.tar.gz /usr/local。WORKDIR指定镜像的工作目录后续的RUN、CMD等指令都会在该目录下执行。VOLUME指定镜像的挂载目录用于数据持久化。EXPOSE暴露镜像的端口仅声明不实际映射需启动容器时用-p参数映射。CMD指定容器启动时运行的命令只有最后一个CMD指令生效可被启动容器时的命令替换。ENTRYPOINT指定容器启动时运行的命令可追加命令与CMD的区别不可被替换仅可追加。ENV构建镜像时设置环境变量如设置JAVA_HOME。实战1简单定制Tomcat镜像通过Dockerfile构建一个包含默认首页的Tomcat镜像步骤如下创建工作目录便于管理文件mkdir dockerfiletest cd dockerfiletest创建Dockerfile文件推荐命名为Dockerfile构建时可省略-f参数vim Dockerfile输入以下内容# 基础镜像官方TomcatFROM tomcat# 构建时运行的命令创建首页目录编写默认首页RUN mkdir /usr/local/tomcat/webapps/ROOTRUN echo this is tomcat test /usr/local/tomcat/webapps/ROOT/index.html构建镜像 命令docker build -t mytomcat:2.0 .说明-t指定镜像名称和版本mytomcat:2.0.表示当前目录Dockerfile所在目录构建过程中会执行Dockerfile中的所有指令。启动容器验证镜像docker run -d -p 8082:8080 --name mytomcat01 mytomcat:2.0访问http://宿主机IP:8082可看到“this is tomcat test”说明镜像构建成功。实战2定制指定JDK和Tomcat版本的镜像进阶实际工作中项目可能需要指定版本的JDK和Tomcat我们通过Dockerfile基于CentOS基础镜像手动安装指定版本的JDK和Tomcat定制符合项目需求的镜像。准备材料 ① 下载指定版本的JDK压缩包如jdk-8u161-linux-x64.tar.gz和Tomcat压缩包如apache-tomcat-8.5.20.tar.gz。 ② 将两个压缩包放入Dockerfile所在的工作目录dockerfiletest。编写Dockerfile文件# 基础镜像CentOS 7 FROM centos:7 # 作者信息 MAINTAINER libowen379872721qq.com # 将JDK和Tomcat压缩包添加到镜像的/usr/local目录并自动解压 ADD jdk-8u161-linux-x64.tar.gz /usr/local ADD apache-tomcat-8.5.20.tar.gz /usr/local # 安装vim工具可选方便后续修改配置 RUN yum -y install vim # 设置环境变量 ENV MYPATH /usr/local WORKDIR $MYPATH # 设置工作目录 ENV JAVA_HOME $MYPATH/jdk1.8.0_161 # JDK安装路径 ENV CLASS_PATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME $MYPATH/apache-tomcat-8.5.20 # Tomcat安装路径 ENV CATALINA_BASH $MYPATH/apache-tomcat-8.5.20 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin # 将JDK和Tomcat加入环境变量 # 暴露8080端口 EXPOSE 8080构建镜像docker build -t mytomcat8:1.0 .镜像名称mytomcat8:1.0可自定义启动容器验证镜像docker run -itd -p 8083:8080 --name tt mytomcat8:1.0 /bin/bash① 进入容器docker exec -it tt /bin/bash② 验证JDK版本java -version显示jdk1.8.0_161版本。 ③ 验证Tomcat启动Tomcatcd $CATALINA_HOME/bin ./startup.sh访问http://宿主机IP:8083能看到Tomcat默认页面说明镜像构建成功。三、总结本文讲解了Docker常用镜像JDK、Tomcat、MySQL、Nginx的安装步骤重点强调了MySQL的数据持久化、Nginx的配置修改和项目部署以及两种定制镜像的方式commit命令Dockerfile。核心要点如下常用镜像安装遵循“搜索→拉取→运行→配置”的逻辑重点关注端口映射、数据卷挂载和避坑点如MySQL容器末尾不加/bin/bash。定制镜像commit适合简单场景Dockerfile适合企业级场景可实现版本控制和复用核心是掌握常用指令的用法。核心价值通过Docker镜像解决环境不一致问题实现“一次构建到处运行”提升部署效率和环境一致性。最后建议大家多动手实操熟悉每一步命令和配置遇到问题可通过docker logs 容器ID查看日志排查问题。Docker镜像的灵活运用能极大提升工作效率