目录
[1.使用 Docker 与 DockerCompose 部署项目的区别:](#1.使用 Docker 与 DockerCompose 部署项目的区别:)
(1)导入docker-compose.yml文件至虚拟机root目录下:
一.使用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系统上部署项目,看到这里希望可以给个三连支持一下,感谢观看!!!