1.首先在linux机器安装docker以及docker-compose
2.创建docker自定义网络 (红色部分为docker网络设置,配置好后各个容器间才能通过容器IP进行通信)
查看docker默认三种网络(bridge、host、none)
docker network ls
删除自定义网络
docker network rm 自定义networkID
创建docker自定义网络
docker network create --subnet=172.18.0.0/16 net
3. 编写docker-compose.yml. 使用自定义的网络,指定容器IP
version: '3.7'
services:
mysql:
restart: always
image: mysql
container_name: mysql
ports:
- 3306:3306
networks:
default:
ipv4_address: 172.18.0.2
privileged: true
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
volumes:
- ./mysql/data:/var/lib/mysql
- /etc/localtime:/etc/localtime
redis:
image: redis:5
ports:
- 6379:6379
networks:
default:
ipv4_address: 172.18.0.3
restart: always
container_name: redis
command: redis-server --appendonly yes
volumes:
- ./redis/data:/data
- ./redis/conf/redis.conf:/etc/redis/redis.conf
- /etc/localtime:/etc/localtime
nginx:
restart: always
image: nginx
container_name: nginx
ports:
- 80:80
networks:
default:
ipv4_address: 172.18.0.4
volumes:
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/html:/usr/share/nginx/html
- ./nginx/logs:/var/log/nginx
- /etc/localtime:/etc/localtime
rabbitmq:
restart: always
image: rabbitmq:management
container_name: rabbitmq
ports:
- 5672:5672
- 15672:15672
networks:
default:
ipv4_address: 172.18.0.5
environment:
TZ: Asia/Shanghai
volumes:
- ./rabbitmq/data:/var/lib/rabbitmq
- /etc/localtime:/etc/localtime
elasticsearch:
restart: always
image: bolingcavalry/elasticsearch-with-ik:6.5.0
container_name: elasticsearch
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata:/usr/share/elasticsearch/data
- /etc/localtime:/etc/localtime
ports:
- 9200:9200
- 9300:9300
networks:
default:
ipv4_address: 172.18.0.9
environment:
TZ: Asia/Shanghai
kibana:
restart: always
image: docker.elastic.co/kibana/kibana:6.5.0
container_name: kibana
environment:
- elasticsearch.hosts=http://elasticsearch:9200
- i18n.locale=zh-CN
hostname: kibana
depends_on:
- elasticsearch
networks:
default:
ipv4_address: 172.18.0.8
environment:
TZ: Asia/Shanghai
ports:
- 5601:5601
volumes:
esdata:
driver: local
networks:
default:
external:
name: net
启动 docker-compose up -d 停止 docker-compose down
使用mysql客户端导入(ruoyi)数据库
需要其他容器继续在docker-compose.yml中添加即可
4.查看容器IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名
附nginx的初始配置
user root;
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; // 映射容器内部地址
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
附linux目录
5.服务器环境已经准备好,现在开始打包SpringBoot应用上传到服务器运行
以RuoYi-Vue项目作为演示
需要修改mysql和redis的host. 修改为容器IP即可
6.准备Dockerfile
# 该镜像需要依赖的基础镜像
FROM java:8
# 将当前目录下的jar包复制到docker容器的/目录下
ADD ruoyi-admin.jar /ruoyi-admin.jar
# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 运行过程中创建一个xx.jar文件
RUN bash -c 'touch /ruoyi-admin.jar'
# 声明服务运行在8080端口
EXPOSE 8080
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java","-jar","/ruoyi-admin.jar"]
7.准备run.sh脚本.SpringBoot容器启动使用自定义网络,指定IP
#!/usr/bin/env bash
# 定义应用名称
app_name='ruoyi-admin'
# 定义镜像名称
images_name='ruoyi-admin.jar'
# 定义应用环境
profile_active='druid'
echo '----copy jar----'
docker rm -f ${app_name}
echo '----rm container----'
docker rmi ${images_name}
echo '----rm image----'
# 打包编译docker镜像
docker build -t ${images_name} .
echo '----build image----'
docker run -p 8080:8080 --name ${app_name} \
--privileged \
--restart=always \
--net=net \
--ip 172.18.0.99 \
-e 'spring.profiles.active'=${profile_active} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/${app_name}/logs:/home/ruoyi/logs \
-d ${images_name}
echo '----start container----'
8.springboot项目打包.准备好这个3个文件并上传到服务器
9.chmod 777 run.sh
10.启动脚本 sh ./run.sh (请确保已经导入ruoyi数据库)
11.若依后台项目启动成功
12.部署若依前端项目.将build后的dist文件上传到/usr/local/docker/nginx/html(因为映射的容器路径是这个)
13.设置nginx反向代理 (这个配置若依官网文档有). 需要注意的是要将 proxy_pass 中的localhost换成后台项目的容器IP
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream ruoyi {
server 172.18.0.99:8080;
}
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /jl {
proxy_pass http://172.18.0.98:9090;
}
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/;
# proxy_pass http://172.18.0.6:8080/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
docker restart nginx
14.在宿主机访问虚拟机的80端口 (前端项目默认在80启动)
验证码能够显示出来,说明前后台已经联通.
至此完成了在docker-compose中启动SpringBoot项目,并且容器之间能够互相通信