dockerfile 和 docker-compose

dockerfile

简介: 以 基础镜像为 基础, 然后再添加点别的文件到当前容器中, 进而形成一个新的镜像

1. # 可以使用 ENV 定义的环境变量的属性, 可以用 ${} 引用, 也可以 用 $ 引用
ADD, COPY, ENV, EXPOSE, FROM, LABEL, STOPSIGNAL, USER, VOLUME, WORKDIR, ONBUILD
2. 
1. # 在具体的镜像构建之前声明的变量, 但是此变量只能在 FROM 中使用, 如果 一个dockerfile 文件中 有多个 FROM 也可以在多个 FROM 中进行使用, 但在其他 命令中无效, 且 dockerfile 文件中, 只能有一个 ARG 属性
ARG CODE_VERSION=latest 

2. # 设置基础镜像的属性, 可以在单个映像中多次出现,以创建多个映像,或者将一个生成阶段用作另一个生成阶段的依赖项。只需在每条新指令之前记下提交输出的最后一个图像 ID 即可。每条 FROM 指令都会清除前面的 FROM 指令的缓存中创建的任何状态
# 可以通过添加到指令中为新的构建阶段指定一个名称, 以引用在此阶段中构建的映像, 该名称可以在 COPY 属性中使用
FROM baseImage:${CODE_VERSION} as aliasName 

3. # ------- RUN 有 2 种形式 ------- 注意: run 命令一般用来配置基础镜像, 即利用命令来一步一步的来进行基础镜像的配置, 例如: 一个mysql 的基础镜像, 需要使用命令来配置 root 用户的密码, 或者在当前 容器环境安装 jdk 和配置 jdk 环境一类的, 等等一类的东西...
# 简介: 该指令将在当前图像之上的新层中执行任何命令并提交结果。生成的已提交映像将用于 中的下一步, 一个Dockerfile中可以有许多个RUN命令, RUN命令是创建Docker镜像(image)的步骤
# (shell窗体形式,该命令在 shell 中运行,默认情况下在 Linux 或 Windows 上)/bin/sh -ccmd /S /C, 注意: 其执行的都是 shell 命令
RUN <command> ( shell 窗体执行形式) 
# 与shell窗体不同,exec窗体不调用命令 shell。这意味着不会发生正常的 shell 处理, 例如,不会对 执行变量替换
RUN ["executable", "param1", "param2"] ( exec 窗体执行形式:"executable" 指定的命令路径) 

4. # 一个Dockerfile中只能有一个CMD命令, CMD命令是镜像在 docker run 初始化时需要执行的默认 shell 命令,可重写覆盖, 注意: 不用指定参数, 只需要执行其他命令, 即可被重写覆盖
CMD [ "executable", "命令参数" ] # 示例: [ "/bin/命令", '命令参数' ] (exec 窗口执行形式)
CMD ls -l ( shell 窗体执行形式)

5. # 和 CMD 属性相同, 设置默认命令和参数, 表示镜像在 docker run 初始化时需要执行的默认 shell 命令,可重写覆盖, 一个Dockerfile中只能有一个 ENTRYPOINT 命令, 
# 注意: docker run 时需要指定 --entrypoint 参数才能够进行覆盖, 所以一般人不知道这个参数, 所以不会轻易的覆盖此 ENTRYPOINT 执行的默认 shell 命令
# 和 CMD 的区别是: 一个需要指定参数才能被覆盖, 一个不需要指定参数就能被轻易覆盖, ENTRYPOINT/CMD都只能在文件中存在一次,多个存在,只有最后一个生效,其它无效
# 和 CMD 的相同点: 都像是容器的开启启动项一样
# 注意: 使用时, CMD 和 ENTRYPOINT 只使用其中一个即可, 不用两个都使用
ENTRYPOINT [ "executable", "命令参数" ] # 示例: [ "/bin/命令", '命令参数' ] (exec 窗口执行形式)
ENTRYPOINT ls -l ( shell 窗体执行形式)

6. # 设置元数据标签, 注意: 多个设置之间没有 逗号进行隔开, 而是用空格的形式进行隔开, 也可以写多个 LABEL 属性, 来展示 LABEL, 不用非要写单独的一个, 我们也可以定义一组 LABEL 去展示作者,编译日期等等, 注意: MAINTAINER <name> 已弃用
LABEL key="value" key="value" 

7. # 在 Dockerfile 中声明了那些端口是将要开放的,可以直接指定使用的是 tcp 还是 udp 协议,  如果不指定, 默认是 tcp, 注意: 多个设置之间没有 逗号进行隔开, 而是用空格的形式进行隔开, 也可以写多个 EXPOSE 属性, 来展示 EXPOSE, 不用非要写单独的一个, 如果 EXPOSE 没有指定端口,那么利用 docker run 运行时使用 -P 参数无效
EXPOSE 80/udp 81/tcp

8. # 环境变量, 用以设置容器中的环境变量, 注意: 多个设置之间没有 逗号进行隔开, 而是用空格的形式进行隔开, 也可以写多个 ENV 属性, 来展示 ENV, 不用非要写单独的一个
ENV key=value key=value

9. # 将本地主机的指定的 source 本地路径的 目录或文件, 拷贝到镜像中的 [dest] 是目标容器中的绝对路径, 注意: 一个属性不能有多个设置, 但是 dockerfile 中, 可以使用多个 此属性
ADD [source_URL] [dest_URL]
ADD ["<src>", "<dest>"] # 对于包含空格的路径,这种形式是必需的

