在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系统上部署项目,看到这里希望可以给个三连支持一下,感谢观看!!!

相关推荐
CoolTiger、2 小时前
【Vmware16安装教程】
linux·虚拟机·vmware16
m0_741768852 小时前
使用docker的小例子
运维·docker·容器
学习3人组3 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos
厨 神3 小时前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
Karoku0663 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
geek_Chen013 小时前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
(⊙o⊙)~哦4 小时前
linux 解压缩
linux·运维·服务器
牧小七5 小时前
Linux命令---查看端口是否被占用
linux
最新小梦5 小时前
Docker日志管理
运维·docker·容器
鸡鸭扣6 小时前
虚拟机:3、(待更)WSL2安装Ubuntu系统+实现GPU直通
linux·运维·ubuntu