覆盖容器的默认设置

覆盖容器都默认设置

目录

  • 覆盖网络端口
  • 设置环境变量
  • 限制容器资源使用
  • 试一试
    • 运行多个 Postgres 数据库实例
    • 在受控网络中运行 Postgres 容器
    • 管理资源
    • 在 Docker Compose 中覆盖默认的 CMD 和 ENTRYPOINT
    • 使用 docker run 覆盖默认的 CMD 和 ENTRYPOINT
  • 额外资源
  • 下一步

当 Docker 容器启动时,它会执行一个应用程序或命令。容器从镜像的配置中获取这个可执行文件(脚本或文件)。容器自带的默认设置通常运行良好,但如果需要,你可以更改这些设置。这些调整有助于让容器程序按你希望的方式运行。

例如,如果你有一个现有的数据库容器,它监听标准端口,而你想运行相同数据库容器的新实例,那么你可能需要更改新容器监听的端口设置,以避免与现有容器冲突。有时,如果程序需要更多资源来处理繁重的工作负载,你可能想增加容器可用的内存,或者设置环境变量以提供程序运行所需的特定配置信息。

docker run 命令提供了一种强大的方式来覆盖这些默认设置并根据你的喜好定制容器的行为。该命令提供了多个标志,可以让你在运行时自定义容器行为。

覆盖网络端口

有时你可能想为开发和测试目的使用不同的数据库实例。在同一端口上运行这些数据库实例可能会发生冲突。你可以使用 docker run 中的 -p 选项将容器端口映射到主机端口,从而允许你运行多个实例而不会发生冲突。

docker run -d -p 主机端口:容器端口 postgres

设置环境变量

这个选项在容器内部设置一个值为 bar 的环境变量 foo

docker run -e foo=bar postgres env

你会看到如下输出:

HOSTNAME=2042f2e6ebe4
foo=bar

提示

.env 文件是一种方便的方法,可以为你的 Docker 容器设置环境变量,而不会使命令行中充满多个 -e 标志。要使用 .env 文件,你可以在 docker run 命令中传递 --env-file 选项。

docker run --env-file .env postgres env

限制容器资源使用

你可以使用 docker run 命令的 --memory--cpus 标志来限制容器的 CPU 和内存使用。例如,你可以为 Python API 容器设置内存限制,防止它在主机上消耗过多资源。以下是命令:

docker run -e POSTGRES_PASSWORD=secret --memory="512m" --cpus="0.5" postgres

此命令将容器的内存使用限制为 512 MB,并定义 0.5 核心的 CPU 配额。

监控实时资源使用情况

你可以使用 docker stats 命令监控运行容器的实时资源使用情况。这有助于你了解分配的资源是否足够或需要调整。

通过有效使用这些 docker run 标志,你可以根据具体需求调整容器化应用程序的行为。

试一试

在指南中,你将看到如何使用 docker run 命令覆盖容器默认设置。

下载并安装 Docker Desktop

运行多个 Postgres 数据库实例

使用以下命令启动一个 Postgres 镜像的容器:

docker run -d -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres

这将在后台启动 Postgres 数据库,监听标准容器端口 5432,并映射到主机的5432端口。

启动映射到不同端口的第二个Postgres 容器。

docker run -d -e POSTGRES_PASSWORD=secret -p 5433:5432 postgres

这将在后台启动另一个 Postgres 容器,监听容器中的标准 postgres 端口 5432,但映射到主机的 5433 端口。你覆盖了主机端口,以确保新容器不会与现有运行的容器冲突。

通过访问 Docker Dashboard 的容器视图验证两个容器是否都在运行。

在受控网络中运行 Postgres 容器

默认情况下,当你运行容器时,它们会自动连接到一个名为 bridge 的特殊网络。这个bridge网络像虚拟桥一样运行,允许同一主机上的容器相互通信,同时将它们与外界和其他主机隔离。对于大多数容器交互来说,这是一个方便的起点。然而,对于特定场景,你可能需要对网络配置有更多控制。

这时,自定义网络就派上用场了。你可以通过在 docker run 命令中传递 --network 标志来创建自定义网络。所有没有指定 --network 标志的容器都连接到默认的 bridge 网络。

按照以下步骤,将 Postgres 容器连接到自定义网络。

通过以下命令创建一个新的自定义网络:

docker network create mynetwork

使用以下命令验证网络:

docker network ls

此命令会列出所有网络,包括新创建的 "mynetwork"

通过以下命令将 Postgres 连接到自定义网络:

docker run -d -e POSTGRES_PASSWORD=secret -p 5434:5432 --network mynetwork postgres

这将在后台启动Postgres 容器,映射到主机端口 5434,并连接到 mynetwork 网络。你传递了 --network 参数,通过将容器连接到自定义 Docker 网络来覆盖容器默认设置,以便更好地隔离和与其他容器通信。你可以使用 docker network inspect 命令查看容器是否连接到这个新 bridge 网络。

