windows下docker部署vue和spring boot以及docker-compose的使用
docker的理解首先,docker是基于linux系统的,它有两个核心images镜像和container容器,镜像就相当于你装系统时的win7系统镜像,容器就是你安装完成后的win7系统,那么docker就是在你真实的系统上,生成了多个虚拟的linux系统,它们之间互相不影响而且还很纯净,如果你想重头再来就把容器删了,用镜像再生成一个,爽哉docker desktop的安装前提:必须是win1
docker的理解
首先,docker是基于linux
系统的,它有两个核心images镜像
和container容器
,镜像就相当于你装系统时的win7系统镜像,容器就是你安装完成后的win7系统,那么docker就是在你真实的系统上,生成了多个虚拟的linux系统,它们之间互相不影响而且还很纯净,如果你想重头再来就把容器删了,用镜像再生成一个,爽哉
docker desktop的安装
前提:必须是win10系统以上
1、下载docker客户端docker desktop,什么也不要更改一路next,强迫症不想放C盘实属没啥必要
2、在桌面左下角的搜索中搜启用或关闭windows功能
(或者在运行中输入optionalfeatures
),勾选Hyper-V
3、下载后如果启动报错,WSL 2
异常,那就是电脑缺个东西,点这下载wsl.msi
,然后安装后重启电脑就ok
4、提升下载速度修改一下镜像源,设置->Docker Engine
,写入"http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"
5、此时在cmd中,就可以使用docker
和docker-compose
命令了。
docker部署vue项目
1、在一个空目录里面新建文件Dockerfile
(没有后缀),docker只认这个
2、将vue项目build
后的dist
文件夹也复制到这里来
3、启动vue项目得配个nginx
不是,所以得新建一个nginx
的配置default.conf
3、编辑Dockerfile
FROM nginx # 下载nginx
COPY default.conf /etc/nginx/conf.d/default.conf # 将本地的default.conf复制到容器的conf.d文件夹下
nginx重启的时候,会把conf.d下面的所有配置跟nginx.conf合并一下然后再启动
4、配置nginx
server {
listen 80;
server_name localhost;
client_max_body_size 10M;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
location / {
root /home/web/dist;
index index.html index.htm;
}
# 代理服务器端,详细下面要讲
location /lop {
proxy_pass http://java-service:8081/lop;
}
# 代理websoket
location /lop/socket {
proxy_pass http://java-service:8081/lop/socket;
proxy_connect_timeout 4s;
proxy_read_timeout 7200s;
proxy_send_timeout 12s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
5、在当前目录打开cmd
,输入
docker build -t images-name . #-t: 给镜像命名 注意:不要少了.
此时,打开docker desktop
在Images
里就会有镜像,或者在命令里面输入docker images
6、生成容器(也可以直接在docker desktop上操作)
docker run -d -p 8080:80 --name container-name images-name # 最后须指定镜像名称
-d: 后台运行
-p: 指定端口,对外端口8080,容器内部端口为80,意思就是在外部访问localhost:8080的时候其实是访问容器的80端口
–name: 给容器起个名字
docker部署spring boot
跟部署vue差不多,就是先下载java:8
,然后把 .jar
包复制到容器里面去,区别就是这个直接用java启动
docker-compose
这玩意其实就是个docker
的管理器,比如你要部署一个完整的项目,你就必须要把vue/spring boot/mysql/redis等
部署在一个容器里面,此时我仅仅想重启一下nginx,就比较困难,得进入容器里面才可实现,而如果你把它们部署在不同的容器里面,容器之间的交互,以及容器和镜像的生成又挺麻烦,那么docker-compose就是解决这个痛点。
先看目录
核心文件docker-compose.yml
放在根目录下,用来管理多个docker
version: '3.8' # docker-compose的版本
services:
mysql-service: # 声明mysql-service服务
container_name: mysql-service # mysql的容器名称
build: # 相当于 docker build
context: ./mysql-service # 指定上下文路径
dockerfile: Dockerfile # 指定docker要执行的文件
ports: # 声明内外端口
- 3306:3306
restart: always # 重启容器时也重启Mysql
environment: # 环境变量,声明后可以直接在容器内使用,此处MYSQL_ROOT_PASSWORD默认是mysql的登陆密码,无需在dockerfile中声明
MYSQL_ROOT_PASSWORD: 123456
volumes: # 数据卷映射,c:/docker_volumes/,下面细讲
- /c/docker_volumes/mysql:/home/mysql
- /c/docker_volumes/mysql_data:/var/lib/mysql
redis-service:
container_name: redis-service
image: redis # redis没有其他配置,所以直接此处指定Image,它会自动下载最新的redis镜像
ports:
- 6379:6379
restart: always
java-service:
container_name: java-service
build:
context: ./java-service
dockerfile: Dockerfile
environment: # 将mysql和redis的服务赋予java容器的变量
MYSQL_SERVER: mysql-service
REDIS_SERVER: redis-service
ports:
- 8081:8081
- 8899:443/udp
restart: always
volumes:
- /c/docker_volumes/java:/home/java
- /c/docker_volumes/static_data:/home/server/static
command: java -jar /home/java/ofilm-service-0.0.1-SNAPSHOT.jar # 生成容器后 调用指令启动java服务
depends_on: # 依赖,mysql和redis生成后再生成java
- mysql-service
- redis-service
vue-web:
container_name: vue-web
build:
context: ./vue-web
dockerfile: Dockerfile
ports:
- "8080:8080"
depends_on:
- java-service
volumes:
- /c/docker_volumes/web:/home/web
mysql
# Dockerfile
FROM mysql:5.7
COPY init-data.sql init-data.sql # 将mysql的初始化sql文件复制到容器内
COPY init.sql /docker-entrypoint-initdb.d/ # mysql会自动加载docker-entrypoint-initdb.d下的sql文件进行初始化
init.sql
CREATE DATABASE `test-boot` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
use test-boot;
source /init-data.sql;
java
# Dockerfile
FROM java:8
ENV MYSQL_SERVER="" \ # 声明两个环境变量,docker-compose.yml里面进行了赋值
REDIS_SERVER=""
在代码中使用环境变量
spring:
#redis 配置
redis:
database: 0
host: ${REDIS_SERVER}
password: ''
port: 6379
datasource:
url: jdbc:mysql://${MYSQL_SERVER}:3306/test-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
vue
# Dockerfile
FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf
vue和java都有一个问题,它们的执行包没有包含在docker-compose里面,因为我用了数据卷映射
数据卷映射
痛点1:第一次部署完成后,再次部署只需要替换vue和java的执行包就可完成,但是docker-compose无法实现其中单个容器的build
痛点2:mysql的数据以及java保存文件的数据,一旦容器重新生成,之前的数据就会清空
解决:
java文件下放.jar
包
mysql底下放update.sql
,用来处理后续表结构和数据的更新
static_data映射java服务器保存文件目录
mysql_data映射mysql的数据
web文件下放dist
windows.bat
第一次部署使用该脚本
docker-compose up --detach --build
update.bat
后续的更新部署,只需要替换docker_volumes下web和java的运行包,然后重启两个服务即可
docker-compose restart vue-web
docker-compose restart java-service
mysql数据的更新
update.sql
映射到了容器的/home/mysql
目录,只需进入mysql的容器里面
进入mysql
mysql -uroot -p123456
然后执行更新文件
source /home/mysql/update.sql
docker常用命令
docker images # 查看所有镜像
docker rmi -f [镜像id]
docker pull java:8 # 拉取镜像
docker ps # 查看所有容器
docker start [容器名/容器ID]
docker restart [容器名/容器ID]
docker stop [容器名/容器ID]
docker kill [容器名/容器ID] #强制停止
docker rm [容器名/容器ID]
docker build -t images-name . # 生成镜像
docker run -d -p 8080:80 --name container-name images-name # 生成容器
docker exec -it [容器名/id] /bin/bash # 进入容器并以命令交互
docker cp 容器id:容器内部路径 目的主机路径 # 将容器中文件拷贝到主机上
docker system prune # 清除none镜像 数据卷
更多推荐
所有评论(0)