作者:Coco李可儿 | 来源:互联网 | 2024-12-27 17:31
本文详细介绍了Dockerfile的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了Docker的默认网络、容器互联及自定义网络的实现。
一. Dockerfile 编写指南
1. 常用指令解析
Dockerfile 是用于定义 Docker 镜像构建过程的文本文件。以下是常用的 Dockerfile 指令:
FROM # 指定基础镜像
MAINTAINER # 维护者信息(已弃用,建议使用 LABEL)
RUN # 构建时执行命令
ADD # 添加文件并自动解压(建议使用 COPY 代替)
WORKDIR # 设置工作目录
VOLUME # 挂载点
EXPOSE # 暴露端口
CMD # 容器启动时执行命令,默认可被替代
ENTRYPOINT # 容器启动时执行命令,通常配合 CMD 使用
ONBUILD # 当继承该镜像时触发
COPY # 添加文件到镜像中
ENV # 设置环境变量
2. 构建并发布 CentOS 镜像
以下是一个简单的例子,展示如何创建一个包含基本工具的 CentOS 镜像,并将其发布到 Docker Hub。
# 编写 Dockerfile 文件
FROM centos
LABEL maintainer="yqj"
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim net-tools
EXPOSE 80
CMD ["/bin/bash"]
# 构建镜像
$ docker build -t yqj/centos:1.0 .
# 查看构建历史
$ docker history yqj/centos:1.0
# 启动容器
$ docker run -it --name mycentos01 yqj/centos:1.0
# 登录 Docker Hub
$ docker login -u yaokuku123
# 修改标签
$ docker tag yqj/centos:1.0 yaokuku123/centos:1.0
# 发布镜像
$ docker push yaokuku123/centos:1.0
# 退出登录
$ docker logout
3. 构建 Tomcat 镜像
接下来,我们将创建一个包含 JDK 和 Tomcat 的镜像。
# 准备文件:jdk-13.0.2_linux-x64_bin.tar.gz, apache-tomcat-8.5.53.tar.gz, readme.txt
# 编写 Dockerfile 文件
FROM centos
LABEL maintainer="yqj"
COPY readme.txt /usr/local/
COPY jdk-13.0.2_linux-x64_bin.tar.gz /usr/local/
COPY apache-tomcat-8.5.53.tar.gz /usr/local/
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk-13.0.2
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.53
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.53
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD ["/usr/local/apache-tomcat-8.5.53/bin/startup.sh", "&&", "tail", "-F", "/usr/local/apache-tomcat-8.5.53/logs/catalina.out"]
# 构建镜像
$ docker build -t yqj/tomcat:1.0 .
# 运行容器
$ docker run -d -p 8080:8080 --name mytomcat01 yqj/tomcat:1.0
二. Docker 网络配置
1. 默认网络模式
Docker 默认采用桥接网络模式,通过 veth-pair 技术连接主机和容器。每次启动容器时,Docker 会为容器分配一个 IP 地址,默认情况下使用的是 docker0 网桥。
# 创建一个 Tomcat 容器并查看其 IP 地址
$ docker run -d -p 8080:8080 --name mytomcat01 tomcat:9.0
$ docker exec -it mytomcat01 ip addr
# 在主机上查看网络接口
$ ip addr
# 尝试从主机 ping 容器 IP
$ ping 172.17.0.2
# 再启动一个容器并查看其 IP 地址
$ docker run -d -p 8081:8080 --name mytomcat02 tomcat:9.0
$ docker exec -it mytomcat02 ip addr
# 再次在主机上查看网络接口
$ ip addr
# 尝试从主机 ping 新容器 IP
$ ping 172.17.0.3
# 测试容器间互连通性
$ docker exec -it mytomcat01 ping 172.17.0.3
$ docker exec -it mytomcat02 ping 172.17.0.2
# 结论:容器之间以及主机与容器之间均可以互相通信
2. 容器互联 (--link)
为了简化容器间的通信,Docker 提供了 --link 参数,允许将容器名或 ID 映射到 IP 地址。但此方法现已不推荐使用,建议使用自定义网络。
# 启动一个新的容器并与 mytomcat02 联网
$ docker run -d -p 8082:8080 --name mytomcat03 --link mytomcat02 tomcat:9.0
# 测试 mytomcat03 是否能通过容器名访问 mytomcat02
$ docker exec -it mytomcat03 ping mytomcat02
# 查看 mytomcat03 的 hosts 文件
$ docker exec -it mytomcat03 cat /etc/hosts
# 查看 mytomcat02 的 hosts 文件
$ docker exec -it mytomcat02 cat /etc/hosts
3. 自定义网络
自定义网络提供了更灵活的网络隔离和管理方式,适用于集群环境。
# 查看当前网络配置
$ docker network ls
# 创建自定义网络
$ docker network create --driver bridge --subnet 192.167.0.0/16 --gateway 192.167.0.1 mynet
# 查看新网络详情
$ docker network inspect mynet
# 使用自定义网络启动两个 Tomcat 容器
$ docker run -d -P --name mytomcat-net-01 --net mynet tomcat:9.0
$ docker run -d -P --name mytomcat-net-02 --net mynet tomcat:9.0
# 再次查看自定义网络配置
$ docker network inspect mynet
# 测试容器间互连通性
$ docker exec -it mytomcat-net-01 ping mytomcat-net-02
# 测试不同网络下的容器互联
$ docker network connect mynet mytomcat01
# 再次查看自定义网络配置
$ docker network inspect mynet
# 测试不同网络下的容器是否可以互通
$ docker exec -it mytomcat01 ping mytomcat-net-01
# 删除自定义网络
$ docker network rm mynet