Docker 入门 ------容器互通以及Dockerfile
1. 端口映射以及容器互联
Docker 除了通过网络访问,还提供了两种很方便的功能来满足服务访问的基本需求:
- 允许映射容器内应用的服务端口到本地宿主主机
- 互联机制实现多个容器间通过容器名来快速访问
1.1 容器映射实现访问容器
1.1.1 从外部访问容器应用
当容器中运行一些网络应用时,可以通过-P
或者-p
来指定端口映射。-P
会使Docker随机取一个端口号。
docker run -d -P training/webapp python app.py
表示本地主机的32769映射到了容器的5000端口
你也可以使用-p
来指定端口绑定一个容器,格式:
HOSTPort:ContainerPort 或者 IP::ContainerPort
1.1.2 映射所有接口端口
docker run -d -p 5000:5000 training/webapp python app.py // 将本地的5000端口映射到容器的5000端口
也可以一次绑定多个端口
docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py // 将本地的5000端口映射到容器的5000端口,且本地3000端口也映射到容器的80端口
1.1.3 映射到指定地址的指定端口
docker -run -d -p127.0.0.1:5000:5000 training/webapp python app.py
此处用的就是ip:HOSTPORT:ContainerPort
格式指定映射地址
1.1.4 映射到指定容器的任意端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
此处用的就是IP::ContainerPort
绑定本地主机任意端口到容器5000端口
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
还可以使用udp标记来指定udp端口
1.1.5 查看映射端口的配置
docker port ContainerName
注意:
容器有自己的内部网络和IP地址,使用docker inspect + 容器ID 可以获取容器的具体信息
1.2 互联机制实现便捷互访
容器的互联会在源和接受容器之间创建链接关系,接受容器可以通过容器名快速访问到源容器,而不用制定具体的IP地址
1.2.1 自定义容器命名
docker run -d -P --name web training/webapp python app.py
使用--name
可以自定义容器名,以上就命名容器为web
docker ps -l 来验证
docker inspect -f “{{ .Name }}” [容器ID]
容器的名称是唯一的,如果你已经有了一个名为web的容器,你就不能创建一个相同名字的容器了,必须先rm在创建,如果在docker run使用--rm标记,那么会在容器终止后立即删除,
注意--rm和-d参数不能同时使用
1.2.2 容器互联
创建容器:
docker run -d --name db training/postgres // 创建一个数据库容器
docker rm -f web // 删除之前的web容器
docker run -d -P --name web --link db:db training/webapp python app.py // 然后创建一个web容器,并且把他连接到db容器
此时。db容器和web容器为互联关系。 --link
参数格式为--link name:alias
其中name是链接容器名称,alias是这个链接的别名。
注意: Docker相当于在两个容器之间创建了一个虚拟通道,而不需要再去映射它们的端口到宿主主机上。在启动db容器的时候没有使用-p
或-P
标记,从而避免数据库服务端口暴露到外部网络中。
我们来测试两者之间连通性:
docker run -t -i --rm --link db:db training/webapp /bin/bash // 进入终端
cat /etc/host
ping db
这里我们可以看到db被解析成了172.18.0.3
2. 使用Dockerfile创建镜像
2.1 基本结构
Dockerfile主要分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
例子:
FROM ubuntu // 所创建的基础镜像信息
MAINTAINER docker_user docker_user@email.com // 维护者信息
RUN echo "deb http://archive.ubuntu.com/ubuntu raring main universe" >> /etc/apt/sources.list // 运行命令
RUN yum -y nginx // 运行命令
RUN echo "\ndaemmon off;" >> /etc/nginx/nginx.conf // 运行命令CMD /usr/bin/nginx // 启动容器时的默认指令
2.2 指令说明
2.2.1 FROM
解释: 指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像
格式:
FROM[image] | [image]:[tag] | [image]@[digest]
注意:Dockerfile第一条指令必须是FROM指令,如果在同一个Dockerfile中创建多个镜像,可以使用多个FROM指令(每个镜像一次)
2.2.2 MAINTAINER
解释: 指定维护者信息。
格式:
MAINTAINER image_creator@docker.com
生成的镜像会写入镜像的Author属性域中。
2.2.3 RUN
解释: 运行指定命令。
格式:
RUN [command] | [“executable”,“param1”,“param2”]
注意!上面第二种方式会被解析成一个JSON,所以必须使用双引号
RUN可以使用\来进行换行
2.2.4 CMD
解释: 用来指定启动容器时默认执行的命令
格式:
CMD [“executable”,“param1”,“param2”] | command param1 param2 | [“param1”,“param2”]
其中第一种是使用exec执行,是最推荐的方式,第二种是提供给需要交互的应用,第三种是提供给ENTRYPOINT
的默认参数
每一个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会执行
如果启动容器的时候手动指定了运行命令(RUN)则会覆盖掉CMD命令
2.2.5 LABEL
解释: 用来指定生成镜像的元数据标签信息。
格式:
LABEL [key]=[value] [key]=[value] …
2.2.6 EXPOSE
解释: 声明镜像内服务监听的端口
格式:
EXPOSE 22 80 8080
注意:
该指令只是起到声明作用,并不会自动完成端口映射。
在启动容器时,需要使用-P,Docker主机会自动分配一个宿主机的临时端口转发到指定端口
使用-p,可以具体声明从宿主机哪个本地端口映射过来
2.2.7 ENV
解释: 指定环境变量,在镜像生成过程中会被后续的RUN指令使用,在镜像启动的容器中也会存在。
格式:
ENV [key][value] | [key] = [value]
指令指定的环境变量在运行时可以被覆盖掉,如:
docker run --env [key]=[value] …
2.2.8 ADD
解释: 复制指定的src
路径下的内容到容器中的dest
路径下
格式:
add [src][dest]
如果是tar文件,会自动解压到dest路径下,dest可以是绝对路径,或者是对于工作目录的相对路径。
2.2.9 COPY
解释: 复制本地主机的src
到镜像容器的dest
下,注意!和add是有区别的
,copy主要复制的是本地主机
。
格式:
copy [src][dest]
2.2.10 ENTRYPOINT
解释: 指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数
格式:
ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1 param2
前者使用exec调用,后者在shell中执行。使用后CMD指令指定值将作为根命令的参数
每个Dockerfile中只能有一个ENTRYPOINT,当有多个时,只有最后一个有效。
在运行时,可以被 --entrypoint覆盖掉
2.2.11 VOLUME
**解释:**创建一个数据卷挂载点。
格式:
VOLUMe[“/data”]
2.2.12 USER
解释: 指定容器运行时的用户名或ID,后续RUN也会指定用户身份。
格式:
USER daemon
当服务不需要管理员时,也可以通过命令来指定运行用户,并且可以在之前创建所需要的用户。
RUN groupadd -r postgres && useradd -r -g postgres postgres
2.2.13 WORKDIR
解释: 为后续的RUN、CMD和ENTRYPOINT指令配置工作目录
格式:
WORKDIR [path]
2.2.14 ARG
解释: 指定一些镜像内使用的参数
格式:
ARG [name][=[default name]]
2.2.15 ONBUILD
解释: 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令
ONBUILD [INSTRUCTION]
2.2.16 STOPSIGNAL
解释: 指定所创建镜像启动的容器接受退出的信号值
格式:
STOPSIGNAL [signal]
2.2.17 HEALTHCHECK
**解释: ** 配置所启动容器如何进行健康检查
格式:
HEALTHCHECK [OPTIONS] CMD command; // 根据所执行命令返回值是否为0判断
HEALTHCHECK NONE; // 禁止进行健康检查
OPTIONS选项说明:
指令 | 解释 |
---|---|
–interval | 默认30s,过多久检查一次 |
–timeout | 默认30s,每次检查等待结果的超时时间 |
–retries | 默认3,检查失败了,重试几次才确定 |
2.2.18 SHELL
解释: 其他命令使用shell时的默认shell类型
格式:
shell [“command”,“options”]
注意:Dockerfile开头添加#escape=来指定转义信息
2.3 创建镜像
Dockerfile通过docker build
来创建镜像。
例如,指定Dockerfile所在路径为 /tmp/docker_builder/
,希望生成的标签为build_repo/first_iamge
。
docker build -t build_repo/first_iamge /tmp/docker_builder/
2.4 使用.dockerignore文件
可以通过.dockerignore
来让Docker忽略匹配模式下路径的目录和文件
2.5 最佳实践
遵循一下九条意见:
- 精简镜像用途
- 选用合适的基础镜像
- 提供足够清晰的命令注释和维护者信息
- 正确使用版本号
- 减少镜像层数
- 及时删除临时文件和缓存文件
- 提高生成速度
- 调整合理的指令顺序
- 减少外部源干扰
总结
本章节主要介绍了Docker容器如何进行互通,以及容器互通时需要注意的事项以及细节,然后详细的介绍了Dockerfile各个关键字的含义,以及如何使用,到这里Docker入门的章节就结束了,后面会有一个Docker实战篇。
相关文章:

