部署实战
-青岛 OJ 项目部署 👏 (opens new window) 、HOJ 项目部署 (opens new window) 、若依微服务版项目部署 (opens new window) 、mall 商城项目部署 (opens new window)
# 一、Dockerfile
官方文档:
https://docs.docker.com/engine/reference/builder/
优质视频:
https://www.bilibili.com/video/BV1mt4y1M7kA/
# 1、常见用法
# 构建容器(设置arg值)
docker build --build-arg baseVersion=latest .
- 保留字
# 参数/变量
ARG CODE_VERSION
# ARG CODE_VERSION=latest
# 基础镜像(可以出现多次)
FROM nginx:${CODE_VERSION}
# ---------
# 执行sh指令(容器启动前)
RUN command
# 复制资源到镜像(dest使用相对路径时是相对于WORKDIR,并且必须放在WORKDIR定义之后)
ADD source dest
COPY source dest
# 执行sh命令(容器启动后)
CMD [ "executable" ] # (只能出现一次)
ENTRYPOINT [ "executable" ]
# ---------
# 对外端口
EXPOSE port
# 2、镜像信息
# 启动容器(设置/变更env值)
docker run -itd --env DIRPATH="/temp" --name ruoyi-vue -p 8090:8080 ruoyi-vue:v1.0
# 查看镜像meta
docker image inspect --format='{{json .Config.Labels}}' myimage
- 保留字
# image变量
ENV buildTag=1.0
ENV author=lencamo
ENV DIRPATH=/home
ENV WORKDIR=/data
# meta信息
LABEL author="${author}"
LABEL version="${buildTag}"
LABEL description="这是一个ruoyi项目docker部署的测试版本"
# 为镜像设置一个外部挂载卷
VOLUME $DIRPATH
# 指定RUN、ADD/COPY、CMD、ENTRYPOINT的工作目录
WORKDIR $WORKDIR
拓展: VOLUME 使用
由于 docker 是一次性部署,并且强调的是可移植性,所以最好与宿主机不要产生关联,因此 VOLUME 的使用频率也较低。
当然,如果你仅仅想保留 docker 容器 中的部分数据也是可以的:如 dist 包 等
- Dockerfile
FROM ubuntu
VOLUME /app/data
# 将docker中设置的数据卷 映射到 本地指定位置
docker run -v /host/data:/app/data myimage
# 3、构建镜像
- 编写
vim Dockerfile
# 编写示例
FROM ubuntu:22.04
COPY . /app
RUN make /app
CMD python /app/app.py
- 构建
docker build -t 新镜像名字:TAG .
- 运行
docker run -it 新镜像名字:TAG
# 4、微服务应用
- 前期准备
# 打包并上传jar包
/www/wwwroot/
├─ microservices_project
│ ├─ ……
│ ├─ project_1
│ │ ├─ Dockerfile
│ │ └─ project_1-0.0.1-SNAPSHOT.jar
- 编写 DockerFile(示例)
vim Dockerfile
# 内容
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER lencamo
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar ruoyi-vue.jar
# 运行jar包
RUN bash -c 'touch /ruoyi-vue.jar'
ENTRYPOINT ["java","-jar","/ruoyi-vue.jar"]
#暴露6001端口作为微服务
EXPOSE 6001
- 构建镜像
docker build -t ruoyi-vue:v1.0 .
docker images
- 运行容器
docker run -d -p 6001:6001 ruoyi-vue:v1.0
# 二、Docker-compose
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。
Compose 允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)
理解
简单的说,就是可以一次帮你执行多个 docker run ……
命令
# 1、工具安装
官网:
https://docs.docker.com/compose/install/standalone/
优质视频:
https://www.bilibili.com/video/BV1Cp4y1F7eA/
独立安装 docker compose:
# 官方
curl -SL https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 国内
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.12.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 执行权限
chmod +x /usr/local/bin/docker-compose
# 验证是否成功
docker compose version
卸载:
rm /usr/local/bin/docker-compose
# 2、文件编写
docker-compose.yml 牛逼的地方就是,可以同时启动多个容器。其写法也较为简单:
优质视频:
https://www.bilibili.com/video/BV1dP411k7rR/
https://www.bilibili.com/video/BV1DN411p7Wr/
- docker 命令运行 nginx 镜像
docker run -p 3307:3306 --name r-mysql --privileged=true \
-v /sources/mysql/data:/var/lib/mysql \
-d mysql:5.7.40 \
-e MYSQL_ROOT_PASSWORD=mysql666 \
- docker-compose 代码方式运行 nginx 镜像
version: "3"
networks:
atperson_net:
services:
r-mysql:
image: mysql:5.7.40
ports:
- "3307:3306"
privileged: true
volumes:
- "/data/docker_service/mysql/data:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: 'mysql666'
networks:
- atperson_net
# 3、compose 命令
docker-compose -h # 查看帮助
docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose config [-q] # 检查配置,有问题才有输出
# 进入运行的容器
docker-compose exec yml里面的服务id
# 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
# 运行的容器
docker-compose ps
# 编排过的容器
docker-compose top
# 启动所有docker-compose服务
docker-compose up [-d] # -d表示后台运行
# 停止并删除容器、网络、卷、镜像。
docker-compose down
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
# 4、微服务应用
- 前期准备
# 打包并上传jar包
/www/wwwroot/
├─ microservices_project
│ ├─ ……
│ ├─ project_1
│ │ ├─ Dockerfile
│ │ ├─ docker-compose.yml
│ │ └─ project_1-0.0.1-SNAPSHOT.jar
注意
这里的 project_1-0.0.1-SNAPSHOT.jar 与前面不同的是打包前的 ip 不用写死,直接写下面文件中映射的 redis、msyql 即可
- 编写 docker-compose.yml(示例)
version: "3"
services:
microService:
image: lencamo_docker:1.6
container_name: project_1
ports:
- "6001:6001"
volumes:
- /app/microService:/data
networks:
- atperson_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- atperson_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 'mysql666'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'lencamo'
MYSQL_PASSWORD: 'mysql666'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- atperson_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
atperson_net:
- 构建镜像
docker build -t lencamo_docker:1.6 .
docker images
- 运行 compose 容器
# 检查配置文件
docker-compose config -q
# 后台运行
docker-compose up -d
# 关闭 compose 容器
docker-compose stop
# 三、其他
# 1、Docker 网络
# 略
← 【docker部署】 自动化部署 →