1、思路
- docker部署项目是将项目的不同程序放入不同容器中运行,这样可以方便管理不同程序。
- 我的项目有Springboot、Vue、mysql三部分,Vue用nginx代理,因为nodejs太占空间了。
- 一开始我是用Dockerfile创建镜像再运行容器的,但发现它是基于别的镜像再创建镜像,比较占空间。
- 用docker-compose直接配置原镜像,用数据卷实现配置文件挂载加载,就能运行容器,不需要额外创建镜像,很快很节约,还没发现弊端。
2、编写docker-compose
- 在总项目(包含Springboot、Vue项目)目录下再创建一个文件夹
app2Docker
专门放打包后的项目,在app2Docker
里创建docker-compose.yml
,内容如下。
version: '3'
services:
mysql-container:
image: mysql:5.7
container_name: mysql-container
environment:
MYSQL_ROOT_PASSWORD: "root"
# MYSQL_DATABASE:数据库名
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
blog_springboot:
image: openjdk:8-jdk
container_name: blog_springboot
ports:
- "8100:8100"
volumes:
# 目标文件夹会自动创建
- ./blog_springboot:/app
- ./myupload:/app/upload
working_dir: /app
command: java -jar simple_blog_backend-0.0.1-SNAPSHOT.jar --spring.config.location=file:./application.properties
blog_vue_nginx:
container_name: blog_vue_nginx
image: nginx
# 80http端口转发到8080https端口
ports:
- "80:80"
- "8080:8080"
volumes:
- ./blog_vue/dist:/usr/share/nginx/html
- ./blog_vue/SSL_test_key/mycert.crt:/etc/nginx/certs/mycert.crt
- ./blog_vue/SSL_test_key/mykey.key:/etc/nginx/certs/mykey.key
- ./blog_vue/my_nginx.conf:/etc/nginx/conf.d/my_nginx.conf
#调用Dockerfile的写法
# blog_springboot:
# build:
# dockerfile所在文件夹
# context: ./blog_springboot
# dockerfile:Dokerfile 名,默认的话这一项可省略
# container_name: blog_springboot
# ports:
# - "8100:8100"
# volumes:
# 目标文件夹会自动创建
# - ./myupload:/app/upload
#使用容器间网络
networks:
default:
name: my_network
#不会覆盖已有数据卷
volumes:
mysql-data:
- 运行
docker-compose.yml
运行前,把打包后的Springboot、Vue项目放入app2Docker
里对应的子文夹里
然后把app2Docker
文件夹拷贝到docker toolbox虚拟机的/home目录下
cd /home/app2Docker
进入目录,执行docker-compose up -d
启动多个容器,执行docker-compose down
停止并删除多个容器 - 安装docker-compose(补充)
但是docker toolbox虚拟机不自带docker-compose,执行如下命令下载docker-compose:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
赋予 Docker Compose 可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
3、代码分析
- 第一段创建
mysql-container
容器,设置数据库密码为root,保存数据库数据到数据卷mysql-data
; - 第二段创建
blog_springboot
容器,加载程序和配置文件到容器内/app
,挂载./myupload
文件夹来保存java程序上传图片等文件资源,'working_dir: /app
’设置后面command
命令的容器内工作路径,application.properties
是从Springboot工程里拷贝出来修改的,java加--spring.config.location=file:./application.properties
参数运行时只加载外部配置文件,在里面我修改了mysql访问地址
spring.datasource.url=jdbc:mysql://mysql-container:3306/simple_blog?serverTimezone=UTC&characterEncoding=utf-8&useSSL=true
mysql-container
是容器名,在docker-compose.yml
里后面定义了容器间网络my_network
,所以能通过容器名加端口号来进行通信。
- 第三段创建
blog_vue_nginx
容器,通过数据卷把dist
加载到nginx里,同时加载https的自签名证书mycert.crt
和mykey.key
,生成证书方法看文章链接,最后加载nginx代理的配置文件my_nginx.conf
实现http转发到https。
server {
listen 80;
server_name 192.168.99.100;
return 301 https://$host:8080$request_uri;
location / {
}
}
server {
listen 8080 ssl;
server_name 192.168.99.100;
ssl_certificate /etc/nginx/certs/mycert.crt;
ssl_certificate_key /etc/nginx/certs/mykey.key;
# 根目录指向 /usr/share/nginx/html
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
4、扩展
-
在docker toolbox虚拟机中操作可启动虚拟机后用Xshell连接:
主机:192.168.99.100(虚拟机的地址)
用户名默认:docker
密码默认:tcuser -
用Xftp传输文件(Xshell连接成功后并且安装了Xftp,点箭头所指就可以建立Xftp连接):
-
docker toolbox里的虚拟机系统/home是临时系统,重启会清空,使用数据卷或在VirtualBox的设置中配置共享文件夹,将主机上的目录共享到虚拟机的/home或其他目录。这样,/home目录就可以作为持久存储。
-
【docker快捷部署系列一】docker快速入门,安装docker