# 一、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 网络

# 略
更新于 : 8/7/2024, 2:16:31 PM