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实战篇。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter的安装与快速使用(做并发测试)

1、了解 JMeter是一款开源的性能测试工具,它主要用于模拟多种负载条件下的应用程序或服务器的性能和功能。JMeter可以发送不同类型的请求,如HTTP、HTTPS、FTP、SOAP、REST等,并且可以模拟多种负载类型,例如并发用户、线程组、定时…

二、Redis的特性与应用场景

Redis是一个在内存中存储数据的中间件,主要用于作为数据库、数据缓存,在分布式系统中有着非常重要的地位。面试中可以围绕Redis的特性进行介绍。 一、Redis特性 1、在内存中存储数据 MySQL主要是“表”的方式来存储组织数据的,是“关系型数…

SpringBoot 集成支付宝支付

网页操作步骤 1.进入支付宝开发平台—沙箱环境 使用开发者账号登录开放平台控制平台 2.点击沙箱进入沙箱环境 说明:沙箱环境支持的产品,可以在沙箱控制台 沙箱应用 > 产品列表 中查看。 3.进入沙箱,配置接口加签方式 在沙箱进行调试前…

深度学习|10.2 边缘检测示例 10.3 更多边缘检测

文章目录 如何在编程中实现卷积运算使用卷积实现边缘检测结果矩阵的元素正负性质的意义水平分类器如何构造卷积运算使用的矩阵 原矩阵通过一个过滤器(filter)/核心(kernel)来生成一个新的矩阵。 如何在编程中实现卷积运算 使用卷积…

LAYABOX:2024新年寄语

2024新年寄语 过去的一年,尽管许多行业面临严峻挑战和发展压力,小游戏领域却逆势上扬,年产值首次突破400亿元大关,众多优质小游戏企业收获颇丰。 对此,祝福大家,2024一定更好! 过去的一年&#…

跨站脚本攻击漏洞XSS绕过22种方式总结

XSS漏洞简介 跨站脚本攻击在目前这个时间节点还是属于一个排位比较高的漏洞,在OWASP TOP10 2021中隶属于注入型漏洞,高居TOP3的排位,可见这个漏洞的普遍性。跨站脚本攻击的学习中我们主要需要明白的是跨站的含义,以及XSS的核心。…

如何自动生成 API 接口文档 - 一份详细指南

本篇文章详细教你如何使用 Apifox 的 IDEA 插件实现自动生成接口代码。好处简单总结有以下几点: 自动生成接口文档: 不用手写,一键点击就可以自动生成文档,当有更新时,点击一下就可以自动同步接口文档;代码…

关于MIPS上手应知应会-如何把C语言改写为MIPS!

文章目录 寄存器指令使用技巧翻译C/Cif/else语句switch语句for循环while 循环do...while循环一维数组定义与使用二维数组定义与使用例 :哈密顿回路 注意立即数被符号位扩展 参考链接 寄存器 NameReg. NumUsage z e r o zero zero0constant value 0(恒为0) a t at a…

学习使用wps将ppt的页面保存为图片的方法

学习使用wps将ppt的页面保存为图片的方法 方案 方案 1、打开ppt,点击文件,另存为,选择文件类型为图片格式,jpg或者png,如下图: 2、点击每张幻灯片

2023启示录丨自动驾驶这一年

图片|《老人与海》插图 过去的20年,都没有2023年如此动荡。 大模型犹如一颗原子弹投入科技圈,卷起万里尘沙,传统模式瞬间被夷为平地,在耀眼的白光和巨大的轰鸣声之下,大公司、创业者、投资人甚至是每一位观…

大语言模型LLM微调技术:P-Tuning

1 引言 Bert时代,我们常做预训练模型微调(Fine-tuning),即根据不同下游任务,引入各种辅助任务loss和垂直领域数据,将其添加到预训练模型中,以便让模型更加适配下游任务的方式。每个下游任务都存…

四、HTML 属性

属性是 HTML 元素提供的附加信息。 一、HTML 属性 HTML 元素可以设置属性属性可以在元素中添加附加信息属性一般描述于开始标签属性总是以名称/值对的形式出现&#xff0c;比如&#xff1a;name"value"。 二、 属性实例 HTML 链接由 <a> 标签定义。链接的地…

python设计模式:模板方法模式

更多Python学习内容&#xff1a;ipengtao.com 软件设计和编程中&#xff0c;设计模式是一种有助于解决常见问题的强大工具。其中之一是"模板方法模式"&#xff0c;它是一种行为型设计模式&#xff0c;允许你定义一个算法的骨架&#xff0c;但将一些步骤的具体实现延迟…

声明式管理方(yaml)文件

声明式管理方(yaml)文件: 1、适合对资源的修改操作 2、声明式管理依赖于yaml文件&#xff0c;所有的内容都在yaml文件当中。 3、编辑好的yaml文件需要依靠陈述是还是要依靠陈述式的命令发布到k8s集群当中 create只能创建&#xff0c;不能更新。从指定yaml文件中读取配置&#…

静态代理、JDK动态代理、CGLIB动态代理以及JDK和CGLIB动态代理的区别

代理 什么是代理&#xff1f;两个设计原则三要素 静态代理静态代理的实现定义接口-定义行为静态代理 -> 目标角色静态代理-> 代理角色静态代理测试 特点 JDK动态代理newProxyInstance获取代理对象通过代理对象实现目标对象的功能特点 Java动态代理类中的invoke是怎么调用…

OpenAI GPT 模型 API 接口新增参数 top_logprobs 和 logprobs

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 在最新的 OpenAI 官方 APIs 文档中&#xff0c;Create chat completion 中新增了 top_logprobs 和 logprobs 这两个关键参数。 官方文档地址&#xff…

06.02 customizing plots with style sheets

使用 style 来配置 pyplot 风格 import matplotlib.pyplot as plt import numpy as np%matplotlib inlinestyle 是 pyplot 的一个子模块&#xff0c;方便进行风格转换&#xff0c; pyplot 有很多的预设风格&#xff0c;可以使用 plt.style.available 来查看&#xff1a; plt.…

GO语言笔记1-安装与hello world

SDK开发工具包下载 Go语言官网地址&#xff1a;golang.org&#xff0c;无法访问Golang中文社区&#xff1a;首页 - Go语言中文网 - Golang中文社区下载地址&#xff1a;Go下载 - Go语言中文网 - Golang中文社区 尽量去下载稳定版本&#xff0c;根据使用系统下载压缩包格式的安装…

linux释放交换空间-Swap

确保剩余内存比swap内存空间大&#xff0c;再执行以下操作&#xff0c;否则会宕机&#xff01; 查看swap分区 swapon -s 会查看到你的swap分区位置 停止swap分区 停止swap分区是将swap内存释放到实际内存中 swapoff /dev/dm-1开启swap分区 swap分区内存成功释放到实际内…

【一文入门】Git常用命令集锦--分支操作和版本管理篇

前言 Git 是一种分布式版本控制系统&#xff0c;可以帮助团队协作开发、管理和维护代码&#xff0c;提高代码质量和效率&#xff0c;掌握常用版本管理命令可以帮助我们更好地管理代码变更和历史记录。下面我将介绍开发中常用的一些Git分支操作和版本管理命令 1 分支操作 1.1 …