在Linux系统上使用Docker部署javaweb项目

目录

一.使用Docker部署的好处:

二.Docker部署的步骤:

1.准备工作:

2.构建镜像:

3.创建自定义网络:

(1)创建自定义网络:

(2)查看自定义网络:

(3)连接自定义网络:

(4)删除自定义网络:

4.创建数据卷并将mysql挂载到自定义网络:

(1)什么是数据卷?

(2)准备工作:

(3)创建并运行mysql容器,挂载本地目录:

(4)查看mysql是否成功挂载数据卷:

5.创建并运行容器:

6..Docker部署前端的操作:

三.使用DockerCompose简化部署:

[1.使用 Docker 与 DockerCompose 部署项目的区别:](#1.使用 Docker 与 DockerCompose 部署项目的区别:)

2.使用DockerCompose部署的完整代码:

(1)导入docker-compose.yml文件至虚拟机root目录下:

(2)使用DockerCompose命令:

(3)移除部署项目的所有文件:


一.使用Docker部署的好处:

在Linux系统上使用Docker部署项目通常会大大简化部署流程,因为Docker可以将应用程序及其依赖打包到一个独立的容器中。

Docker打包应用程序时会将其与所有依赖项(操作系统、库等)一起打包。这样,无论应用程序在开发、测试还是生产环境中运行,都会有一致的运行环境。

由于容器与主机操作系统隔离,Docker容器可以在任何支持Docker的平台上运行,不论是本地开发环境、测试服务器还是云平台。

总而言之,Docker通过容器化技术,提供了一种简化的、一致性的部署方式,解决了依赖冲突、环境差异、扩展性等传统部署方式中的痛点。这使得它在现代应用开发和部署中得到了广泛应用,尤其是在云计算和微服务架构中发挥着关键作用。

二.Docker部署的步骤:

1.准备工作:

在部署前,我们需要Dockerfile以及jar包(MySQL放在Linux就需要再项目配置文件的数据库架构名改成虚拟机的IP以及密码需改成Linux内的mysql密码)。

Dockerfile 是定义如何构建 Docker 镜像的蓝图,而 Docker 是用于构建、运行和管理这些镜像及其容器的工具。

我们需要先创建Dockerfile,就像需要一个网卡驱动程序来确保计算机能够与网络进行通信一样,需要一个 Dockerfile 来定义如何构建我们的 Docker 镜像。Dockerfile 是 Docker 镜像的"++驱动程序++"。就像下面这样定义一个Dockerfile文件,然后将这个和jar包拖动到Linux系统的 /root/ 目录下。

复制代码
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

2.构建镜像:

就像将网卡插入计算机来实现网络连接一样,你需要构建 Docker 镜像来创建运行你的应用程序的"容器"。

复制代码
docker build -t my-java-app .

-t my-java-app 是为镜像指定的名称,.表示当前目录(Dockerfile 在这里)。

构建完镜像(image)后,我们可以使用下面的命令查看镜像是否创建成功:

复制代码
docker image ls
//或
docker images

3.创建自定义网络:

自定义网络使得容器可以更好地互相通信,并提供额外的网络隔离和配置选项。

(1)创建自定义网络:

复制代码
docker network create --driver bridge my_custom_network

这里的 --driver bridge 指定使用桥接网络驱动(这是 Docker 的默认网络驱动)。my_custom_network 是你自定义的网络名称,可以根据需要更改。

(2)查看自定义网络:

复制代码
docker network ls

(3)连接自定义网络:

复制代码
docker network connect my_custom_network mysql

这里的 mysql 指一个正在运行的容器的名称或 ID。这个命令的作用是将现有的容器(在这个例子中是 mysql 容器)连接到一个自定义网络(my_custom_network)。

我们可以使用 docker ps 命令查看正在运行的容器。

(4)删除自定义网络:

复制代码
docker network rm my_custom_network

4.创建数据卷并将mysql挂载到自定义网络:

(1)什么是数据卷?

数据卷(volume) 是一个虚拟目录,是容器内目录宿主机 目录之间映射的桥梁。

本地目录或文件必须以 /./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。

(2)准备工作:

现在Linux虚拟机下的/root/mysql目录下创建三个文件夹:conf,data,init,随后将想要导入的mysql文件导入至conf与init中。

(3)创建并运行mysql容器,挂载本地目录:

运行下面的命令:

复制代码
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  mysql
  • 挂载/root/mysql/data到容器内的/var/lib/mysql目录

  • 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录(初始化的SQL脚本目录)

  • 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录(这个是MySQL配置文件目录)

复制代码
# 进入mysql
docker exec -it mysql mysql -uroot -p123
# 查看编码表
show variables like "%char%";
# 查看数据库
show databases;

(4)查看mysql是否成功挂载数据卷:

复制代码
# 查看MySQL容器详细信息
docker inspect mysql;

我们主要关注 mysql 下面的内容 ->

复制代码
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/root/mysql/data",
                "Destination": "/var/lib/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/root/mysql/conf",
                "Destination": "/etc/mysql/conf.d",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/root/mysql/init",
                "Destination": "/docker-entrypoint-initdb.d",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
  • Name:数据卷名称。由于定义容器未设置容器名,这里的就是匿名卷自动生成的名字,一串hash值。

  • Source:宿主机目录

  • Destination : 容器内的目录

出现上面这样就证明我们mysql已经成功挂载。

5.创建并运行容器:

网卡需要网络配置才能正确工作,同样 Docker 容器也需要网络配置。我们可以通过 docker run 命令启动容器,并指定如何将容器的端口映射到宿主机的端口。

复制代码
docker run -d --name my-running-app --network hmall -p 8080:8080 my-java-app

这里的 -d 参数表示在后台运行容器,--network hmall将容器连接到名为 hmall 的自定义网络(必须先创建才能使用自定义网络)-p 8080:8080 将容器的端口 8080 映射到宿主机的端口 8080,--name my-running-app 给容器指定一个名称,my-java-app 是你之前创建的镜像名称。

为了判断是否运行成功,我们可以使用下面命令查看容器运行日志:

6..Docker部署前端的操作:

  • html是静态资源目录,我们需要把hmall-portal以及hmall-admin都复制进去

  • nginx.conf是nginx的配置文件,主要是完成对html下的两个静态资源目录做代理

使用命令创建并运行容器:

复制代码
docker run -d \
  --name nginx \
  -p 18080:18080 \
  -p 18081:18081 \
  -v /root/nginx/html:/usr/share/nginx/html \
  -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
  --network heima \
  nginx

三.使用DockerCompose简化部署:

1.使用 Docker 与 DockerCompose 部署项目的区别:

docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。

比如如果我们使用Docker创建并运行mysql容器会执行下面命令:

复制代码
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  --network hmall
  mysql

而我们如果用docker-compose.yml文件来定义,就是这样:

复制代码
version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
    networks:
      - new
networks:
  new:
    name: hmall
docker run 参数 docker compose 指令 说明
--name container_name 容器名称
-p ports 端口映射
-e environment 环境变量
-v volumes 数据卷配置
--network networks 网络

2.使用DockerCompose部署的完整代码:

(1)导入docker-compose.yml文件至虚拟机root目录下:

XML 复制代码
version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmall
    networks:
      - hm-net
networks:
  hm-net:
    name: hmall

(2)使用DockerCompose命令:

基础语法:

XML 复制代码
docker compose [OPTIONS] [COMMAND]
类型 参数或指令 说明
Options -f 指定compose文件的路径和名称
Options -p 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
Commands up 创建并启动所有service容器
Commands down 停止并移除所有容器、网络
Commands ps 列出所有启动的容器
Commands logs 查看指定容器的日志
Commands stop 停止容器
Commands start 启动容器
Commands restart 重启容器
Commands top 查看运行的进程
Commands exec 在指定的运行中容器中执行命令

在导入完docker-compose.yml文件的前提,我们执行下面的命令:

XML 复制代码
# 启动所有, -d 参数是后台启动
docker compose up -d

运行完成后,我们可以执行下面两条命令查看是否成功部署:

XML 复制代码
# 查看镜像
docker compose images
# 结果
CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
hmall               root-hmall          latest              32eebee16acd        362MB
mysql               mysql               latest              3218b38490ce        516MB
nginx               nginx               latest              605c77e624dd        141MB

# 查看容器
docker compose ps
# 结果
NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
hmall               root-hmall          "java -jar /app.jar"     hmall               54 seconds ago      Up 52 seconds       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql               mysql               "docker-entrypoint.s..."   mysql               54 seconds ago      Up 53 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx               nginx               "/docker-entrypoint...."   nginx               54 seconds ago      Up 52 seconds       80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp

(3)移除部署项目的所有文件:

XML 复制代码
# 停止并移除所有的容器
docker compose down

执行此命令将会删除所有的项目有关的文件,不会有残留。

我们可以执行下面两条命令查看容器以及网络:

XML 复制代码
# 查看容器,加上-a会查询运行的容器以及停止运行的容器
docker ps -a
# 查看网络
docker network ls

截止到这里,恭喜你已经成功学会如何在Linux系统上部署项目,看到这里希望可以给个三连支持一下,感谢观看!!!

相关推荐
thinkMoreAndDoMore19 分钟前
linux内核匹配I2C设备
linux·运维·服务器
小政同学5 小时前
【NFS故障】共享的文件无法执行
linux·运维·服务器
禅口魔心6 小时前
边缘网关开发计划(一):在 Rock 5T 上部署 Docker
物联网·docker·rk3588·边缘网关
AI木马人6 小时前
3.【Prompt工程实战】如何设计一个可复用的Prompt系统?(避免每次手写提示词)
linux·服务器·人工智能·深度学习·prompt
ch3nyuyu6 小时前
Ubuntu(乌班图)基础指令
linux·运维·网络
huihuihuanhuan.xin6 小时前
记一次 Docker PostgreSQL 连接认证失败的排查与解决
docker
minglie16 小时前
gcc编译器汇总
linux
挽安学长7 小时前
保姆级教程,通过GACCode使用Claude Code Desktop!
运维·服务器
firstacui7 小时前
MGRE实验
运维·服务器·网络
白菜欣8 小时前
Linux —《开发三件套:gcc/g++、gdb、make/Makefile 全解析》
linux·运维