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)。 能查到的资料都侧重于其数学形…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
