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
用于将本地文件或目录复制到镜像中的指定路径。相比 ADD
,COPY
更简单,适用于直接复制本地文件。例如:
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 build
docker build
--file
笔记
我们建议使用默认值 (
Dockerfile
) 作为项目的主要 Dockerfile。
案例1:[定制nginx镜像],打印
Hello,Docker!
step1:
- 拉取镜像
docker pull nginx
- 查看镜像
docker images
step2:
-
创建Dockerfile文件目录
-
编写Dockerfile文件
-
在Dockerfile目录下运行
-
查看镜像
step3:
-
运行nginx:v1新镜像,运行镜像
-
浏览器查看
日志信息:
- 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
这里我已经提前创建好,在创建一个默认命名的Dockerfile文件,或自己宁外命名,在build
时候需要加-f参数加上文件名。 注意:build后面使用空格点[.]来结束否则会报错。
docker build -f your_custom_name -t nginx:v1 .
step2:
-
编写dockerfile文件
vim CentOS_Dockerfile
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 .
docker images
查看构建好的镜像
step3:
- 运行新构建好的镜像,查看是否成功安装工具包
docker run -it --name centos7-java8 centos-java8:1.0 /bin/bash
虚悬镜像
虚悬镜像(Dangling Images)是指没有被任何容器引用的中间镜像或无标签镜像。它们通常在多次构建镜像后出现,属于构建过程中未被使用的部分。虚悬镜像可能占用磁盘空间,因此定期清理它们是个好习惯。
[root@docker Dockerfile]# vim DangLing_Dockerfile
[root@docker Dockerfile]# cat DangLing_Dockerfile
FROM ubuntu
CMD echo 'action is success'
docker build -f DangLing_Dockerfile .
- 查看镜像
- 查看虚悬镜像
docker image ls -f dangling=true
- 删除所有虚悬镜像
docker image prune
Docker Network
一、网络模式的常用命令
1.查看Docker网络模式 docker network ls
2.添加网络docker network create XXX
3.删除网络docker network rm XXX
4.查看网络源数据docker network inspect xxx
5.删除所有无效的网络docker network prune
- [你正在确认删除未被任何容器使用的自定义 Docker 网络。提醒一下,如果你确认没有任何容器依赖于这些网络,那么可以继续。]
二、容器实例内默认网络IP生产规则
在 Docker 中,容器实例的默认网络 IP 生成规则主要遵循以下几个原则:
-
默认桥接网络:
- 当你创建容器时,如果没有指定网络,Docker 会将其连接到默认的
bridge
网络。 - 默认情况下,这个网络的子网是
172.17.0.0/16
。容器会在这个范围内分配 IP 地址,通常会从172.17.0.2
开始,依次递增。
- 当你创建容器时,如果没有指定网络,Docker 会将其连接到默认的
-
自定义网络:
- 如果你创建了自定义的桥接网络,Docker 会根据你指定的子网范围分配 IP 地址。例如,如果你创建了一个子网为
192.168.1.0/24
的网络,容器会从192.168.1.2
开始分配。 - Docker 使用内置的 IPAM(IP Address Management)机制来管理 IP 地址分配,确保在同一网络内没有冲突。
- 如果你创建了自定义的桥接网络,Docker 会根据你指定的子网范围分配 IP 地址。例如,如果你创建了一个子网为
-
冲突处理:
- Docker 会检查当前网络中已存在的容器 IP 地址,确保新分配的地址不会与现有容器发生冲突。
-
DNS:
- Docker 还提供了内置的 DNS 服务,允许容器通过名称互相通信,而不是依赖 IP 地址。
- 案列分析
三、网络模式的类型
网络模式 | 简介 | 使用方式 |
---|---|---|
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
如果拉取失败需要增加镜像源
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
- 查看宿主机IP
- 查看容器的网络设置
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
- 查看宿主机IP
- 查看容器的网络设置
和宿主机网络一样
访问tomcat端口好依次叠加
none
docker run -itd -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
docker ps
- 查看宿主机IP
none模式没有网关和IP地址
- 查看容器的网络地址
只有本地回环地址lo
container
- 查看alpine1的网络情况
- 查看alpine2的网络情况
- 关闭alpine1,查看alpine2,只剩本地回环地址
自定义网络
- 查看目前网络列表
docker network ls
- 新建自定义网络
- 创建容器指定加入自定义网络
ne1,查看alpine2,只剩本地回环地址
[外链图片转存中…(img-ImEOuXAv-1729777699730)]
自定义网络
- 查看目前网络列表
docker network ls
- 新建自定义网络
- 创建容器指定加入自定义网络
自定义网络本身维护好了主机名与IP的映射关系