目录
1.3.2.1 将jar包、Dockerfile文件放在linux同一个文件夹下
2.1 从docker run到DockerCompose的过渡
指令:
- #创建网络
- docker network create
- #查看网络
- docker network ls
示例:
注意:
后面的部署都需使用该网络,这样不同容器之间才能互联,且能通过容器名访问,而不是IP。
在/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` (
- -- 其它内容
- );
-
- -- 其它内容
指令:
- 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文件夹我们就可以看到,数据库和表自动被创建好了
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.pluginsgroupId>
- <artifactId>maven-compiler-pluginartifactId>
- <version>3.8.1version>
- <configuration>
- <source>11source>
- <target>11target>
- configuration>
- plugin>
- plugins>
- pluginManagement>
- build>
- project>
使用Maven打包:
找到jar包:
代码如下:
- # 基础镜像
- 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
。
指令:
docker build -t hmall .
指令解读:
这个命令中,最后一部分表示在目录中查找名为
Dockerfile
的文件(如果是点则表示当前目录),并使用它来构建(-t)一个名为 hmall版本号为latest(没指定版本号默认latest)
的Docker镜像。
运行截图:
指令:
- #部署并运行容器
- docker run -d --name hmall --network project -p 8080:8080 hmall
- #查看容器日志
- docker logs hmall
运行截图:
一共需要两个文件(夹),一个是我们的前端项目文件夹,一个是我们的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;
- }
- }
- }
- 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
注意:端口号要与项目一致
如果不能使用ifconfig命令,则先使用如下命令,下载相关应用:
sudo yum install net-tools -y
能够成功访问就成功了,撒花!!!
在我们的手动部署的过程中,非常繁琐且容易出错,接下来我将介绍更加高效且优雅的方式。"章鱼哥"--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 | 镜像名称 |
docker compose [OPTIONS] [COMMAND]
OPTIONS和COMMAND都是可选参数,比较常见的有,该图片来自黑马程序员:
大同小异,先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
根据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