Docker 高阶 - Dockerfile

Dockerfile(制作镜像脚本化)

Dockerfile 常用保留字指令

1. FROM

FROM 是 Dockerfile 中的基础镜像声明。每个 Dockerfile 必须以 FROM 指令开头,用于指定基础镜像。例如:

FROM ubuntu:20.04
2. MAINTAINER

MAINTAINER 用于声明镜像的维护者(通常包括姓名和邮箱地址)。这是早期的做法,已被弃用,推荐使用 LABEL 来标注相关信息。例如:

LABEL maintainer="yourname@example.com"
3. RUN

RUN 用于在镜像的构建过程中执行命令,并创建新的镜像层。

  • shell 格式:命令作为 shell 指令执行,使用 /bin/sh -c

    RUN apt-get update && apt-get install -y python3
    
  • exec 格式:命令作为执行的二进制文件,以 JSON 数组的形式提供。不会通过 shell 执行。

    RUN ["apt-get", "install", "-y", "python3"]
    

RUN 指令只在镜像构建(docker build)时执行,生成的新层会保存命令的执行结果。

4. EXPOSE

EXPOSE 用于声明容器对外暴露的端口。它不会自动进行端口映射,但会为服务设置默认的暴露端口。例如:

EXPOSE 8080
5. WORKDIR

WORKDIR 用于设置镜像构建和容器运行时的工作目录。如果该目录不存在,则会自动创建。例如:

WORKDIR /app
6. USER

USER 指定运行容器时使用的用户身份。如果镜像未指定,则默认使用 root。例如:

USER nobody
7. ENV

ENV 用于设置环境变量,供后续的指令使用。定义的环境变量在镜像构建过程中和容器运行时都可用。例如:

ENV PATH="/usr/local/bin:$PATH"
8. VOLUME

VOLUME 用于定义挂载点,将数据存储在宿主机或其他容器上,避免数据持久化在容器中。例如:

VOLUME /data
9. ADD

ADD 用于将文件或目录复制到镜像中。它可以解压本地 tar 文件并支持从 URL 下载文件,功能比 COPY 强大,但一般情况下更推荐使用 COPY。例如:

ADD ./source.tar.gz /app/
10. COPY

COPY 用于将本地文件或目录复制到镜像中的指定路径。相比 ADDCOPY 更简单,适用于直接复制本地文件。例如:

COPY ./source /app/
11. CMD

CMD 用于指定容器启动时默认执行的命令。如果用户在 docker run 命令中指定了其他命令,CMD 指令将被覆盖。可用 shell 格式或 exec 格式:

CMD ["python3", "app.py"]
12. ENTRYPOINT

ENTRYPOINT 指定容器启动时必须执行的命令。与 CMD 的区别在于,即使用户在 docker run 中指定了命令,ENTRYPOINT 指令也不会被覆盖。可以结合 CMD 提供默认参数。例如:

ENTRYPOINT ["python3", "app.py"]

组合使用:

ENTRYPOINT ["python3"]
CMD ["app.py"]

文件名

Dockerfile 使用的默认文件名是Dockerfile,不带文件扩展名。使用默认名称可让您运行该docker build命令,而无需指定其他命令标志。

某些项目可能需要不同的 Dockerfile 用于特定目的。一个常见的惯例是将这些文件命名为。您可以使用命令的标志<something>.Dockerfile指定 Dockerfile 文件名。请参阅 CLI 参考 以了解该标志。--file``docker builddocker build--file

笔记

我们建议使用默认值 ( Dockerfile) 作为项目的主要 Dockerfile。

案例1:[定制nginx镜像],打印

Hello,Docker!

step1:
  • 拉取镜像 docker pull nginx

image-20241023151456193

  • 查看镜像 docker images

image-20241023151610970

step2:
  • 创建Dockerfile文件目录

    image-20241023151943958

  • 编写Dockerfile文件

    image-20241023152330707

  • 在Dockerfile目录下运行

    image-20241023153056319

  • 查看镜像image-20241023153226180

step3:
  • 运行nginx:v1新镜像,运行镜像image-20241023153440830

  • 浏览器查看

    image-20241023153545715

日志信息

image-20241023153640596

  • IP 地址:192.168.10.1
  • 时间戳:23/Oct/2024:07:35:05 +0000
  • 请求:GET / (HTTP/1.1)
  • 响应状态:200(成功)
  • 响应大小:23 字节
  • 用户代理:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36

案例2:[Centos7镜像具备 vim+ifconfig+jdk8]

step1:
  • 创建Dockerfile工作目录 mkdir

image-20241024092903260

这里我已经提前创建好,在创建一个默认命名的Dockerfile文件,或自己宁外命名,在build时候需要加-f参数加上文件名。 注意:build后面使用空格点[.]来结束否则会报错。

docker build -f your_custom_name -t nginx:v1 .
step2:
  • 编写dockerfile文件vim CentOS_Dockerfile

    image-20241024104045661

    FROM centos:7
    # 指定作者和邮箱
    MAINTAINER LOGO0515<tangzhijie0515@gmail.com>
    # 环境路径
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    # 修改镜像源
    RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    # 安装vim编辑器
    RUN yum -y install vim
    # 安装ifconfig命令查看网络IP
    RUN yum -y install net-tools
    # 安装java8及lib库
    RUN yum -y install glibc.i686
    RUN mkdir /usr/local/java
    # ADD是相对路径jar,把jdk-8u221-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
    ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/
    # 配置java环境变量
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
    ENV JRE_HOME $JAVA_HOME/jre
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
    ENV PATH $JAVA_HOME/bin:$PATH
    
    EXPOSE 80
    
  • docker build 使用Dockerfile文件构建镜像

    docker build -f CentOS_Dockerfile -t centos-java8:1.0 .