Docker 入门 ------容器互通以及Dockerfile
1. 端口映射以及容器互联 Docker 除了通过网络访问,还提供了两种很方便的功能来满足服务访问的基本需求: 允许映射容器内应用的服务端口到本地宿主主机互联机制实现多个容器间通过容器名来快速访问 1.1 容器映射实现访问容器 1.1.1 从外部访问容器应…...

AI绘图模型不会写字的难题解决了
介绍 大家好,最近有个开源项目比较有意思,解决了图像中不支持带有中文的问题。 https://github.com/tyxsspa/AnyText。 为什么不能带有中文? 数据集局限 Stable Diffusion的训练数据集以英文数据为主,没有大量包含其他语言文本的…...

vue-cli创建项目时由esLint校验导致报错或警告的问题及解决
vue-cli创建项目时由esLint校验导致报错或警告的问题及解决 一、万能办法 一、万能办法 //就是在报错的JS文件中第一行写上 /* eslint-disable */链接: https://www.yii666.com/blog/288808.html 其它的方法我遇见了再补充...

uniapp:实现手机端APP登录强制更新,从本地服务器下载新的apk更新,并使用WebSocket,实时强制在线用户更新
实现登录即更新,或实时监听更新 本文介绍的是在App打开启动的时候调用更新,点击下方链接,查看使用WebSocket实现实时通知在线用户更新。 uniapp:全局消息是推送,实现app在线更新,WebSocket,ap…...