10. # 将本地主机的指定的 source 本地路径的 目录或文件, 拷贝到镜像中的 [dest] 是目标容器中的绝对路径, 注意: 一个属性不能有多个设置, 但是 dockerfile 中, 可以使用多个 此属性
COPY [source_URL] [dest_URL]
# --from=0 个FROM语句时,0代表第一个阶段。除了使用数字,我们还可以在 FROM 属性中使用 as 给阶段进行命名 FROM mysql as twos
# 注意: 由于 --from 引用了上一阶段的 FROM 但由于 FROM 还没有真正生成镜像,只是在内存中进行了简单生成, 所以上一阶段中 镜像中的文件, 不会通过 --from 来直接复制到新的 FROM 阶段中, 所以我们在 使用 COPY 引用的同时, 也需要从内存中把镜像中内部生成的文件, 也复制到新的 FROM 阶段容器中
COPY --from=node-server [--from=镜像 中的 文件或目录 的路径] [复制到容器内文件的路径]

11. # 设置工作目录, 解释: 设置完此工作目录路径后, 其他命令的相对路径, 都会以此工作目录的路径, 来作为 根路径
WORKDIR /the/workdir/path





12. # ADD 和 COPY 的区别:
# ADD 支持 自动解压文件, 可以使用网络路径
# COPY 不支持 自动解压文件, 也不可以使用 网络路径, 只能使用 本地路径, 但是 COPY 可以 从 复制 FROM 声明的镜像, 然后把镜像复制到当前镜像中, (即这样就可以实现, 叠加镜像的效果)

13. # 叠加镜像, 使用方法:
# FROM 可以声明基础镜像, 如果当前 dockerfile 文件中, 没有其他 FROM 命令的话, 就会以此 这一个 FROM 为基础和其他属性的操作, 来生成最终的镜像
# 但是 如果 当前 dockerfiile 文件中有其他 FROM 命令的话, 就会以 最后一个 FROM 命令, 来生成最终的镜像, 
# 但是 叠加镜像的原理就是利用 多个 FROM 只有最后一个 FROM 会生效的原理, 利用 COPY 属性来 引用 和 复制 其他已经进行操作过但不能生成的 FROM 镜像到当前这个可以生效的 FROM 镜像中, 由此, 我们可以使用 COPY 属性, 来构建多重镜像

14. # docker inspect [images] 此命令可以查看 镜像的 环境变量信息, 还可以查看一些其他属性
15. # docker image inspect --format='' [images] 查看镜像的 LABEL 标签

16. 官网学习网址: https://docs.docker.com/engine/reference/builder/

docker-compose

services:
  one: # 定义一个服务, 此声明出的名字, 会自动变成此容器服务的名字, 注意: 服务可以同时定义多个, 所以我们才可以同时批量运行多个容器
    image: mysql # 我的镜像文件名字
    ports:  # 定义映射的多个端口号
      - 8080: 8080
      - 3000: 3000
    working_dir: /user/software # 定义工作目录的路径
    volumes: # 定义多个卷绑定, 外部的卷绑定使用相对路径时, 相对于 上方设置 working_dir 设置的工作目录
      - ./opt:/opt/nginx/conf
      - ./server:/nginx/server
      - ones:/nginx/conf.d # 使用定义的全局的 volumes 中的变量名即可引用其值
    command: "dir /s *.docx" # 定义此 docker-compose.yml 文件运行结束后, 最后自动运行的 shell 命令
    environment: # 向容器内的环境变量进行赋值, 和 dockerfile 环境变量的区别是: dockerfile 的环境变量是写死的, 创建镜像后不能更改
      JAVA_HOME: /usr/jdk_1.8/
      JRE_HOME: /usr/jdk_1.8/jre/
      MAVEN_HOME: /usr/maven/apache-maven-3.6.3

volumes: # 定义全局 volumes 变量, 可以让 services 中定义的多个服务同时引用
  ones: /root/software/



# --------------- dockerfile 和 docker-compose 环境变量的区别 ---------------
# 1. dockerfile 的环境变量是写死的, 不能改变
# 2. docker-compose 的环境变量是动态的, 可以在每次执行命令的时候动态改变

# --------------- 执行 docker-compose 文件的方法 ---------------
# 和执行 dockerfile 文件一样. 在当前目录中只能有一个 docker-compose.yml 文件, 
# 然后在运行 docker-compose up 命令即可运行 docker-compose.yml 文件, 加上 -d 参数, 即会在后台运行 此 yml 文件


# -------------- 查看 docker-compose 的日志 ----------------
# 解释: 由于 docker-compose 是运行和管理 docker 容器的服务的, 所以 此文件运行后, 会自动进行启动容器和管理容器, 所以会有日志的产生,
# 而查看日志的命令: docker-compose logs -f -f 可以让我们实时的查看 docker-compose 产生的日志

# 官网学习网址: https://docs.docker.com/get-started/08_using_compose/
# 官网学习规范文档: https://hub.fastgit.org/compose-spec/compose-spec/blob/master/spec.md

docker-compose 不是很全, 具体的可以看 https://github.com/compose-spec/compose-spec/blob/master/spec.md

#以上都是个人总结得出, 如有错误, 请指正, 谢谢
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值