Dockerfile与Docker网络

一、Dockerfile

1、概念:

Dockerfile是用来构建docker镜像的文本文件,是由构建镜像所需要的指令和参数构建的脚本。

2、构建步骤:

① 编写Dockerfile文件

② docker build命令构建镜像

③ docker run依据镜像运行容器实例

Dockerfile 是构建 docker 镜像的指令集,docker 镜像是容器运行的静态模板,而 docker 容器是基于 docker 镜像创建的可运行实例。

3、Dockerfile基础知识:

① 每条保留字指令都必须为大写字母,且后面要跟随至少一个参数

② 指令按照从上到下顺序执行

③ #表示注释

④ 每条指令都会创建一个新的镜像层并对镜像进行提交

二、Dockerfile常用保留字指令

1、概念:

在 Dockerfile 中,保留字 (Reserved Keywords) 是指一些特定的指令或关键字,用于描述镜像的构建过程。

2、常用保留字:

(1) FROM:当前新镜像是基于哪个镜像的,指定一个已存在的镜像作为模版。Dockerfile 第一条必须是FROM。

(2) MAINTAINER:镜像维护者和邮箱。

(3) RUN:容器构建时需要运行的命令,RUN 在 docker build 时运行。

两种格式:

① shell 格式:

#等同于在终端操作的shell命令 格式:
RUN <命令行命令> RUN yum -y install vim

② exec 格式:

#格式:RUN ["可执行文件" , "参数1", "参数2"] 
RUN ["./test.php", "dev", "offline"] #等同于 RUN ./test.php dev offline

(4) EXPOSE:当前容器对外端口。

(5) WORKDIR:创建容器后,终端默认登录进来的工作目录。

(6) USER:指定该镜像以哪个用户执行,如果没有指定则默认是root。

(7) ENV:在构建镜像过程中设置环境变量。这个环境变量可以在后续的RUN指令中使用。

(8) VOLUME:容器数据卷,用于数据存储和持久化工作。

(9) COPY:拷贝文件和目录到镜像中。

COPY src dest 
COPY ["src", "dest"] 
# <src源路径>:源文件或者源目录 ;<dest目标路径>:容器内的指定路径

(10) ADD:将宿主机目录下的文件拷贝进镜像,且自动处理URL和解压tar包。

COPY + 解压

(11) CMD:指定容器启动后要做的事。

① CMD 指令格式也是 shell 和 exec 两种;

② Dockerfile中如果出现多个CMD指令,只有最后一个生效。CMD会被docker run之后的参数替换。

# 因为tomcat的Dockerfile中指定了 CMD ["catalina.sh", "run"] 
# 所以直接docker run 时,容器启动后会自动执行 catalina.sh run 
docker run -it -p 8080:8080 tomcat # 指定容器启动后执行 /bin/bash 
# 此时指定的/bin/bash会覆盖掉Dockerfile中指定的 CMD ["catalina.sh", "run"] 
docker run -it -p 8080:8080 tomcat /bin/bash

(12) ENTRYPOINT:用来指定容器启动后要做的事,但不会被docker run后面的命令覆盖。

① ENTRYPOINT 可以和 CMD 一起用,当指定了 ENTRYPOINT 后,CMD 的含义就发生了变化,不再是直接运行命令,而是将 CMD 的内容作为参数传递给 ENTRYPOINT 指令,组合成 <ENTRYPOINT> "<CMD>"。

② 示例:

FROM nginx ENTRYPOINT ["nginx", "-c"] # 定参 
CMD ["/etc/nginx/nginx.conf"] # 变参

3、案例:自定义镜像 centosjava8:

① 需求:

使 centos7.6 镜像具备 vim + ifconfig + jdk8

jdk 镜像下载地址:Java Downloads | Oracle

② 编写:

准备 Dockerfile 文件

FROM centos:7
#基础镜像MAINTAINER bean<123@123.com>
#维护者和联系方式ENV MYPATH /usr/local
WORKDIR $MYPATH
#以变量的形式给到一个落脚点RUN yum -y install vim
#安装vim编辑器RUN yum -y install net-tools
#安装ifconfig命令查看网络IPRUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#安装java8及lib库ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
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
#配置java环境变量EXPOSE 80CMD echo $MYPATH
CMD echo "success-----------ok"
CMD /bin/bash

③ 构建:

docker build -t 新镜像名:TAG .

④ 运行:

4、虚悬镜像:

(1) 概念:构建镜像时出现错误,导致仓库和标签都是<none>

(2) 查看命令:docker image ls -f dangling=true

(3) 删除命令:docker image prune

三、Docker网络

1、简介:

启动docker服务后,docker服务器会创建一个docker0网桥,该网桥的网络名称为docker0,宿主机和容器可以通过该网桥相互通信。

2、docker network 常用命令:

(1) 查看网络模式:

docker network ls

安装docker后默认会自动创建三个网络。

(2) 创建网络:

docker network create 网络名

(3) 删除网络:

docker network rm 网络名