默认 bridge 和自定义网络的关键区别

  • DNS 解析:默认情况下,连接到默认 bridge 网络的容器可以通过 IP 地址互相通信(除非你使用 --link 选项,这被认为是遗留的)。由于各种技术缺陷,不建议在生产中使用。在自定义网络上,容器可以通过名称或别名解析彼此。
  • 隔离:所有未指定 --network 的容器都连接到默认 bridge 网络,因此存在风险,因为不相关的容器可以互相通信。使用自定义网络提供了一个范围网络,只有连接到该网络的容器能够通信,从而提供更好的隔离。

管理资源

默认情况下,容器的资源使用没有限制。然而,在共享系统上,有效地管理资源至关重要。重要的是不要让运行的容器消耗主机机器过多的内存。

这就是 docker run 命令再次发挥作用的地方。它提供了 --memory--cpus 等标志,用于限制容器可以使用的 CPU 和内存量。

docker run -d -e POSTGRES_PASSWORD=secret --memory="512m" --cpus=".5" postgres

--cpus 标志为容器指定了 CPU 配额。在这里,它设置为半个 CPU 核心(0.5),而 --memory 标志为容器指定了内存限制。在本例中,它设置为 512 MB。

Docker Compose 中覆盖默认的 CMDENTRYPOINT

有时,你可能需要覆盖 Docker 镜像中定义的默认命令(CMD)或入口点(ENTRYPOINT),特别是在使用 Docker Compose 时。

创建一个包含以下内容的 compose.yml 文件:

services:postgres:image: postgresentrypoint: ["docker-entrypoint.sh", "postgres"]command: ["-h", "localhost", "-p", "5432"]environment:POSTGRES_PASSWORD: secret 

Compose 文件定义了一个名为 postgres 的服务,使用官方 Postgres 镜像,设置了入口点脚本,并以密码认证启动容器。

通过运行以下命令启动服务:

docker compose up -d

此命令启动 Docker Compose 文件中定义的 Postgres 服务。

通过 Docker Dashboard 验证认证。

打开 Docker Dashboard,选择 Postgres 容器并选择 Exec 进入容器 shell。你可以输入以下命令连接到Postgres数据库:

psql -U postgres

注意

PostgreSQL 镜像本地设置了信任认证,因此当从本地(同一容器内部)连接时,你可能会注意到不需要密码。然而,如果从不同的主机/容器连接,则需要密码。

使用 docker run 覆盖默认的 CMD ENTRYPOINT

你也可以直接使用 docker run 命令覆盖默认设置:

docker run -e POSTGRES_PASSWORD=secret postgres docker-entrypoint.sh -h localhost -p 5432

此命令运行一个 Postgres 容器,设置密码认证的环境变量,覆盖默认启动命令,并配置主机名和端口映射。

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

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

相关文章

UnityShader SDF有向距离场简单实现

UnityShader SDF有向距离场简单实现 前言项目场景布置连连看画一个圆复制一个圆计算修改shader参数 鸣谢 前言 突然看到B站的一个教程,还不错,记录一下 项目 场景布置 使用ASE连连看,所以先要导入Amplify Shader Editor 连连看 画一个…

面试-JMM的内存可见性

1.JAVA内存模型 分析: 由于JVM运行程序的实体是线程,而每个线程创建时,JVM都会 为其创建一个工作内存(栈空间),用于存储线程私有的数据。而java内存模型中规定所有变量都存储在主内存中。主内存是共享内存区域,所有线程都可以访问…

Python-PDF文件密码破解小工具

背景 经常从网络上下载的PDF笔记被加了密,在自己学习的过程中想要添加书签却因为没有密码无法添加,所以通过Python实现一个解密小工具,亲测大多数密码都可以破解。 代码 import os import tkinter as tk from tkinter import filedialog #…

你还不知道Modbus RTU???

1. 什么是Modbus RTU Modbus RTU(Remote Terminal Unit)是Modbus通信协议的一种变种,用于串行通信。它是一种常见的工业控制系统通信协议,通常用于采集传感器数据、控制执行器和监控设备状态。Modbus RTU采用二进制编码&#xff0…

基于ruoyi-app的手机短信登录(uniapp)

本篇用于记录h5的框架搭建 组件地址:短信验证码登陆&#xff0c;手机号&#xff0c;验证码倒计时 - DCloud 插件市场 调整后的表单组件代码: <template><view class"login-view"><!-- <input type"tel" confirm-type"确认"…

073、类的三大特征初识

&#xff08;1&#xff09;继承 类之间可以通过继承建立父子关系&#xff0c;子类可以继承父类的属性和方法&#xff0c;并可以添加自己的特定属性和方法。如下是一个简单示例&#xff1a; class Student(Person):def __init__(self, name, age, student_id):super().__init_…

Follow Carl To Grow|【LeetCode】93.复原IP地址,78.子集,90.子集II

【LeetCode】93.复原IP地址 题意&#xff1a;有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址&…

