Docker部署springboot+vue项目(网桥模式)

系列文章

CentOS 7下安装Docker

Docker部署springboot+vue项目

Docker部署微服务

目录

简介

部署(网桥模式)

     步骤:

         创建自定义网桥并查看

         启动redis(默认已经有镜像)

         启动mysql(默认已经有镜像)

         创建springboot镜像(Dockerfile方式)

         启动springboot并查看

         创建vue镜像(Dockerfile方式)

         启动vue并查看

         最后访问查看是否成功


简介

  • docker是目前主流的部署构建工具,其具有以下特点:

        1.应用相互隔离,安全性高

        2.持续集成与部署

        3.版本控制与迭代

        4.环境一致性

        5.可移植性好

  • docker的网络模式:

模式 命令 说明
bridge --network=bridge 桥接式网络模式,创建时默认为此模式,桥接默认为主机的docker0网卡
host --network=host 宿主网络模式,使用host模式这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
container --network=container:NAME_or_ID 容器共享网络模式,container模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享IP、端口范围
none --network=none 无网络模式(禁用网络模式),使用none模式的docker容器拥有自己的Namework NameSpace,但是并不给docker容器进行网络配置,相当于docker容器并没有IP和端口、路由等信息,这种模式下的网络需要用户手动配置
自定义网桥 --network=自定义网桥名 自定义网桥模式,使用docker network create创建自定义的网络,其可以实现自定义网段、网络名、网关等,同时,通过依赖不同的网络驱动模式,还可以实现单主机容器之间通信、跨主机容器通信等

 

  • docker的可自定义网络驱动模式 

自定义驱动模式 命令 说明
bridge -d bridge Docker设计的NAT网络模型,启动和新增自定义网络默认驱动模式。
Docker daemon启动时会在主机创建一个Linux网桥(默认为docker0,可通过-b参数手动指定)。容器启动时,Docker会创建一对veth pair(虚拟网络接口)设备,veth设备的特点是成对存在,从一端进入的数据会同时出现在另一端。Docker会将一端挂载到docker0网桥上,另一端放入容器的Network Namespace内,从而实现容器与主机通信的目的。
overlay -d overlay Docker原生的跨主机多子网模型。
overlay网络模型比较复杂,底层需要类似consul或etcd的KV存储系统进行消息同步,核心是通过Linux网桥与vxlan隧道实现跨主机划分子网。
macvlan -d macvlan 类似虚拟机桥接模式的虚拟网卡模型。
使用macvlan网络驱动程序为每个容器的虚拟网络接口分配MAC地址,使其看起来像是直接连接到物理网络的物理网络接口。在这种情况下,您需要在Docker主机上指定用于的物理接口macvlan,以及的子网和网关macvlan。您甚至可以macvlan使用不同的物理网络接口隔离网络。
  • 对于单机通信docker提供了很多种解决方案

  1. link 指向
  2. 每个隔离网络中的虚拟IP
  3. 自定义网桥
  • 对于跨主机通信docker解决方案也有不少

  1. overlay的swarm集群管理
  2. macvlan自定义虚拟网卡
  3. 自定义路由规则

部署(网桥模式)

这里针对springboot+vue项目选择自定义网桥模式进行部署,单主机容器通信。

步骤:

  • 创建自定义网桥并查看

[root@localhost ~]# docker network create test

[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
83f250908117        bridge              bridge              local
47e72ec6e54f        host                host                local
7625e7ac34b5        none                null                local
74abbe89a42e        test                bridge              local
  •  启动redis(默认已经有镜像)


[root@localhost ~]# docker run -d -p 6379:6379 --name redis --restart always --network test redis

          --restart always    一直尝试重启

          --network    指定所在网络

  •  启动mysql(默认已经有镜像)

[root@localhost ~]# docker run -d -p 3306:3306 --name mysql -v /home/data/mysql:/var/lib/mysql --restart always -e MYSQL_ROOT_PASSWORD=12345 
--network test mysql:5.7

          -v    挂载mysql数据目录

          --restart always   一直尝试重启

          -e   设置docker启动时候的环境变量,这里为mysql的root密码

          --network   指定所在网络

  •  创建springboot镜像(Dockerfile方式)

        1)  Dockerfile:

FROM java:8
COPY ruoyi.jar /data/ruoyi.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/data/ruoyi.jar"]

           FROM   依赖基础镜像

           COPY   复制XX到XX

           ENTRYPOINT    容器启动后执行,有且只能有一个

        2)项目配置

          redis:

 # redis 配置
  redis:
    # 地址
    host: redis
    # 端口,默认为6379
    port: 6379

           mysql:

# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://mysql:3306/ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: root
                password: 12345

          注意redis的host和mysql的url,IP地址都是docker中的别名!!

         3) 打包并上传到服务器,然后创建镜像

[root@localhost boot]# docker build -t ruoyi .

Sending build context to Docker daemon  69.36MB
Error response from daemon: the Dockerfile (Dockerfile) cannot be empty
[root@localhost boot]# docker build -t ruoyi .
Sending build context to Docker daemon  69.36MB
Step 1/3 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/3 : COPY ruoyi.jar /data/ruoyi.jar
 ---> 2e2d95a181fc
Step 3/3 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/data/ruoyi.jar"]
 ---> [Warning] IPv4 forwarding is disabled. Networking will not work.
 ---> Running in ec730fc90fe5
Removing intermediate container ec730fc90fe5
 ---> 51f237e62a1f
Successfully built 51f237e62a1f
Successfully tagged ruoyi:latest

          注意检查自己是否有java8的镜像

  • 启动springboot并查看

[root@localhost boot]# docker run -d -p 9002:9002 --network test -v /home/project/test/boot:/data --restart always --name ruoyi-boot ruoyi


[root@localhost boot]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                               NAMES
c7597fa50e41        ruoyi               "java -Djava.securit…"   About a minute ago   Up 14 seconds       0.0.0.0:9002->9002/tcp              ruoyi-boot
e18cb16a41fb        redis               "docker-entrypoint.s…"   6 days ago           Up 40 seconds       0.0.0.0:6379->6379/tcp              redis
f12c1bfc81ca        mysql:5.7           "docker-entrypoint.s…"   6 days ago           Up 40 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

          -v    挂载boot项目目录,便于持续集成

          --restart always   一直尝试重启

          --network   指定所在网络

  •  创建vue镜像(Dockerfile方式)

         1) Dockerfile:

FROM nginx
COPY dist/ /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
RUN echo 'build OK!'

             dist目录为vue打包后的目录集合

             需要复制dist静态文件和nginx的配置文件到相应位置          

          2)  nginx.conf

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

		location / {
            root   /usr/share/nginx/html;
			try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }
		
		location /prod-api/{
			proxy_set_header Host $http_host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header REMOTE-HOST $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_pass http://ruoyi-boot:9002/;
		}
		

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

             这里要注意你监听的端口和root静态文件所在位置,还有,你需要代理的正确请求

          3) vue打包并上传nginx.conf、dist、Dockerfile到服务器,创建镜像

[root@localhost vue]# docker build -t ruoyi-vue .
Sending build context to Docker daemon  4.316MB
Step 1/4 : FROM nginx
 ---> 602e111c06b6
Step 2/4 : COPY dist/ /usr/share/nginx/html
 ---> 9d0038dafbb1
Step 3/4 : COPY nginx.conf /etc/nginx/nginx.conf
 ---> 72ca2a0e61bd
Step 4/4 : RUN echo 'build OK!'
 ---> Running in e623069284db
build OK!
Removing intermediate container e623069284db
 ---> 1aff01152634
Successfully built 1aff01152634
Successfully tagged ruoyi-vue:latest
  •  启动vue并查看

[root@localhost vue]# docker run -d -p 80:80 -v /home/project/test/vue/dist:/usr/share/nginx/html --name ruoyi-vue --network test ruoyi-vue

89ae7fd7f3a9c2972fba4c0c2c81ae3f755f930189cbbc82c39efb76e9f284e6

[root@localhost vue]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
89ae7fd7f3a9        ruoyi-vue           "nginx -g 'daemon of…"   21 seconds ago      Up 20 seconds       0.0.0.0:80->80/tcp                  ruoyi-vue
c7597fa50e41        ruoyi               "java -Djava.securit…"   20 minutes ago      Up 18 minutes       0.0.0.0:9002->9002/tcp              ruoyi-boot
e18cb16a41fb        redis               "docker-entrypoint.s…"   6 days ago          Up 19 minutes       0.0.0.0:6379->6379/tcp              redis
f12c1bfc81ca        mysql:5.7           "docker-entrypoint.s…"   6 days ago          Up 19 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

  • 最后访问查看是否成功

Docker部署springboot+vue项目(网桥模式)_第1张图片

你可能感兴趣的:(Docker)