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.mzph.cn/news/597057.shtml

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

相关文章

Python 标准库中的 csv 包

0. Abstract 官方文档很罗嗦,长篇大论例子少。本文将举例说明 csv 包的用法,然后补充一些必要的说明。 1.0 CSV 文件 CSV(Comma-Separated Values,逗号分隔值)文件是一种常见的以纯文本形式存储数据的文件格式。它使用逗号作为字段之间的分隔符&#…

解决docker容器内无法连接宿主redis

背景 小程序的发短信服务挂了,随查看日志,该报错日志如下 Error 111 connecting to 127.0.0.1:6379. Connection refused. 6379是监听redis服务的端口,那大概是redis出错了。 首先查看了redis是否正常启动,检查出服务正常。 由于小…

Flappy Bird QDN PyTorch博客 - 代码解读

Flappy Bird QDN PyTorch博客 - 代码解读 介绍环境配置项目目录结构QDN算法重要函数解读preprocess(observation)DeepNetWork(nn.Module)BirdDQN类主程序部分 介绍 在本博客中,我们将介绍如何使用QDN(Quantile Dueling Network)算法&#xf…

【Mybatis】我抄袭了Mybatis,手写一套MyMybatis框架:编写一个引入MyMybatis框架的正常项目

上一篇文章中,我们学习了使用mybatis框架连接mysql。在这篇文章中,我们将聚焦于我们的调用方,即相应的实际项目,其中包含了对mymybatis框架的引用。以一个常见而又典型的例子来说明这一点——制作一款学生管理系统(伪&…

部署清华ChatGLM-6B(Linux版)

引言 前段时间,清华公布了中英双语对话模型 ChatGLM-6B,具有60亿的参数,初具问答和对话功能。最!最!最重要的是它能够支持私有化部署,大部分实验室的服务器基本上都能跑起来。因为条件特殊,实验室网络不通,那么如何进行离线部署呢? 「部署环境」:CUDA Version 11.0,…

Maven简介及环境搭建和基本使用(Java开发中的实用工具)

一、概述 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它 用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、 测试、打包和发布等工作。 Maven的相关概念 pom.xml文件:里面可以配置相关信息,指导ma…

【SpringBoot开发】之商城项目案例(沙箱支付)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。&#x1f3af…

MySQL数据库索引优化实战

目录 一、前言 二、准备工作 2.1 用户表(TB_USER) 2.2 商品表(TB_SKU) 2.3 订单表(TB_ORDER) 三、实例分析 3.1 索引提升查询性能 3.2 多表查询 3.3 索引失效 四、总结 一、前言 在数据库的应用中,性能优化…

类加载机制之双亲委派模型、作用、源码、SPI打破双亲委派模型

双亲委派模型 双亲委派工作机制双亲委派的作用双亲委派的实现源码SPI打破双亲委派 应用程序是由三种类加载器相互配合,从而实现类加载,除此之外还可以加入自己定义的类的加载器。 类加载器之间的层次关系,称为双亲委派模型(Parent…

2024最全面且有知识深度的web3开发工具、web3学习项目资源平台

在Web3技术迅速发展的时代,寻找一个综合且深入的Web3开发工具和学习项目资源平台变得至关重要。今天,我将向大家介绍一个非常有价值的网站,它就是https://web3x.world 。 Web3X是一个全面而深入的Web3开发者社区,为开发者们提供了…

【深度学习】各领域常用的损失函数汇总(2024最新版)

目录 1、L1 损失、平均绝对误差(L1 Loss、Mean Absolute Error,MAE) 2、L2 损失、均方误差(L2 Loss、Mean Squared Error,MSE) 3、交叉熵损失(Cross-Entropy Loss) 4、混合损失&…

webpack的深入学习与实战(持续更新)

一、何为Webpack Webpack是 一个开源的JavaScript模块打包工具,其最核心的功能是解决模块之间的依赖,把各个模块按照特定的规则和顺序组织在一起,最终合并为一个JS文件或多个。 二、带宽的换算 目前我们的云服务器带宽为5M 三 、bundle 体…

【算法挨揍日记】day34——647. 回文子串、5. 最长回文子串

647. 回文子串 647. 回文子串 题目描述: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&am…

202365读书笔记|《温暖和百感交集的旅程》——时间帮助着一个人的一生在几千字的篇幅里栩栩如生

202365读书笔记|《温暖和百感交集的旅程》——时间帮助着一个人的一生在几千字的篇幅里栩栩如生 我能否相信自己温暖和百感交集的旅程前言和后记 《温暖和百感交集的旅程》作者余华,之前读完的一本书,已经不太记得内容了,看着笔记整理的这篇书…

【进程间通信】

什么是进程通信 进程通信( InterProcess Communication,IPC)就是指进程之间的信息的传播和交换。 进程是分配系统资源的单位,包括内存地址空间,为了保证安全,一个进程不能直接访问另一个进程的地址空间&a…

CMake入门教程【核心篇】属性管理set_property和get_property

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.概述2.设置属性 - …

FPGA设计时序约束十五、Set_Bus_Skew

目录 一、序言 二、Set Bus Skew 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 报告分析 三、工程示例 3.1 工程代码 3.2 时序报告 四、参考资料 一、序言 在时序约束中,对时钟的约束除了set clock latency,set clock uncertainty,set input jitter外&…

51、全连接 - 特征的全局融合

Resnet50 中的核心算法,除了卷积、池化、bn、relu之外,在最后一层还有一个全连接。 下图是 Resnet50 网络结构结尾的部分,最后一层 Gemm(通用矩阵乘法)实现的就是全连接操作。而矩阵乘法我们之前介绍过,传送门在:矩阵乘。 卷积也好,矩阵乘法也好,其目的都是为了完成神…

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式)

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式) 文章目录 JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件…

2024.1.2 Redis 数据类型 Stream、Geospatial、HyperLogLog、Bitmaps、Bitfields 简介

目录 引言 Stream 类型 Geospatial 类型 HyperLogLog 类型 Bitmaps 类型 Bitfields 类型 引言 Redis 最关键(应用广泛、频繁使用)的五个数据类型 StringListHashSetZSet 下文介绍的数据类型一般适合在特定的场景中使用! Stream 类型 St…