Docker-完整项目的部署(保姆级教学)
②build是用来构建镜像的,context表示资源路径(点表示当前路径),dockerfile用于寻找我们的Dockerfile文件(默认就是Dockerfile,可以不写,除非将Dockerfile改名了)挂载后容器和主机的对应文件夹就可以相互影响。我们可以看到,两者实际上是一一对应的,这是语法风格不同罢了,其中version: "3.8"是DockerCompose的语法版本。一共需要两个文
目录
1.3.2.1 将jar包、Dockerfile文件放在linux同一个文件夹下
2.1 从docker run到DockerCompose的过渡
1 手动部署(白雪版)
1.1 创建网络
指令:
#创建网络
docker network create
#查看网络
docker network ls
示例:
注意:
后面的部署都需使用该网络,这样不同容器之间才能互联,且能通过容器名访问,而不是IP。
1.2 MySQL的部署
1.2.1 准备
在/root下创建mysql文件夹,然后在mysql文件夹中创建data、conf、init三个文件夹,分别用于挂载数据目录、配置文件、初始化脚本。挂载后容器和主机的对应文件夹就可以相互影响。
向conf文件夹中添加配置文件(.cnf),本人使用的是Xftp 7
配置文件内容大概如下,设置编码格式:
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
向init的文件夹中添加.sql文件,挂载数据卷后自动创建数据库 、自动建表。所创建的东西都会保存在data文件夹下
大致内容如下:
-- 导出 mall 的数据库结构
DROP DATABASE IF EXISTS `hmall`;
CREATE DATABASE IF NOT EXISTS `hmall`;
USE `hmall`;
-- 导出 表 hmall.address 结构
DROP TABLE IF EXISTS `address`;
CREATE TABLE IF NOT EXISTS `address` (
-- 其它内容
);
-- 其它内容
1.2.2 部署
指令:
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
--network project \
mysql
指令解析:
docker run -d
: 后台运行容器。--name mysql
: 指定容器的名称为 "mysql"。-p 3306:3306
: 将主机的 3306 端口映射到容器的 3306 端口,使得可以通过主机访问 MySQL 服务。-e TZ=Asia/Shanghai
: 设置容器的时区为亚洲/上海。-e MYSQL_ROOT_PASSWORD=123
: 设置 MySQL root 用户的密码为 "123"。-v /root/mysql/data:/var/lib/mysql
: 将主机上/root/mysql/data
目录挂载到容器的/var/lib/mysql
目录,用于持久化存储 MySQL 数据。-v /root/mysql/conf:/etc/mysql/conf.d
: 将主机上/root/mysql/conf
目录挂载到容器的/etc/mysql/conf.d
目录,用于提供自定义的 MySQL 配置文件。-v /root/mysql/init:/docker-entrypoint-initdb.d
: 将主机上/root/mysql/init
目录挂载到容器的/docker-entrypoint-initdb.d
目录,该目录下的 SQL 脚本将在容器启动时执行,用于初始化数据库。--network project
: 将容器连接到名为 "project" 的 Docker 网络。最后,
mysql
表示使用的是官方 MySQL 镜像,并且没有指定版本,将默认使用最新版本。
运行结果:
这时候再打开data文件夹我们就可以看到,数据库和表自动被创建好了
1.3 Java项目的部署
1.3.1 准备
1.3.1.1 将Java项目打成jar包
pom.xml中添加插件:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 其它内容 -->
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source> <!-- depending on your project -->
<target>11</target> <!-- depending on your project -->
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
使用Maven打包:
找到jar包:
1.3.1.2 编写Dockerfile文件
代码如下:
# 基础镜像
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"]
代码解析(大同小异,改改就能用):
FROM openjdk:11.0-jre-buster
: 指定了基础镜像为 OpenJDK 11 的运行环境,基于 Debian Buster 操作系统。
ENV TZ=Asia/Shanghai
: 设置环境变量TZ
为亚洲/上海时区。
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
: 在容器内运行命令,将时区链接到/etc/localtime
,并设置容器的时区。
COPY hm-service.jar /app.jar
: 将主机上的hm-service.jar
文件复制到容器内的/app.jar
。
ENTRYPOINT ["java", "-jar", "/app.jar"]
: 指定容器启动时执行的命令,即运行 Java 应用程序的 JAR 文件/app.jar
。
1.3.2 部署
1.3.2.1 将jar包、Dockerfile文件放在linux同一个文件夹下
1.3.2.2 构建镜像
指令:
docker build -t hmall .
指令解读:
这个命令中,最后一部分表示在目录中查找名为
Dockerfile
的文件(如果是点则表示当前目录),并使用它来构建(-t)一个名为 hmall版本号为latest(没指定版本号默认latest)
的Docker镜像。
运行截图:
1.3.2.3 创建并运行容器
指令:
#部署并运行容器
docker run -d --name hmall --network project -p 8080:8080 hmall
#查看容器日志
docker logs hmall
运行截图:
1.4 前端项目的部署
1.4.1 准备挂载文件
一共需要两个文件(夹),一个是我们的前端项目文件夹,一个是我们的nginx配置文件,将他们都放在linux同一个文件夹下,这里使用的是/root/nginx文件夹下
其中配置文件的内容如下(大同小异改改就能用):
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/json;
sendfile on;
keepalive_timeout 65;
server {
listen 18080;
# 指定前端项目所在的位置(容器内的位置)
location / {
root /usr/share/nginx/html/hmall-portal;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
rewrite /api/(.*) /$1 break;
# 容器在同一个网络,可以使用容器名访问,hamll就代表了其IP
proxy_pass http://hmall:8080;
}
}
server {
listen 18081;
# 指定前端项目所在的位置(容器内的位置)
location / {
root /usr/share/nginx/html/hmall-admin;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
rewrite /api/(.*) /$1 break;
# 容器在同一个网络,可以使用容器名访问,hamll就代表了其IP
proxy_pass http://hmall:8080;
}
}
}
1.4.2 部署
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 project \
nginx
注意:端口号要与项目一致
1.5 测试
1.5.1 获取宿主机linux的IP地址
如果不能使用ifconfig命令,则先使用如下命令,下载相关应用:
sudo yum install net-tools -y
1.5.2 进行访问
能够成功访问就成功了,撒花!!!
2 DockerCompose自动化部署(章鱼哥直接拿捏)
在我们的手动部署的过程中,非常繁琐且容易出错,接下来我将介绍更加高效且优雅的方式。"章鱼哥"--DockerCompose
2.1 从docker run到DockerCompose的过渡
以mysql的docker run部署指令为例,如下:
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
--network project
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:
- "/root/mysql/conf:/etc/mysql/conf.d"
- "/root/mysql/data:/var/lib/mysql"
networks:
- new
networks:
new:
name: project
我们可以看到,两者实际上是一一对应的,这是语法风格不同罢了,其中version: "3.8"是DockerCompose的语法版本。
与上述例子我们可以得到对应表,如下:
docker run参数 | DockerCompose指令 | 说明 |
---|---|---|
--name | container_name | 容器名称 |
-p | ports | 设置端口映射 |
-e | environment | 环境设置 |
-v | volumes | 数据卷挂载 |
--network | networks | 网络设置 |
镜像名称(这里是mysql) | image | 镜像名称 |
2.2 常用命令
docker compose [OPTIONS] [COMMAND]
OPTIONS和COMMAND都是可选参数,比较常见的有,该图片来自黑马程序员:
2.3 部署
2.3.1 编写docker-compose.yml文件
大同小异,先CV再改改:
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: project
不过这里有几个点需要注意:
①被depends_on指令标记的会被优先部署,在这里mysql就会被优先部署
②build是用来构建镜像的,context表示资源路径(点表示当前路径),dockerfile用于寻找我们的Dockerfile文件(默认就是Dockerfile,可以不写,除非将Dockerfile改名了)
③由于我们没给hamll指定镜像名称,docker会自动给它起名root-xx,这里是root-hmall
2.3.2 部署运行
根据docker-compose.yml文件中的路径,将所需的jar包和Dockerfile文件(详情可看1.3.2.1)、mysql文件夹(详情可看1.2.1)、nginx文件夹(详情可看1.4.1)、以及docker-compose.yml放在对应路径下,我这里全部放在一个文件夹下,如下:
在docker-compose.yml目录下执行指令,进行部署:
docker compose up -d
测试和访问参考1.5
更多推荐
所有评论(0)