image-20241024103810341

docker images查看构建好的镜像

image-20241024105542291

step3:
  • 运行新构建好的镜像,查看是否成功安装工具包

docker run -it --name centos7-java8 centos-java8:1.0 /bin/bash

image-20241024110224432

image-20241024110322103

虚悬镜像

虚悬镜像(Dangling Images)是指没有被任何容器引用的中间镜像或无标签镜像。它们通常在多次构建镜像后出现,属于构建过程中未被使用的部分。虚悬镜像可能占用磁盘空间,因此定期清理它们是个好习惯。

[root@docker Dockerfile]# vim DangLing_Dockerfile
[root@docker Dockerfile]# cat DangLing_Dockerfile 
FROM ubuntu
CMD echo 'action is success'

image-20241024111142147

docker build -f DangLing_Dockerfile .

image-20241024111511612

  • 查看镜像

image-20241024111651602

  • 查看虚悬镜像
docker image ls -f dangling=true
  • 删除所有虚悬镜像
docker image prune

Docker Network

一、网络模式的常用命令

1.查看Docker网络模式 docker network ls

image-20241023163714339

2.添加网络docker network create XXX

image-20241023163909356

3.删除网络docker network rm XXX

image-20241024185116943

4.查看网络源数据docker network inspect xxx

image-20241024185541386

5.删除所有无效的网络docker network prune

image-20241024185904481

  • [你正在确认删除未被任何容器使用的自定义 Docker 网络。提醒一下,如果你确认没有任何容器依赖于这些网络,那么可以继续。]

二、容器实例内默认网络IP生产规则

在 Docker 中,容器实例的默认网络 IP 生成规则主要遵循以下几个原则:

  1. 默认桥接网络

    • 当你创建容器时,如果没有指定网络,Docker 会将其连接到默认的 bridge 网络。
    • 默认情况下,这个网络的子网是 172.17.0.0/16。容器会在这个范围内分配 IP 地址,通常会从 172.17.0.2 开始,依次递增。
  2. 自定义网络

    • 如果你创建了自定义的桥接网络,Docker 会根据你指定的子网范围分配 IP 地址。例如,如果你创建了一个子网为 192.168.1.0/24 的网络,容器会从 192.168.1.2 开始分配。
    • Docker 使用内置的 IPAM(IP Address Management)机制来管理 IP 地址分配,确保在同一网络内没有冲突。
  3. 冲突处理

    • Docker 会检查当前网络中已存在的容器 IP 地址,确保新分配的地址不会与现有容器发生冲突。
  4. DNS

    • Docker 还提供了内置的 DNS 服务,允许容器通过名称互相通信,而不是依赖 IP 地址。
  • 案列分析

image-20241024191821920

image-20241024191950837

image-20241024192031440

三、网络模式的类型

网络模式简介使用方式
bridge默认网络模式,容器在虚拟网络中互相通信。docker run --network bridge <image>
host容器直接使用宿主机的网络,IP 地址共享。docker run --network host <image>
none容器不连接任何网络,完全隔离。docker run --network none <image>
container容器共享另一个容器的网络栈。docker run --network container:<container_name> <image>
bridge

image-20241024201645491

如果拉取失败需要增加镜像源

vim /etc/docker/daemon.json

{
  "registry-mirrors":[ "https://cr.console.aliyun.com","https://docker.m.daocloud.io","https://public.ecr.aws","https://dockerhub.timeweb.cloud","http://hub-mirror.c.163.com","https://registry.docker-cn.com", "https://dockerpull.com","https://docker.anyhub.us.kg","https://dockerhub.jobcher.com","https://dockerhub.icu","https://docker.awsl9527.cn"],
  "insecure-registries":["192.168.10.150:5000"]
}
systemctl daemon-reload 
service docker restart
  • 创建两个容器实例
docker run -itd -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -itd -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
docker ps

image-20241024202525029

  • 查看宿主机IP

image-20241024202722085

  • 查看容器的网络设置

image-20241024202908528

image-20241024203000385

vethcf42925@if15 和 vethf9d3b27@if17

  • 这是两个虚拟以太网(veth)接口,veth 是 Docker 使用的虚拟网络设备之一。
  • @if15@if17 指的是它们在宿主机上的配对接口(每个 veth 设备都有一对接口,一个在容器内,一个在宿主机上)。
host
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
docker ps

image-20241024205322540

  • 查看宿主机IP

image-20241024205752163

  • 查看容器的网络设置

image-20241024210151575

和宿主机网络一样

访问tomcat端口好依次叠加

image-20241024210436427

image-20241024210508638

image-20241024210543812

none
docker run -itd -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
docker ps

image-20241024211021165

  • 查看宿主机IP

image-20241024211156806

none模式没有网关和IP地址

  • 查看容器的网络地址

image-20241024212932146

只有本地回环地址lo

container

image-20241023173251619

image-20241023173308228

  • 查看alpine1的网络情况

image-20241023173457685

  • 查看alpine2的网络情况

image-20241023173532600

image-20241023173806871

  • 关闭alpine1,查看alpine2,只剩本地回环地址

image-20241023174131453

自定义网络
  • 查看目前网络列表
docker network ls

image-20241024213415961

  • 新建自定义网络

image-20241024213524724

  • 创建容器指定加入自定义网络

image-20241024213923812

image-20241024214204928

image-20241024214140033

image-20241024214316178

image-20241024214359390

ne1,查看alpine2,只剩本地回环地址

[外链图片转存中…(img-ImEOuXAv-1729777699730)]

自定义网络
  • 查看目前网络列表
docker network ls

在这里插入图片描述

  • 新建自定义网络

在这里插入图片描述

  • 创建容器指定加入自定义网络

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自定义网络本身维护好了主机名与IP的映射关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值