(4) 查看网络元数据:

docker network inspect 网络名

3、docker网络模式:

(1) 种类:

(2) bridge:

① Docker在宿主机虚拟一个Docker容器网桥(docker0),Docker启动容器时会根据Docker网桥的网段分配给容器一个IP地址,同时Docker网桥是每个容器的默认网关。因为在同一个宿主机内的容器接入同一个网桥,容器之间能通过docker0网桥直接通信。

② 网桥docker0创建的虚拟设备接口叫veth,每个容器实例内部也有一块网卡,网卡接口叫做eth0,每个veth匹配某个容器实例内部的eth0,两两配对。

③ 示例:

● 启动两个tomcat实例:

docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8

● 查看宿主机网络接口信息:ip addr

● 进入容器查看网络接口信息:

(3) host:

① 容器将不会虚拟出自己的网卡,而是直接使用宿主机的 IP 和端口,和宿主机共用一个 Network space。

② 示例:

● 启动一个tomcat实例:

docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8

docker启动时指定--network host,如果还指定-p映射端口,则docker服务器会给出警告信息,且-p所设置的参数不会生效。

● 正确启动:去掉-p端口映射

docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8

● 查看容器网络模式:docker inspect tomcat83

● 进入容器查看网络接口信息:

与宿主机网络接口信息相似。

(4) none:

禁用网络功能。在none模式下,docker服务器并不会为容器进行网络配置,在容器中查看网络信息,只能查看到 lo (本地回环网络127.0.0.1网卡),需要自行为容器添加网卡,配置 IP。

(5) container:

① 新创建的容器不会创建自己的网卡、IP,也不是和宿主机共享网络配置,而是和一个已经存在的一个容器共享配置。两个容器除了网络共享,其他的如文件系统、进程列表依然是隔离的。

② 示例:

● 新建两个 alpine 容器实例:

docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh

● 验证共用网桥:

● 停止 alpine1 运行,观察 alpine2 网络接口状态:

alpine1停止运行后,alpine2只剩本地环回网络。

4、自定义网络

(1) 以 bridge 模式启动两个tomcat容器:

docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8

测试网络连通性:按照 ip 地址能 ping 通 ;按照服务名 ping 不通。

(2) 以自定义网络模式启动tomcat容器:

① 新建一个自定义网络:

② 新建容器加入自定义网络:

docker run -d -p 8081:8080 --network bean_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network bean_network --name tomcat82 billygoo/tomcat8-jdk8

● 测试网络连通性,以服务器也能ping通:

结论:自定义网络本身就维护好主机名和 ip 的对应关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/212007.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索低代码之路——JNPF

目录 一、低代码行业现状 二、产品分析 1.可视化应用开发 2.流程管理 3.整个平台源码合作 三、架构和技术 技术栈 四、规划和展望 低代码平台&#xff08;Low-code Development Platform&#xff09;是一种让开发者通过拖拽和配置&#xff0c;而非传统的手动编写大量代…

外包干了8个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

java单人聊天

服务端 package 单人聊天;import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import…

Ubuntu22.04 使用Docker部署Neo4j出错 Exited(70)

项目场景&#xff1a; 最近需要使用Neo4j图数据库&#xff0c;因此打算使用docker部署 环境使用WSL Ubuntu22.04 问题描述 拉下最新Neo4j镜像&#xff0c;执行命令部署 启动容器脚本 docker run -d -p 7474:7474 -p 7687:7687 \ --name neo4j \ --env "NEO4J_AUTHneo…

洗鞋机行业分析:2023年市场发展前景及消费现状

随着消费主力的转移&#xff0c;年轻群体在消费中的话语权和影响力越来越大&#xff0c;“精致懒”正在成为潮流。洗鞋机作为消费升级时代的产物&#xff0c;自诞生以来&#xff0c;经过十几年的发展&#xff0c;逐渐被年轻消费者熟知&#xff0c;洗鞋机品牌阵营和产品种类也变…

任课老师和班主任的区别

任课老师和班主任都是学校中非常重要的角色&#xff0c;他们的工作性质和职责略有不同。作为一位老师&#xff0c;我来说说任课老师和班主任的区别。 任课老师的主要职责是教授学科知识&#xff0c;并负责解答学生在学习过程中遇到的问题。他们的工作涉及到备课、讲课、布置作业…

Qt之基于QMediaPlayer的音视频播放器(支持常见音视频格式)

Qt自带了一个Media Player的例子,如下图所示: 但是运行这个例子机会发现,连最基本的MP4格式视频都播放不了。因为QMediaPlayer是个壳(也可以叫框架),依赖本地解码器,视频这块默认基本上就播放个MP4,甚至连MP4都不能播放,如果要支持其他格式需要下载k-lite或者LAVFilte…

Java 并发编程面试题——Java 线程间通信方式

