Dockerfile与Docker网络

news2025/1/15 17:50:44

一、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命令查看网络IP
 
RUN 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 80
 
CMD 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.coloradmin.cn/o/1281339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电影《星愿》观后感

上周看了电影《星愿》&#xff0c;看这部电影的动机&#xff0c;主要是回忆的价值大于电影本身的价值&#xff0c;看着影片介绍&#xff0c;是迪士尼工作室成立百年&#xff0c;特别推出的影片。 具体来说&#xff0c;主要是在开头有一段是影片&#xff0c;各个时期的我们看过的…

Echarts大屏可视化_03 定制柱状图

柱状图模块引入 1.找到合适的图表 在echarts中寻找与目标样式相近的图表 Examples - Apache ECharts 2. 引入柱状图 使用立即执行函数构建&#xff0c;防止变量全局污染 实例化对象 将官网中提供的option复制到代码中&#xff0c;并且构建图表 // 柱状图模块1 (function () {/…

若依微服务项目整合rocketMq

原文链接&#xff1a;ttps://mp.weixin.qq.com/s/IYdo_suKvvReqCiEKjCeHw 第一步下载若依项目 第二步安装rocketMq&#xff08;推荐在linux使用docker部署比较快&#xff09; 第二步新建一个生产者模块儿&#xff0c;再建一个消费者模块 第四步在getway模块中配置接口映射规…

浅学指针(5)sizeof和strlen的进阶理解

系列文章目录 文章目录 系列文章目录前言1. sizeof和strlen的对⽐1.1 sizeofsizeof不是函数&#xff0c;是运算符 1.2 strlen1.3 sizeof 和 strlen的对⽐ 2. 数组和指针笔试题解析• sizeof(数组名)&#xff0c;sizeof中单独放数组名&#xff0c;这⾥的数组名表⽰整个数组&…

一款自动帮你生成UI界面和代码的AI神器

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 只要描述你想要的UI是什么样的&#xff0c;它就能帮你生成&#xff0c;是不是很神奇&#xff1f; v0使用 AI 模型根据简单的文本提示生成用户界面和代码&#xff…

有序表常见题型

给定一个数组arr和两个整数a和b求arr中有多少个子数组累加和在a到b这个范围上返回达标的子数组数量 如【3&#xff0c;6&#xff0c;1&#xff0c;9&#xff0c;2】达标的子数组通过暴力求解的方式时间复杂度为O&#xff08;N的三次方&#xff09;【找每个子数组占用O&#xf…

MQ - KAFKA 基础篇

##1、KAFKA的核心组件/API Producer API&#xff0c;它允许应用程序向一个或多个 topics 上发送消息记录 Consumer API&#xff0c;允许应用程序订阅一个或多个 topics 并处理为其生成的记录流 Streams API&#xff0c;它允许应用程序作为流处理器&#xff0c;从一个或多个主…

Ubuntu中安装IDEA,并配置桌面快捷方式

1、首先自己下载linux版本的idea 这一步省略不说了 2、在/usr/local/路径下新建安装目录IDEA&#xff1a; mkdir -p /usr/local/IDEA3、执行如下命令&#xff0c;解压下载的压缩包到指定目录&#xff1a; tar -zxvf ideaIU-2022.3.3.tar.gz -C /usr/local/IDEA 注意&#x…

QT 中 QDateTime::currentDateTime() 输出格式备查

基础 QDateTime::currentDateTime() //当前的日期和时间。 QDateTime::toString() //以特定的格式输出时间&#xff0c;格式 yyyy: 年份&#xff08;4位数&#xff09; MM: 月份&#xff08;两位数&#xff0c;07表示七月&#xff09; dd: 日期&#xff08;两位数&#xff0c…

Siemens-NXUG二次开发-新建与保存prt文件[Python UF][20231204]

Siemens-NXUG二次开发-新建与保存prt文件[Python UF][20231204] 1.python uf函数1.1 NXOpen.UF.Part.New1.2 NXOpen.UF.Part.Save1.3 NXOpen.UF.Ui.OpenListingWindow1.4 NXOpen.UF.Ui.IsListingWindowOpen1.5 NXOpen.UF.Ui.WriteListingWindow1.6 NXOpen.UF.Ui.SaveListingWin…

深入了解汉字转拼音转换工具:原理与应用

一、引言 汉字作为世界上最古老、最具象形意的文字之一&#xff0c;承载了数千年的历史文明。然而&#xff0c;在现代信息技术环境下&#xff0c;汉字的输入、输出和检索等方面存在一定的局限性。拼音作为汉字的一种音标表达方式&#xff0c;能够有效地解决这些问题。本文将为…

MYSQL练题笔记-排序和分组-全7题已完成

排序和分组这部分共7道题&#xff0c;如下&#xff0c;只说一说3道&#xff0c;其他都写对了&#xff0c;也不难&#xff0c;只有最后一题难一点点&#xff0c;没想到那种解法&#xff0c;一看到主键和外键就想利用连接。 1.销售分析的题目和表相关内容如下 就是利用product_id…

会话 cookie 及隐私的那些事

什么是会话 Cookie? 会话 Cookie 的概念非常简单。 会话 Cookie,也称为临时 Cookie 或内存 Cookie,是网站在浏览会话期间存储在用户计算机或设备上的小数据片段。 它是由网站生成并由您的浏览器存储和使用的多种 Cookie 之一。 常规 Cookie 或“持久”Cookie 是通常在您的…

周周清(1)

项目进度&#xff1a; 最近一直在搭建环境&#xff0c;都没写什么&#xff1a;登陆页面采用登陆注册在同一个界面&#xff0c;用v-if进行渲染&#xff0c;并且借助validation插件中的yup神器进行校验&#xff0c; <script setup> // import { ref } from vue import * …

机器学习 - 导论

简单了解 机器学习关于数据集的概念 、

免费AI洗稿软件【2023最新】

很多时候我们需要通过文字来表达观点、推广产品或服务。然而&#xff0c;长时间的文稿创作不仅费时费力&#xff0c;还容易陷入表达瓶颈。许多写手和从业者纷纷寻找一款方便、高效的AI洗稿工具。 文心一言洗稿软件。这款软件以其独特的文风生成和洗稿功能而备受瞩目。用户只需…

思维模型 搭便车效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。合理坐享其成。 1 搭便车效应的应用 1.1 搭便车效应在商业竞争中的应用 1 被搭便车的AT&T 在 20 世纪 80 年代&#xff0c;美国电信市场由美国电话电报公司&#xff08;AT&T&…

DNA模糊匹配(动态规划)

我做动态规划还是少的 只会做那些显而易见的动态规划题&#xff08;这题是看了给出来的解题思路做的&#xff09; 以后可能就会做与这类似的了 代码如下&#xff1a; #include<stdio.h> #include<string.h> int get_min(int a, int b, int c); int min_l[301][…

利用STM32内置温度传感器实现温度监测系统

STM32微控制器是一款强大的嵌入式处理器&#xff0c;具有广泛的应用领域。其中&#xff0c;一些STM32微控制器内置了温度传感器&#xff0c;可以方便地实现温度监测功能。本文将详细介绍如何利用STM32内置温度传感器实现温度监测系统&#xff0c;并提供相应的示例代码。 一、硬…

【C++】类和对象——explicit关键字,友元和内部类

这篇博客已经到了类和对象的最后一部分了&#xff0c;下面我们先看一下explicit关键字 我们还是先来引入一个例子&#xff0c;我们的代码是可以这么写的 class A { public:A(int aa 0) {_a aa;cout << "A(int aa 0)" << endl;} private:int _a; }; i…