docker-compose 是一個把 docker 自動化的工具??梢园阉蟹睆?fù)的 docker 操作全都一條命令,自動化的完成。就好比每一個docker容器是一個生產(chǎn)車的機(jī)器,但是機(jī)器不能自動生產(chǎn)車,需要一系列有序的順序控制才能完整的生產(chǎn)車,這就是docker-compose。包括從容器的構(gòu)建到容器間的相互配合使用。
docker+springboot+nginx+mysql實(shí)現(xiàn)負(fù)載均衡
代碼:https://github.com/jiajia154569836/dockercompose-springboot-mysql-nginx
項(xiàng)目目錄結(jié)構(gòu)

image.png
1.java代碼 記錄服務(wù)器IP和客戶端訪問IP
@RestController
public class VisitorController {
@Autowired
private VisitorRepository repository;
@RequestMapping("/")
public String index(HttpServletRequest request) throws UnknownHostException {
String ip=request.getRemoteAddr();
Visitor visitor=repository.findByIp(ip);
if(visitor==null){
visitor=new Visitor();
visitor.setIp(ip);
visitor.setTimes(1);
}else {
visitor.setTimes(visitor.getTimes()+1);
}
repository.save(visitor);
InetAddress address = InetAddress.getLocalHost();
//System.out.println(address.getHostName());//主機(jī)名
return "當(dāng)前服務(wù)器名:"+address.getHostName()+"當(dāng)前服務(wù)器ip"+address.getHostAddress()+"I have been seen ip "+visitor.getIp()+" "+visitor.getTimes()+" times.";
}
}
2.application-docker.properties
spring.datasource.url=jdbc:mysql://mysql:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
注意:這里的mysql:3306中mysql在docker中是一個服務(wù)
3.與app同級目錄下新建docker-compose.yaml
version: '3'
services:
nginx:
container_name: v-nginx
image: nginx:1.13
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
mysql:
container_name: v-mysql
image: mysql/mysql-server:5.7
environment:
MYSQL_DATABASE: test
MYSQL_ROOT_PASSWORD: 123456
MYSQL_ROOT_HOST: '%'
ports:
- "3306:3306"
restart: always
app-1:
restart: always
build: ./app
working_dir: /app
volumes:
- ./app:/app
- ~/.m2:/root/.m2
expose:
- "8080"
depends_on:
- nginx
- mysql
command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker
app-2:
restart: always
build: ./app
working_dir: /app
volumes:
- ./app:/app
- ~/.m2:/root/.m2
expose:
- "8080"
depends_on:
- nginx
- mysql
command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker
4.與app同級目錄下新建nginx目錄結(jié)構(gòu)如下

image.png
app.conf目錄
upstream app {
server dockercomposespringbootmysqlnginx_app-1:8080;
server dockercomposespringbootmysqlnginx_app-2:8080;
}
server {
listen 80;
charset utf-8;
access_log off;
location / {
proxy_pass http://app;
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;
}
}
注意這里的server dockercomposespringbootmysqlnginx_app-1:8080;
這需要先輸入命令:docker ps查看起的springboot項(xiàng)目的名字

image.png
當(dāng)nginx報錯的時候就是這里的問題:是項(xiàng)目名字錯誤因?yàn)橹匦虏渴鸬倪^程中項(xiàng)目名會根據(jù)版本在后面_1
5.用winscp工具上傳文件

image.png
6.這里有個技巧就是先運(yùn)行一下項(xiàng)目然后將項(xiàng)目需要的jar包下載下來然后將這些jar也復(fù)制到對應(yīng)的目錄中去,這樣可以節(jié)省下在的時間

image.png
7.進(jìn)入dockercompose-springboot-mysql-nginx
cd dockercompose-springboot-mysql-nginx
docker-compose up
然后下面的信息時

image.png
8.在頁面輸入http://192.168.229.134/ 并多次切換


image.png
當(dāng)發(fā)現(xiàn)兩個服務(wù)器IP不同則實(shí)現(xiàn)負(fù)載
關(guān)閉服務(wù)
docker-compose down
至此docker+springboot+nginx+mysql實(shí)現(xiàn)負(fù)載均衡完成
代碼:https://github.com/jiajia154569836/dockercompose-springboot-mysql-nginx