Docker 是一个“集装箱”技术,把你的应用(代码+依赖+环境)打包成一个标准化的“集装箱”(容器),无论你把它放到哪台机器(Windows/Linux/云服务器),都能保证“一模一样”的运行效果。

下面解释一下我们为什么需要它呢?我们看下下面的场景

问题场景 传统方式 Docker 解决方案
开发环境能跑,服务器报错
(比如:Java 1.8 依赖库缺失)
开发用 Mac,服务器用 Ubuntu,配置不一致 → 代码在开发机跑得好,部署到服务器就报错 Docker 容器自带完整环境
(Java 1.8 + Tomcat + 所有依赖)→ 代码在哪都一样跑
服务器资源浪费
(单机跑 5 个 Tomcat,每个占 2G)
每个应用单独装 JDK/Tomcat → 5 个应用占 10G 内存 Docker 共享底层系统
(只占 500MB 空间)→ 5 个应用共用 2.5G 内存
部署慢
(手动装 JDK、配置环境、部署 WAR 包)
1 小时/次 一键启动
docker run -p 8080:8080 my-app:1.0 → 5 秒完成)

✅ 核心价值:解决“环境不一致”和“资源浪费”问题,让开发、测试、生产环境完全一致

Docker是一个开源的容器引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容 器。 容器化引擎(新型虚拟机) Docker使用Google公司推出的Go语言进行开发实现,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。 用户可以方便地创建和使用容器,把自己的应用放入容器。 容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。 容器就是将软件打包成标准化单元,以用于开发、交付和部署。 容器的镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统 工具、系统库和设置。

官网:https://www.docker.com/

特点: 轻量,在一台机器上运行的多个Docker容器可以共享这台机器的操作系统内核;它们能够迅速启动,只 需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽 量降低磁盘用量,并能更快地下载镜像。 标准,Docker容器基于开放式标准,能够在所有主流Linux版本、Microsoft Windows以及包括VM、裸 机服务器和云在内的任何基础设施上运行。 安全,Docker赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker默认提供最强的 隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

核心组成:

镜像( Image ) 软件安装包,是一套软件集合,需要的其他的软件都在里面,比如Tomcat镜像,就 包含Jdk+tomcat

容器( Container )基于镜像安装之后的实例

数据卷(Data Volumes)容器存储数据的地方,类似磁盘(虚拟的)

网络(Network)可以实现容器的网络分配,每个容器都有自己的网络(ip+端口)

仓库( Repository )存储镜像的地方,国内建议使用第三方镜像仓库

1.安装

因为我们主要还是在云服务器上使用,所以这里直接在lInux服务器安装为例

执行命令,先查看是否有Docker

docker --version

如果想要删除:yum -y remove docker-ce

如果没有需要安装: 1.执行命令,实现Docker安装

yum install -y yum-utils

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast

yum -y install docker-ce

验证:

docker --version

启动:systemctl start docker

停止:systemctl stop docker

查看状态:systemctl status docker

重启:systemctl restart docker

docker配置国内镜像站(解决拉取镜像慢的问题)

vi /etc/docker/daemon.json

{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://huecker.io", "https://dockerhub.timeweb.cloud", "https://noohub.ru" ] }

然后重启服务:

systemctl daemon-reload

systemctl restart docker

之后拉取镜像速度会快一些

2.使用

2.1镜像

1.搜索镜像:docker search tomcat(例子,并不固定)

2.查看本地镜像:docker images

3.下载镜像:docker pull 镜像名称

4.删除镜像 docker rmi a76ed56adf24(IMAGE ID

2.2容器

创建容器:docker create docker create --name tomcat8081 -p 8081:8080 tomcat

参数说明: 1.--name 为容器起个名字,名称唯一 2.-p 设置端口号 访问端口号:软件本身的端口号

创建并运行容器:docker run docker run -d --name tomcat8082 -p 8082:8080 tomcat

参数说明: 1.-d 后台启动 2.--name 为容器起个名字 3.-p 设置端口号 访问端口号:软件本身的端口号 run命令:1.镜像不存在,会自动下载 2.创建容器 3.启动容器 等价于:pull+create+start 命令组合

启动容器:docker start

docker start tomcat8081

停止容器:docker stop

docker stop tomcat8081

删除容器:docker rm

docker rm tomcat8081

注意:删除容器,容器必须先停止

查看容器:docker ps

docker ps -a 查看创建的所有的容器

docker ps 查看运行中的容器

查看容器日志:docker logs

docker logs tomcat8082

12.进入到容器内部:docker exec docker exec -it tomcat8082 bash

参数说明: 1.-it 交互 2.bash 命令 退出容器,采用exit

查看容器详情:docker inspect

docker inspect tomcat8082

2.3使用

在你的本地项目根目录(也就是生成 target/app.jar 的地方),创建一个 Dockerfile 

内容如下:

# 使用精简的 JDK 8 环境
FROM openjdk:8-jre-slim

# 设置工作目录
WORKDIR /app

# 复制构建好的 jar 包
# 假设你的 maven/gradle 构建输出在 target/app.jar
COPY target/app.jar app.jar

# 暴露端口
EXPOSE 8080

# 启动命令 (优化随机数生成器以加快启动)
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]

然后配置ssh,用本地电脑连接远程服务器,通过脚本一键部署(个人项目,小项目适合)

创建脚本deploy.sh

输入一下命令:

#!/bin/bash

VERSION="v1" # 每次发布前修改版本号
IMAGE_NAME="my-java-app"
SERVER_USER="root"
SERVER_IP="192.168.1.100" # 替换为你的服务器IP

echo "1. 正在构建镜像..."
docker build -t ${IMAGE_NAME}:${VERSION} .

echo "2. 正在导出镜像..."
docker save -o ${IMAGE_NAME}.tar ${IMAGE_NAME}:${VERSION}

echo "3. 正在传输到服务器..."
scp ${IMAGE_NAME}.tar ${SERVER_USER}@${SERVER_IP}:/tmp/

echo "4. 正在远程部署..."
ssh ${SERVER_USER}@${SERVER_IP} << EOF
  echo "停止旧容器..."
  docker stop ${IMAGE_NAME} || true
  docker rm ${IMAGE_NAME} || true
  
  echo "加载新镜像..."
  docker load -i /tmp/${IMAGE_NAME}.tar
  
  echo "启动新容器..."
  docker run -d -p 8080:8080 --name ${IMAGE_NAME} ${IMAGE_NAME}:${VERSION}
  
  echo "清理临时文件..."
  rm /tmp/${IMAGE_NAME}.tar
  
  echo "部署完成!"
  docker ps | grep ${IMAGE_NAME}
EOF

echo "5. 清理本地临时文件..."
rm ${IMAGE_NAME}.tar

echo "✅ 全部完成!"
  1. 给脚本权限:chmod +x deploy.sh
  2. 每次代码更新后,在本地运行:./deploy.sh

更多推荐