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中,就可以使用dockerdocker-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 desktopImages里就会有镜像,或者在命令里面输入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镜像 数据卷
Logo

前往低代码交流专区

更多推荐