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)。 能查到的资料都侧重于其数学形…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

[10-1]I2C通信协议 江协科技学习笔记(17个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17...

Heygem50系显卡合成的视频声音杂音模糊解决方案
如果你在使用50系显卡有杂音的情况,可能还是官方适配问题,可以使用以下方案进行解决: 方案一:剪映替换音色(简单适合普通玩家) 使用剪映换音色即可,口型还是对上的,没有剪映vip的&…...

【芯片仿真中的X值:隐藏的陷阱与应对之道】
在芯片设计的世界里,X值(不定态)就像一个潜伏的幽灵。它可能让仿真测试顺利通过,却在芯片流片后引发灾难性后果。本文将揭开X值的本质,探讨其危害,并分享高效调试与预防的实战经验。 一、X值的本质与致…...