Docker | 08.镜像构建 - 使用dockerfile构建镜像

文章目录

  • 参考内容
  • 1.Dockerfile概述
  • 2.dockerfile语法
  • 3.dockerfile构建命令
    • 3.1.上下文路径
    • 3.2. -f 指定dockerfile路径
    • 3.3. -t 指定镜像信息
  • 4.演示:使用dockerfile构建镜像
    • 4.1.自定义CentOS镜像
    • 4.2.使用docker部署SpringBoot项目

参考内容

参考视频:

  • 20-dockerfile-dockerfile概述及关键字
  • 21-dockerfile-案例-自定义centos
  • 21-dockerfile-案例-部署springboot项目

参考文章:

  • docker build 命令后 . 号的意思
  • Docker入门系列四:Dockerfile-关键字

1.Dockerfile概述

dockerfile是用来构建镜像的文本文件,文本内容由诸多指令构成,用于定义如何构建镜像,并进行相关说明。

# 简单的dockerfile示例:
FROM nginx
CMD /bin/bash

在编写完dockerfile后,使用docker build命令执行dockerfile并生成镜像

# -f:指定dockerfile的路径
# -t:指定新镜像的名字与版本
docker build -f  -t <新镜像名>:<新镜像版本号> <上下文路径(通常是.)>

2.dockerfile语法

关键字 作用 备注
FROM 指定父镜像 声明在执行dockerfile时,该镜像应基于哪个父镜像完成build
MAINTAINER 作者信息
LABEL 标签(相当于备注)
RUN 镜像构建(docker build)时执行命令 执行一段命令,默认是"/bin/bash"
格式为RUN command或者RUN ["command","param1","param2"]
CMD 容器启动(docker run)时执行初始化命令 启动容器时候的默认命令
格式为CMD command param1 param2或者CMD ["command","param1","param2"]
COPY 复制文件 build时,复制文件到镜像中。
只能使用相对路径,上下文由docker build指令最后的部分声明(若为".",表示上下文路径为docker build执行时的路径)
ADD 添加文件 build时,添加文件到镜像中。ADD相比COPY更加强大:
如果参数是URL,会先进行下载;如果参数是压缩包,会先进行解压
ENV 环境变量 指定镜像的环境变量,可以在启动容器(docker run)时通过-e覆盖
格式为ENV name=value
ARG 构建参数 构建参数只在build的时候使用,如果有 ENV 那么 ENV 的相同名字的只始终覆盖 arg 的参数
VOLUME 定义外部可以挂载的数据卷 指定build的镜像哪些目录可以启动的时候挂载到文件系统中启动容器的时候使用-v绑定
格式为VOLUME ["目录"]
EXPOSE 暴露端口 定义容器运行的时候监听的端口,启动容器(docker run)时使用-p来绑定暴露端口
格式为EXPOSE 8080或者EXPOSE 8080/udp
WORKDIR 默认工作目录 指定进入容器后默认的工作目录
USER 指定执行用户 指定 build 或者启动的时候 用户在 RUN CMD ENTRYPOINT 执行的时候的用户
HEALTHCHECK 健康检查 指定检测当前容器健康监测的命令 基本上没用 因为很多时候应用本身有健康监测机制
ONBUILD 触发器 当存在 ONBUILD 关键字的镜像作为基础镜像的时候 当执行 FROM 完成之后会执行 ONBUID 的命令 但是不影响当前镜像用处也不怎么大
STOPSIGNAL 发送信号量到宿主机 该 STOPSIGNAL 指令设置将发送到容器的系统调用信号以退出
SHELL 指定执行脚本的 shell 指定 RUN CMD ENTRYPOINT 执行命令的时候使用的 shell

3.dockerfile构建命令

# -f:指定dockerfile的绝对路径
# -t:指定新镜像的名字与版本
docker build -f  -t <新镜像名>:<新镜像版本号> <上下文路径(通常是.)>

3.1.上下文路径

在dockerfile语法中,COPY、ADD等与宿主机路径相关的指令,只能使用相对路径。因此需要明确指定上下文路径(指定这个相对路径是相对于谁)

注意:上下文路径为"."时,是将执行docker build时的路径设为上下文路径

docker build 命令后 . 号的意思

举例:假设dockerfile中有指令COPY file.txt /home

  • docker build的上下文路径指定为"/root“,则是将宿主机的”/root/file.txt“复制到镜像中的”/home";
  • docker build的上下文路径指定为".“,在”/home“执行的docker build命令,则是将宿主机的”/home/file.txt“复制到镜像中的”/home"。

3.2. -f 指定dockerfile路径

-f 

-f 参数指定dockerfile路径,需要用绝对路径

3.3. -t 指定镜像信息

-t <新镜像名>:<新镜像版本号>

-t 参数指定新镜像信息,如果没有填写版本号,则会使用默认值"latest"。