设计循环队列——oj题622
. 个人主页:晓风飞 专栏:LeetCode刷题|数据结构|Linux 路漫漫其修远兮,吾将上下而求索 文章目录 题目要求:应该支持如下操作:示例:提示: 结构体定义队列的创建基本操作判断队列是否为空…...

阿里后端实习一面面经
阿里后端实习一面面经 项目中使用到了es,es的作用? elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 es中的重要概念? 群集:一个或多个节点…...

element-ui组件DatePicker日期选择器移动端兼容
element-ui组件DatePicker日期选择器移动端兼容 css /** 移动端展示 **/ media screen and (max-width: 500px) {.el-picker-panel__sidebar {width: 100%;}.el-picker-panel {width: 400px!important;}.el-picker-panel__content {width: 100%;}.el-picker-panel__body{marg…...

burpsuite 爆破
靶场搭建:phpstudy的安装与靶场搭建 - junlin623 - 博客园 (cnblogs.com) 账号字典:XXTK: 一些弱口令、fuzz字典 (gitee.com) 网盘链接:https://pan.baidu.com/s/1v5pAwaTwoeCnJgkUXf3iLQ?pwd=mllm 提取码:mllm --来自百度网盘超级会员V2的分享 一、暴力破解 - 基于…...

SparkSQL基础解析(三)
1、 Spark SQL概述 1.1什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和 DataSet,并且作为分布式SQL查询引擎的作用。 我们已经学习了Hive,它是将Hive SQL转换成MapReduce然后提…...

gz-hamonic 安装提示缺少许多依赖无法安装
在软件更新源中增加gz-hamonic的软件源, 点击添加,在输入框中填入如下语句: deb http://packages.osrfoundation.org/ubuntu jammy main 如图所示: 然后执行 sudo apt -get install gz-hamonic即可安装。 如下图 在终端中输入…...
新版Edge卸载
新版Edge卸载:步骤与注意事项 随着Windows 10的发布,微软推出了新版Edge浏览器。虽然新版Edge浏览器具有许多优秀的新功能和改进,但有时您可能希望卸载它并使用其他浏览器。在本文中,我们将向您介绍如何卸载新版Edge浏览器&#…...
Ansibe自动化基础
目录 一.Ansibe自动化概述 1.特点 2.工作特性 3.应用场合 二.ansibe安装即相关文件说明 1.安装 2.相关文件 3.主配置文件内容详解 4.ansibe运行机制 三.ansibe管理节点命令 1.Ansibe 四.主机组配置 1.基本配置 第一种: 第二种: 2.设置SSH…...

2023 年中国高校大数据挑战赛赛题B DNA 存储中的序列聚类与比对-解析与参考代码
题目背景:目前往往需要对测序后的序列进行聚类与比对。其中聚类指的是将测序序列聚类以判断原始序列有多少条,聚类后相同类的序列定义为一个簇。比对则是指在聚类基础上对一个簇内的序列进行比对进而输出一条最有 可能的正确序列。通过聚类与比对将会极大…...

决策树--分类决策树
1、介绍 ① 定义 分类决策树通过树形结构来模拟决策过程,决策树由结点和有向边组成。结点有两种类型:内部结 点和叶结点。内部结点表示一个特征或属性,叶子节点表示一个类。 ② 生成过程 用决策树分类,从根结点开始ÿ…...
【2024/1/5】
2024/1/5周报 本周开展工作下周工作计划 本周开展工作 首先的话就是跟大家汇报一下上一个项目的进度,那因为一些我这边的不可控的因素暂时进行搁置,随后的话还是需要在进行做的。 因此我们最近在做一个web端的项目,这个项目的具体的就不汇报…...

CNN——VGG
1.VGG简介 论文下载地址:https://arxiv.org/pdf/1409.1556.pdf VGGNet 是由牛津大学视觉几何小组(Visual Geometry Group, VGG)提出的一种深层卷积网络结构,他们以 7.32% 的错误率赢得了 2014 年 ILSVRC 分类任务的亚军ÿ…...
深入理解Java中的多线程编程与并发控制
当谈论到 Java 编程语言时,多线程编程和并发控制是其中最重要的话题之一。Java 在多线程领域有着强大的支持和丰富的工具集,允许开发人员利用并发性来提高程序性能和效率。本文将深入探讨 Java 中的多线程编程和并发控制,包括线程的创建、同步…...
提供10个mysql的实例和思路
学生信息管理系统 学生表(id, name, gender, age, class_id)班级表(id, name)思路:通过学生表和班级表进行关联,可以实现学生信息的查询、添加、修改、删除等操作。 订单管理系统 订单表(id, us…...

FPGA项目(14)——基于FPGA的数字秒表设计
1.功能设计 设计内容及要求: 1.秒表最大计时范围为99分59. 99秒 2.6位数码管显示,分辨率为0.01秒 3.具有清零、启动计时、暂停及继续计时等功能 4.控制操作按键不超过二个。 2.设计思路 所采用的时钟为50M,先对时钟进行分频,得到100HZ频率…...
浅谈指数移动平均(ema)
经常在各种代码中看到指数移动平均(比如我专注的网络传输领域),但却不曾想到它就是诠释世界的方法,我们每个人都在被这种方式 “平均”… 今天说说指数移动平均(或移动指数平均,Exponential Moving Average)。 能查到的资料都侧重于其数学形…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...

AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
StarRocks 全面向量化执行引擎深度解析
StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...
更新 Docker 容器中的某一个文件
🔄 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法,适用于不同场景。 ✅ 方法一:使用 docker cp 拷贝文件到容器中(最简单) 🧰 命令格式: docker cp <…...

Yolo11改进策略:Block改进|FCM,特征互补映射模块|AAAI 2025|即插即用
1 论文信息 FBRT-YOLO(Faster and Better for Real-Time Aerial Image Detection)是由北京理工大学团队提出的专用于航拍图像实时目标检测的创新框架,发表于AAAI 2025。论文针对航拍场景中小目标检测的核心难题展开研究,重点解决…...