系统:CentOS 7.9 64位。已安装:docker、docker-compose、maven、jdk。
docker-compose 部署 springboot mysql nginx。
0、目录结构:
└── exampledemo
├── app
│ ├── Dockerfile
│ ├── pom.xml
│ └── src
│ ├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── springbootlearn
│ │ ├── controller
│ │ │ └── HelloController.java
│ │ ├── entity
│ │ │ └── Hello.java
│ │ ├── Repository
│ │ │ └── HelloRepository.java
│ │ └── SpringbootlearnApplication.java
│ └── resources
│ ├── application-dev.properties
│ ├── application-docker.properties
│ ├── application.properties
│ └── banner.txt
├── docker-compose.yaml
└── nginx
└── conf.d
└── app.conf
docker-compose.yaml:
version: '3' # 第三代语法来构建 docker-compose.yaml 文件
services: # 定义服务,用来表示 compose 需要启动的服务
nginx: # 二级标签,服务名称,用户自己定义
container_name: c-nginx # 容器名称
image: nginx:1.13 # 指定服务镜像的名称或ID,如果本地镜像不存在,Compose将会尝试拉取这个镜像
restart: always # 自动重启,如果服务启动不成功会一直尝试。
ports: # 对外开放的端口。这里主机的端口映射到nginx容器端口,和expose的区别是,expose不会将端口暴露给主机。
- 80:80 # 绑定容器的80端口到主机的80端口。前面的80是主机端口,后面的80是容器的端口
volumes: # 加载本地目录下的配置文件到容器目标地址下
- ./nginx/conf.d:/etc/nginx/conf.d # 将主机的./nginx/conf.d文件夹映射到容器内的/etc/nginx/conf.d文件夹。
mysql:
container_name: c-mysql
image: mysql/mysql-server:5.7
environment:
MYSQL_DATABASE: springbootlearn # 创建名为springbootlearn的库
MYSQL_ROOT_PASSWORD: 123456 # 设置root用户的密码
MYSQL_ROOT_HOST: '%'
ports:
- "3306:3306"
restart: always
app:
restart: always
build: ./app
working_dir: /app #设置工作目录为容器内的app文件夹
volumes:
- ./app:/app
- ~/.m2:/root/.m2
expose: # expose暴露容器给link到当前容器的容器。和port的区别是,expose不会将端口暴露给主机。这里将当前容器的端口8080暴露给link到本容器app的容器。
- "8080"
depends_on: # 先启动 depends_on 下面的服务后,再启动本服务。依赖于nginx,mysql容器,被依赖容器启动后app容器才启动。
- nginx
- mysql
command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker # 使用该命令启动项目,使用 application-docker.properties配置文件
app.conf:
server {
listen 80;
charset utf-8;
access_log off;
location / {
proxy_pass http://app:8080; # 80端口的请求转发到服务app的8080端口。这里使用是app而不是localhost,是因为他们没有在一个容器中,在一组 compose 的services服务通讯需要使用 services 下的名称进行访问
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static {
access_log off;
expires 30d;
alias /app/static;
}
}
Dockerfile:
FROM maven:3.6-jdk-8
因为docker-compose.yaml中的app部分用了下面这个命令:
command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker
所以在application-docker.properties
中将数据库的连接信息
localhost改为mysql。mysql为docker-compose.yaml
中services下用户自己定义服务名称
jdbc:mysql://localhost:3306/springbootlearn?serverTimezone=GMT%2B8&useSSL=false
改为:
jdbc:mysql://mysql:3306/springbootlearn?serverTimezone=GMT%2B8&useSSL=false
1、执行命令:docker-compose up
启动服务
在exampledemo目录下,执行
root@xxxxxxxx exampledemo # docker-compose up
2、测试访问
curl http://127.0.0.1/hello
3、查看容器docker ps
root@xxxxxxx ~ # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41359054f00b exampledemo_app "/usr/local/bin/mvn-…" 5 minutes ago Up 5 minutes 8080/tcp exampledemo_app_1
ac63e615b4c5 mysql/mysql-server:5.7 "/entrypoint.sh mysq…" 5 minutes ago Up 5 minutes (healthy) 0.0.0.0:3306->3306/tcp, 33060/tcp c-mysql
c7f7138f3f66 nginx:1.13 "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp c-nginx
4、docker-compose down
可关闭服务
root@xxxxxxxxxxx exampledemo # docker-compose down
Stopping exampledemo_app_1 ... done
Stopping c-mysql ... done
Stopping c-nginx ... done
Removing exampledemo_app_1 ... done
Removing c-mysql ... done
Removing c-nginx ... done
Removing network exampledemo_default