CentOS 7下安装Docker
Docker部署springboot+vue项目
Docker部署微服务
简介
部署(网桥模式)
步骤:
创建自定义网桥并查看
启动redis(默认已经有镜像)
启动mysql(默认已经有镜像)
创建springboot镜像(Dockerfile方式)
启动springboot并查看
创建vue镜像(Dockerfile方式)
启动vue并查看
最后访问查看是否成功
1.应用相互隔离,安全性高
2.持续集成与部署
3.版本控制与迭代
4.环境一致性
5.可移植性好
模式 | 命令 | 说明 |
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创建自定义的网络,其可以实现自定义网段、网络名、网关等,同时,通过依赖不同的网络驱动模式,还可以实现单主机容器之间通信、跨主机容器通信等 |
自定义驱动模式 | 命令 | 说明 |
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使用不同的物理网络接口隔离网络。 |
这里针对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
[root@localhost ~]# docker run -d -p 6379:6379 --name redis --restart always --network test redis
--restart always 一直尝试重启
--network 指定所在网络
[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 指定所在网络
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的镜像
[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 指定所在网络
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
[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