Docker 入门 ------容器互通以及Dockerfile

1. 端口映射以及容器互联

Docker 除了通过网络访问,还提供了两种很方便的功能来满足服务访问的基本需求:

  1. 允许映射容器内应用的服务端口到本地宿主主机
  2. 互联机制实现多个容器间通过容器名来快速访问

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 最佳实践

遵循一下九条意见:

  1. 精简镜像用途
  2. 选用合适的基础镜像
  3. 提供足够清晰的命令注释和维护者信息
  4. 正确使用版本号
  5. 减少镜像层数
  6. 及时删除临时文件和缓存文件
  7. 提高生成速度
  8. 调整合理的指令顺序
  9. 减少外部源干扰

总结

本章节主要介绍了Docker容器如何进行互通,以及容器互通时需要注意的事项以及细节,然后详细的介绍了Dockerfile各个关键字的含义,以及如何使用,到这里Docker入门的章节就结束了,后面会有一个Docker实战篇。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文了解无线通信 - NB-IOT、LoRa

NB-IOT、LoRa 目录概述需求: 设计思路实现思路分析 NB-IOT1.LoRa2.区别 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,chall…

磁盘阵列raid

一、服务器硬件 cpu 、 主板 、内存、硬盘、网卡、电源、raid卡、风扇、远程管理卡 二、硬盘尺寸 目前生产环境中主流的两种类型硬盘 3.5寸 和 2.5寸 硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器,但是3.5寸没法转换成2.5寸 1.如何在服务器上…

暗光增强——URetinex-Net网络推理测试

目录 一、URetinex-Net网络二、源码包三、测试3.1 修改参数3.2 测试结果 四、推理速度五、总结 一、URetinex-Net网络 URetinex-Net 设计了三个基于学习的模块,分别负责数据相关的初始化、高效的展开优化和用户指定的光照增强。由于 URetinex-Net 的推理速度非常快…

大语言模型(LLM)框架及微调 (Fine Tuning)

大语言模型(LLM) 技术作为人工智能领域的一项重要创 新在今年引起了广泛的关注。 LLM 是利用深度学习和大数据训练的人工智能系统,专门 设计来理解、生成和回应自然语言。这些模型通过分析大量 的文本数据来学习语言的结构和用法,…

初识隧道代理HTTP:理解基础概念的重要性

嗨,小伙伴们!如果你对网络世界充满好奇,那么这篇文章就是为你准备的。我们将一起踏上一段奇妙的旅程,探索一个叫做“隧道代理HTTP”的新领域。但在这之前,我们需要先穿上“基础概念”的防护服,以免被这个复…

Ubuntu22.04 安装教程

系统下载 Ubuntu官网下载 清华源镜像 安装流程 1. 选择安装语言 2. 选择是否在安装时更新 为了系统安装速度一般选择安装时不更新,安装后自行更新 3. 选择系统语言和键盘布局 4. 选择安装模式 5. 配置网络信息 6. 设置静态IP 7. 配置代理信息 8. 配置Ubuntu镜像…

【c/c++】指针例图基础详解

文章目录 指针变量内存指针详解例1例2练习&答案解析 指针变量内存 int main(){// 各类型变量占字节数printf("char: %d\n",sizeof(char)); // 1printf("short: %d\n",sizeof(short)); // 2printf("int: %d\n",sizeof(int)); // 4pri…

【Linux系统化学习】进程终止的奥秘

个人主页点击直达:小白不是程序媛 Linux专栏:Liunx系统化学习 代码仓库:Gitee 目录 获取函数返回值 退出码 进程退出的场景 错误码 信号终止异常代码 进程的终止 main函数直接return exit函数 _exit函数 获取函数返回值 在C语言学…

用anaconda下载安装pytorch1.8.2+cudatoolkit11.1

用anaconda下载安装pytorch1.8.1cudatoolkit11.1 设置清华镜像下载: conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda con…

【Linux】chage命令使用

chage命令 chage用来更改linux用户密码到期信息,包括密码修改间隔最短、最长日期、密码失效时间等。 语法 chage [参数] 用户名 chage命令 -Linux手册页 选项及作用 执行令 : chage --help 执行命令结果 参数 -d, --lastday 最近日期 …

Python圣诞树代码

Python圣诞树代码 # 小黄 2023/12/25import turtle as t # as就是取个别名,后续调用的t都是turtle from turtle import * import random as rn 100.0speed(20) # 定义速度 pensize(5) # 画笔宽度 screensize(800, 800, bgblack) # 定义背景颜色,可…

WPF 显示气泡提示框

气泡提示框应用举例 有时候在我们开发的软件经常会遇到需要提示用户的地方,为了让用户更直观,快速了解提示信息,使用简洁、好看又方便的气泡提示框显得更加方便,更具人性化。如下面例子:(当用户未输入账号时&#xff0…

Vue学习day_03

普通组件的注册 局部注册: 创建一个components的文件夹 在里面写上对应的.vue文件 在对应的vue里面写上对应的3部分 template写上对应的核心代码 盒子等 style 写上对应的css修饰 在App.vue里面进行引用 import 导包 格式是 import 起个名字 from 位置 在写一个component…

javaweb基础2.0 (持续更新中)

Day 10 : Responbody 将响应的实体类转为json发送给前端。RequestBody将request的json转为实体类给后端 修改未成功的可能是因为根据id 查询的时候,只查询了name字段,因为后面需要根据id 修改,所以还需查询id ,不然前端不知道id也…

回归预测 | Python实现OOA-LightGBM基于人工鱼鹰优化算法优化LightGBM的多输入单输出数据回归预测模型 (多指标,多图)

回归预测 | Python实现OOA-LightGBM基于人工鱼鹰优化算法优化LightGBM的多输入单输出数据回归预测模型 (多指标,多图) 目录 回归预测 | Python实现OOA-LightGBM基于人工鱼鹰优化算法优化LightGBM的多输入单输出数据回归预测模型 (…

STM32 ESP8266 物联网智能温室大棚 源码PCB原理图 设计文档

资料下载: https://download.csdn.net/download/vvoennvv/88680924 一、概述 本系统以STM32F103C8T6单片机为主控芯片,采用相关传感器构建系统硬件电路。其中使用DHT11温湿度传感器对温度和湿度的采集,MQ-7一氧化碳传感器检测CO浓度,GP2Y101…

nginx日志常见报错解决

目录 一:报错 二:php查看后台内容有的栏目出现502? 三:413 Request Entity Too Large? 四:Request Header Or Cookie Too Large 400 一:报错 upstream prematurely closed connection while reading r…

Java之程序、进程、线程、管程和并发、并行的概念

文章目录 1. 进程与线程1.1 程序1.2 进程1.3 线程1.4 管程 2.并行与并发2.1 并发2.2 并行 1. 进程与线程 1.1 程序 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。简单的说就是我们写的代码。 1.2 进程 (1&…

C# 使用ZXing.Net识别二维码和条码

目录 写在前面 代码实现 调用示例 写在前面 上一篇写了 C# 使用ZXing.Net生成二维码和条码-CSDN博客 使用ZXing.Net解码非常简单,事实上就只用一行代码就好了,这么简单那为什么还要贴在这里呢,原因是开始时,在网上看资料看到…

【项目管理】CMMI-项目总结报告模版

1、文档目录结构 2、计划与实际情况对比 3、开放工作评价