Docker Labs 项目:Java 容器化实践指南 - 运行容器详解
容器化入门:理解 Docker 运行机制
在 Docker 生态系统中,容器是轻量级、可执行的软件包,包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。与虚拟机不同,容器共享主机系统内核,这使得它们更加高效和快速启动。
镜像管理基础
查看本地镜像
在运行容器之前,我们需要了解本地已存在的镜像。使用以下命令查看:
docker image ls
这个命令会列出所有本地存储的 Docker 镜像,包括:
- 镜像仓库来源(REPOSITORY)
- 标签(TAG)
- 唯一的镜像ID
- 创建时间
- 镜像大小
深入镜像历史
要了解镜像的构建历史,可以使用:
docker image history jboss/wildfly
这个命令会显示镜像的每一层构建信息,包括:
- 每层执行的命令
- 创建时间
- 每层的大小
- 注释信息
理解镜像分层结构对于优化Dockerfile和调试镜像问题非常有帮助。
容器运行模式详解
交互式运行
对于需要与容器交互的场景(如调试或配置),可以使用交互模式:
docker container run -it jboss/wildfly
参数说明:
-i
:保持STDIN打开,即使没有连接-t
:分配一个伪终端
这种模式下,你会直接看到容器的控制台输出,适合初次测试和调试。要退出,可以使用Ctrl+C。
后台运行模式
生产环境通常需要容器在后台运行:
docker container run -d jboss/wildfly
参数说明:
-d
:分离模式,容器在后台运行
命令会返回一个容器ID,可以通过以下命令查看运行状态:
docker container ls
要查看所有容器(包括停止的):
docker container ls -a
网络端口映射实战
自动端口映射
Docker 可以自动将容器端口映射到主机端口:
docker container run -d -P --name wildfly jboss/wildfly
参数说明:
-P
:自动映射所有暴露的端口到随机主机端口--name
:为容器指定一个易记的名称
使用 docker container ls
查看实际映射的端口号,然后在浏览器访问 http://localhost:<映射端口>
。
指定端口映射
对于需要固定端口的情况:
docker container run -d -p 8080:8080 --name wildfly jboss/wildfly
参数说明:
-p hostPort:containerPort
:将主机的8080端口映射到容器的8080端口
这样就能通过 http://localhost:8080
直接访问应用。
应用部署实战:Java EE 示例
自定义镜像部署WAR文件
- 创建Dockerfile:
FROM jboss/wildfly:latest
RUN curl -L https://example.com/path/to/sample.war -o /opt/jboss/wildfly/standalone/deployments/sample.war
- 构建镜像:
docker image build -t javaee-sample .
- 运行容器:
docker container run -d -p 8080:8080 --name wildfly javaee-sample
- 测试应用:
curl http://localhost:8080/sample/resources/persons
容器生命周期管理
停止容器
停止单个容器:
docker container stop <容器ID或名称>
停止所有运行中的容器:
docker container stop $(docker container ps -q)
删除容器
删除单个容器:
docker container rm <容器ID或名称>
删除所有已停止的容器:
docker container rm $(docker container ps -aq)
强制删除运行中的容器(谨慎使用):
docker container rm -f <容器ID或名称>
高级技巧:端口映射查询
查询容器的端口映射:
docker container port <容器ID或名称>
使用inspect命令获取详细信息:
docker container inspect --format='{{(index (index .NetworkSettings.Ports "8080/tcp") 0).HostPort}}' <容器ID>
最佳实践建议
- 始终为生产容器指定名称(--name),便于管理
- 开发环境可以使用交互模式,生产环境应使用分离模式
- 明确指定端口映射关系,避免使用随机端口
- 定期清理不再使用的容器和镜像
- 使用Dockerfile构建自定义镜像,而不是手动修改运行中的容器
通过掌握这些核心概念和命令,你已经具备了使用Docker运行和管理Java应用容器的基本能力。下一步可以探索更高级的主题,如容器网络、数据卷和多容器编排等。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考