4.演示:使用dockerfile构建镜像

4.1.自定义CentOS镜像

需求:

  • 默认工作目录为/usr;
  • 可以使用vim(Docker默认的CentOS镜像不支持vim);
  • 新镜像名为new_centos_image,版本为1.0

实现步骤:

  • 指定父镜像:FROM centos:7.0
  • 定义作者信息:MAINTAINER Eshang
  • 执行安装vim的指令:RUN yum install -y vim
  • 指定默认工作目录:WORKDIR /usr
  • 定义容器启动(docker run)时执行的命令:CMD /bin/bash
  1. [创建文件夹并切换路径] 在宿主机中创建"/home/dockerfiles"文件夹,并进入到该文件夹;

    # 创建并进入到文件夹中
    mkdir /home/dockerfiles && cd /home/dockerfiles
    
  2. [创建并编写dockerfile] 使用vim指令创建并编写dockerfile文件,命名为test_centos_dockerfile,编写完毕后:wq保存;

    # 创建并编写名为test_centos_docker的文件
    vim test_centos_dockerfile
    

    Docker | 08.镜像构建 - 使用dockerfile构建镜像_第1张图片

  3. [执行dockerfile以构建镜像] 使用docker build指令构建镜像;

    docker build -f /home/dockerfiles/test_centos_dockerfile -t new_centos_image:1.0 .
    
    Docker | 08.镜像构建 - 使用dockerfile构建镜像_第2张图片
  4. [创建容器检验效果] 使用docker run创建容器,检验效果。

    image-20220601173516061

4.2.使用docker部署SpringBoot项目

需求:

  • 定义dockerfile,创建test_springboot_image镜像并发布SpringBoot项目;
  • 项目访问端口为1234;

实现步骤:

  • 编写SpringBoot项目,暴露1234端口,并将项目打成jar包;
  • 上传jar包到宿主机;
  • 编写dockerfile(使用COPY将jar包添加到镜像中,使用EXPOSE 1234暴露端口,使用CMD运行jar包)
  • 使用docker build命令构建镜像
  • 使用docker run命令运行镜像以创建容器(需要使用-p配置端口映射)
  1. [编写SpringBoot项目并打包] 创建SpringBoot项目,定义接口,暴露1234端口。一切就绪后打成jar包。

    Docker | 08.镜像构建 - 使用dockerfile构建镜像_第3张图片

    Docker | 08.镜像构建 - 使用dockerfile构建镜像_第4张图片

    Docker | 08.镜像构建 - 使用dockerfile构建镜像_第5张图片

  2. [上传jar包到宿主机] 在当前操作系统下打开命令提示符窗口,使用scp -r命令将jar包上传到宿主机:

    # 将D盘的test_docker_01-0.0.1-SNAPSHOT.jar以root身份上传到192.168.245.174这台宿主机的/project目录
    scp -r D:/test_docker_01-0.0.1-SNAPSHOT.jar [email protected]:/project
    

    Docker | 08.镜像构建 - 使用dockerfile构建镜像_第6张图片

  3. [编写dockerfile] 创建并进入目录,使用vim命令编写dockerfile,并使用:wq保存;

    # 创建目录
    mkdir /home/dockerfiles
    
    # 进入目录
    cd /home/dockerfiles
    
    # 创建并编写dockerfile
    vim test_springboot_dockerfile
    
    # dockerfile
    FROM java:8
    MAINTAINER Eshang
    COPY test_docker_01-0.0.1-SNAPSHOT.jar /project/
    EXPOSE 1234
    CMD java -jar /project/test_docker_01-0.0.1-SNAPSHOT.jar
    

    image-20220602122507047

  4. [执行dockerfile以构建镜像] 使用docker build构建镜像,上下文路径指定为"/project";

    # -f 指定dockerfile的绝对路径·
    # -t 指定镜像信息,若不填写版本号则使用latest
    # 将"/project"指定为上下文路径
    docker build -f /home/dockerfiles/test_springboot_dockerfile -t test_springboot_image:1.0 /project
    

    Docker | 08.镜像构建 - 使用dockerfile构建镜像_第7张图片

  5. [运行镜像创建容器] 使用docker run运行镜像并创建一个守护式容器,使用-p参数配置端口映射;

    # -d 守护式容器,在后台运行
    # -p 配置端口映射,将宿主机的1234端口与容器的1234端口绑定起来
    docker run -d --name=container_test_springboot -p 1234:1234 test_springboot_image:1.0
    
  6. [测试效果] 确认宿主机的端口已经开放,或防火墙已关闭,就可以访问接口了。访问接口的url如下:

    http://宿主机ip:1234/test/sayHello
    
    Docker | 08.镜像构建 - 使用dockerfile构建镜像_第8张图片

你可能感兴趣的:(Docker,docker,容器,java)