【深度学习】实现基于MNIST数据集的TensorFlow/Keras深度学习案例

基于TensorFlow/Keras的深度学习案例 实现基于MNIST数据集的TensorFlow/Keras深度学习案例0. 什么是深度学习&#xff1f;1. TensorFlow简介2. Keras简介3. 安装TensorFlow前的注意事项4. 安装Anaconda3及搭建TensorFlow环境1&#xff09; 下载安装Anaconda Navigator2&#xf…

go语言day06 数组 切片

数组 : 定长且元素类型一致,在索引逻辑上连续存储,数组的内存地址是存储的第一个元素的内存地址 几种创建方式: 仅声明 var nums [ 3 ] int 声明并赋值 var nums [ 2 ] string {"武沛齐","alex"} 声明并按下标赋值 var nums [ 3 ] int {0:88,2:1 } 省略…

ffmpeg+nginx+video实现rtsp流转hls流,web页面播放

项目场景&#xff1a; 最近调试海康摄像头需要将rtsp流在html页面播放,因为不想去折腾推拉流&#xff0c;所以我选择ffmpeg转hls流&#xff0c;nginx转发&#xff0c;html直接访问就好了 1.首先要下载nginx和ffmpeg 附上下载地址&#xff1a; nginx nginx news ffmpeg htt…

HttpServletRequest・getContentLeng・getContentType区别

getContentLength()&#xff1a; 获取客户端发送到服务器的HTTP请求主体内容的字节数&#xff08;长度&#xff09; 如果请求没有正文内容&#xff08;如GET&#xff09;&#xff0c;或者请求头中没有包含Content-Length字段&#xff0c;则该方法返回 -1 getContentType()&am…

eclipse中svn从分支合并到主干及冲突解决

1、将分支先commit&#xff0c;然后再update&#xff0c;然后再clean一下&#xff0c;将项目多余的target都清理掉。 2、将branches切换到trunk 3、工程上右键-》Team-》合并&#xff08;或Merge&#xff09; 4、默认选项&#xff0c;点击Next 5、有未提交的改动&#xff0c;…

文献阅读:通过双线性建模来破译神经元类型连接的遗传密码

文献介绍 文献题目 Deciphering the genetic code of neuronal type connectivity through bilinear modeling 研究团队 Mu Qiao&#xff08;美国加州理工学院&#xff09; 发表时间 2024-06-10 发表期刊 eLife 影响因子 7.7 DOI 10.7554/eLife.91532.3 摘要 了解不同神经元…

打造爆款秘籍:阿里巴巴国际站测评补单优势全攻略

在阿里巴巴国际站&#xff0c;买家复购率和其他销售指标是衡量产品市场潜力和销售成功与否的关键指标。当系统评估出产品具有巨大的市场潜力时&#xff0c;它会相应地增加对产品的流量支持&#xff1b;反之&#xff0c;如果潜力不足&#xff0c;产品的排名将会受到影响&#xf…

Node官网下载各个版本

node官网下载各个版本地址 例如 14.16.0 Index of /download/release/v14.16.0/

使用 Spring Boot 3.x 与图形学技术,添加电子印章防伪特征

使用 Spring Boot 3.x 与图形学技术,添加电子印章防伪特征 在电子办公和无纸化办公日益普及的今天,电子印章的使用越来越广泛。然而,如何确保电子印章的安全性和防伪能力成为了一个亟待解决的问题。本文将通过 Spring Boot 3.x 和图形学技术,深入探讨如何为电子印章添加防…

Redis-实战篇-什么是缓存-添加redis缓存

文章目录 1、什么是缓存2、添加商户缓存3、前端接口4、ShopController.java5、ShopServiceImpl.java6、RedisConstants.java7、查看Redis Desktop Manager 1、什么是缓存 缓存就是数据交换的缓冲区&#xff08;称为Cache&#xff09;&#xff0c;是存贮数据的临时地方&#xff…

MATLAB--矩阵()

文章目录 前言概念矩阵构造 前言 MATLAB作为数学软件计算软件&#xff0c;对于数学运算的性能十分优越&#xff0c;本文作为MATLAB记录关于在MATLAB中关于矩阵的知识。如有错误&#xff0c;还望指正。 概念 在数学上矩阵的定义&#xff1a;由m*n个aij(i1,2…… ,m;j1,2……,…

C# 实战-三种类型的Timer

在C#中&#xff0c;主要有三种类型的Timer&#xff1a; System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer 以下是每种Timer的简要说明和示例&#xff1a; 1. System.Windows.Forms.Timer 用于Windows Forms应用程序&#xff0c;适合在UI线程中使用。…

【C++ Primer Plus学习记录】函数的基本知识

要使用C函数&#xff0c;必须完成如下工作&#xff1a; 提供函数定义 提供函数原型 调用函数 1.定义函数 可以将函数分为两类&#xff1a;没有返回值的函数和有返回值的函数。 没有返回值的函数被称为void函数&#xff0c;其通用格式如下&#xff1a; void functionName…