以后端单体项目为例子
环境:后端项目,编译好的前端,mysql,redis
1.构建需要的镜像
后端镜像的Dockerfile
#依赖java8,我的jdk8镜像是自己构建的,你们可以用docker search搜一下选一个
FROM jdk8:1.0
#创建者
MAINTAINER gouge
#暴露8081端口
EXPOSE 8081
#将jar包打入镜像
ADD usmp-api.jar /usmp-api.jar
#挂载目录
VOLUME /tmp
#容器已启动 默认运行命令 java -jar app.jar
#生产环境启动 可以写#容器已启动 默认运行命令 java -jar app.jar
#ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=prod"]
#解决OOM问题 指定内存初始128M 最大300M ENTRYPOINT ["java","-jar","-Xms128m","-Xmx300m","/app.jar","--spring.profiles.active=prod"]
ENTRYPOINT ["java","-jar","/usmp-api.jar"]
这里注意的点,jar包和Dockerfile文件要在同一路径下
进入这个目录执行,docker build -t 镜像名:版本 . ,(不要忽略最后的点)
执行docker images查看是否构建成功
前端镜像的Dockerfile
# 使用官方Nginx基础镜像
FROM nginx:alpine
# 设置工作目录
WORKDIR /usr/share/nginx/html
# 将构建好的Vue应用文件复制到Nginx服务器目录
COPY ./dist/ .
# 复制自定义Nginx配置文件
#COPY nginx.conf /etc/nginx/conf.d/nginx.conf
# 暴露80端口
EXPOSE 80
# 启动Nginx服务器
CMD ["nginx", "-g", "daemon off;"]
将编译好的dist包,Dockerfile文件,nginx.conf文件放在同一路径下,nginx.conf最好提前配置好
执行docker build -t 镜像名:版本 .
docker images 查看是否构建成功
mysql和redis镜像从docker hub或阿里云拉取即可
2.编写docker-compose.yml文件
version: '3.8' #docker compose版本
services:
frontend: #服务名(网络别名,可以用于容器的互相访问)
image: usmp-ui:latest #使用的镜像名称
ports:
- "80:80" #端口映射
networks:
- app-network #使用的网络空间
backend:
image: usmp:latest
ports:
- "8081:8081"
depends_on: #容器的执行顺序,mysql和redis必须在后端之前执行
- mysql
- redis
networks:
- app-network
mysql:
image: mysql:8.0.26
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: usmp
MYSQL_USER: czc
MYSQL_PASSWORD: 1234
command: --lower_case_table_names=1
volumes: #注意前面的路径必须在宿主机提前创建好
- /home/mysql/log:/var/log/mysql # 映射日志目录,宿主机:容器
- /home/mysql/data:/var/lib/mysql # 映射数据目录,宿主机:容器
- /home/mysql/conf.d:/etc/mysql/conf.d # 映射配置目录,宿主机:容器
- /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only的意思,就是只读。
networks:
- app-network
redis:
image: redis:latest
ports:
- "6379:6379"
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
mysql-data:
在compose脚本中我们把mysql的配置文件挂载到了宿主机,这里需要使用
chmod 644 my.cnf 给配置文件赋予下权限,否则mysql容器启动会报错
容器启动后,发现后端项目会自己停止,是因为这种方式构建的mysql默认不能远程连接(正常docker构建是可以的)
需要登陆进容器执行一段代码
docker exec -it 容器id /bin/bash
msyql -uroot -p
# 修改本地登陆
# 修改密码过期规则----》永不过期
ALTER USER 'root'@'localhost' IDENTIFIED BY '1234' PASSWORD EXPIRE NEVER;
# 更新用户的密码修改加密规则
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';
# 刷新权限
FLUSH PRIVILEGES;
# 重置密码(==非必须==)
ALTER USER 'root'@'localhost' IDENTIFIED BY '1234';
# 修改远程登陆
# 修改密码过期规则----》永不过期
ALTER USER 'root'@'%' IDENTIFIED BY '1234' PASSWORD EXPIRE NEVER;
# 更新用户的密码修改加密规则
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '1234';
# 刷新权限
FLUSH PRIVILEGES;
# 重置密码(==非必须==)
ALTER USER 'root'@'%' IDENTIFIED BY '1234';
重启后端项目即可
使用compose构建出来的这四个容器都处于一个网络空间内,互相可以使用网络别名来访问
例如后端访问数据库
jdbc:mysql://mysql:3306/tesst?characterEncoding=utf8&serverTimezone=UTC&useUnicode=true
使用mysql这个网络别名而不是ip地址即可直接访问到,容器直接相互访问要用容器的端口