目录 1.✨Java 线程间有哪些通信方式&#xff1f;1.1.volatile 和 synchronized 关键字1.2.等待/通知机制1.2.1.概述1.2.2.经典范式 1.3.管道输入/输出流1.4.信号量 2.Thread.join() 有什么作用&#xff1f;它的使用场景是什么&#xff1f;3.Java 中需要主线程等待子线程执行完…

mac M系列芯片安装chatGLM3-6b模型

1 环境安装 1.1 mac安装conda. 下载miniconda&#xff0c;并安装 curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh sh Miniconda3-latest-MacOSX-arm64.sh1.2 创建虚拟环境并激活 创建名为chatglm3的虚拟环境&#xff0c;python版本为3.10…

js vue 输入正确手机号/邮箱后,激活“发送验证码”按钮

按钮禁止点击状态&#xff1a; 按钮能够点击状态&#xff1a; 我采用的方式是监听手机号/邮箱输入框的输入事件&#xff0c;即实判断用户输入的数据是否满足规则&#xff0c;如果满足手机号/邮箱规则&#xff0c;则激活“获取验证码”按钮。 话不多说&#xff0c;上代码 样式…

IMR TBR TBDR

IMR Immediate Mode Rendering(即时渲染)&#xff0c;是 PC 和主机 GPU 使用的渲染方式 IMR下的渲染示意图 每次渲染&#xff0c;都要读写Frame Buffer和Depth Buffer IMR优化 IMR需要大量的带宽和功耗&#xff0c;优化方式是L1、L2 Cache大缓存&#xff0c;不适用于移动G…

贪心算法及相关题目

贪心算法概念 贪心算法是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;算法得到的是在某种意义上的局部最优解 。 贪心算法性质&#xff08;判断是否可以使用贪心算法&#xff09; 1、贪…

微信小程序中生命周期钩子函数

微信小程序 App 的生命周期钩子函数有以下 7 个&#xff1a; onLaunch(options)&#xff1a;当小程序初始化完成时&#xff0c;会触发 onLaunch&#xff08;全局只触发一次&#xff09;。onShow(options)&#xff1a;当小程序启动或从后台进入前台显示时&#xff0c;会触发 on…

JenKins快速安装与使用,Gitlab自动触发Jenkins

一、JenKins 0.准备&#xff0c;配置好环境 1&#xff09;Git&#xff08;yum安装&#xff09; 2&#xff09;JDK&#xff08;自行下载&#xff09; 3&#xff09;Jenkins&#xff08;自行下载&#xff09; 1.下载安装包 进官网&#xff0c;点Download下方即可下载。要下…

工业机器视觉megauging(向光有光)使用说明书(三,轻量级的visionpro)

下来我们说说第二个相机的添加&#xff1a; 第一步&#xff0c;点击相机二&#xff0c;如下&#xff1a; 第二步&#xff0c;点击&#xff1a;加载工具组.xml&#xff0c;加载toolgroupxml2目录下的&#xff1a;工具组.xml 注意&#xff0c;一个相机只能用一个toolgroupxml,第…

mockito加junit实现单元测试笔记

目录 一、简介1.1 单元测试的特点1.2 mock类框架使用场景1.3 常用mock类框架1.3.1 mockito1.3.2 easymock1.3.3 powermock1.3.4 JMockit 二、mockito的单独使用2.1 mock对象与spy对象2.2 初始化mock/spy对象的方式初始化mock/spy对象第1种方式初始化mock/spy对象第2种方式初始化…

2023下半年软考架构师-心态崩了

2023.11.06 考试心得&#xff1a;上午综合知识&#xff0c;面广&#xff0c;但考的不深&#xff0c;主要都是理论性的&#xff0c;计算题不多&#xff0c;只要平时准备一下&#xff0c;有30题可以不会&#xff0c;过的概率还是很大的。下午的案例&#xff0c;这个就会有深度了…

C++新经典模板与泛型编程:SFINAE替换失败并不是一个错误

替换失败并不是一个错误&#xff08;SFINAE&#xff09; SFINAE是一个英文简称&#xff0c;全称为Substitution Failure is not an Error&#xff0c;翻译成中文就是“替换失败并不是一个错误”。 SFINAE可以看作C语言的一种特性或模板设计中要遵循的一个重要原则&#xff0c;…

变电站工程师软件工具:Omicron IEDScout Crack

变电站工程师打软件 IEDScout 5.2.0 帮助您确保发电、输电和配电作业的安全可靠&#xff0c;IEDScout 是专为操作 IEC 61850 装置的保护和变电站自动化工程师打造的一款理想软件工具。它可以控制 IED&#xff08;智能电子设备&#xff09;&#xff0c;并于使用过程中执行多种实…

从零开始,利用ChatGPT学会写作的完整指南

文章目录 前言了解ChatGPT访问OpenAI平台使用ChatGPT进行简单的对话定义写作主题逐步生成文章段落添加个性化和细节编辑和润色反复修改直至满意 图书推荐内容简介作者简介获取方式 前言 在数字时代&#xff0c;人工智能技术日益成熟&#xff0c;为我们提供了全新的学习和创作机…