docker基础(五)之docker run(第二弹)

文章目录

概述

用于学习和记录,以下内容来自chatgpt3.5,网络等,补充例子。

本文介绍了docker run的基础用法,及这些options的详细解释和例子。包括 -h,-e,--env-file,--cpuset, -m, --net, --link, --expose,--volume,-v

docker系列其他文章:docker专栏

由于内容比较多,分为两篇博文,本文只对部分options进行详细说明,其他选项说明可以查看:
docker基础(四)之docker run(第一弹)

其他相关:
docker基础(六)之docker create和docker exec

docker run

语法

复制代码
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run 创建一个新的容器并运行一个命令

命令选项用法速查

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • --name="nginx-lb: 为容器指定一个名称;
  • --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h "mars": 指定容器的hostname;
  • -e username="ritchie": 设置环境变量;
  • --env-file=[]: 从指定文件读入环境变量;
  • --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container 四种类型;
  • --link=[]: 添加链接到另一个容器;
  • --expose=[]: 开放一个端口或一组端口;
  • --volume , -v: 绑定一个卷

OPTIONS说明:

-h "mars"

指定容器的hostname;
-h 参数用于指定容器的主机名(hostname)。通过指定主机名,你可以在容器内部设置自定义的标识符(hostname),这对于在容器内部执行一些需要主机名的操作(比如与其他系统进行通信)是非常有用的。

不指定主机名的话,Docker会自动生成一个随机的主机名,这个名称通常是一个由随机字符组成的唯一标识符。 在绝大多数情况下,这并不会对容器的功能产生影响,因为大多数应用并不依赖于主机名。

但是如果你希望在容器内使用一个特定的主机名,或者是为了方便识别和管理容器,那么最好明确地使用-h参数来指定主机名。

当你运行一个容器,并使用-h参数来指定主机名时,你可以这样做:

复制代码
docker run -d -h mars my_image

在这个例子中,我们使用-h参数明确指定了容器的主机名为"mars"。这意味着当这个容器内部执行需要使用主机名的操作时,如与其他系统进行通信或进行网络服务发现时,它将会使用指定的主机名。

例如,如果容器内部的应用需要知道自己的主机名,它将会返回"mars"这个主机名。

这对于一些需要依赖主机名的应用场景是有用的,同时也能够方便你在容器群中识别和管理各个容器。

-e username="ritchie"

设置环境变量;

--env-file=[]

从指定文件读入环境变量

当你使用--env-file 参数时,你可以通过一个文件来传递环境变量给容器。这可以通过一个名为env.list的文件,其内容如下:

复制代码
DB_HOST=hostname
DB_USER=user
DB_PASS=password

然后,你可以运行以下命令:

复制代码
docker run --env-file=env.list my_image

这样,Docker 将会从 env.list 文件中读取环境变量的配置,并将这些环境变量应用到运行的容器中。这种方法可以让你集中管理多个环境变量的配置,而不必每次运行容器都手动指定这些变量。这对于在多个容器中共享相同的环境变量配置特别有用。

拓展:

为什么 env.list ,拓展名是.list

.list 文件其实是一个随意命名的文本文件,它不需要特定的后缀名来起作用。上面的例子中,文件名使用.list 后缀名只是为了表示这是一个包含环境变量的文件,但实际上并没有具体的规定要求使用.list 作为后缀。

因此,这些文件的内容其实就是一组环境变量的键值对。示例可能如下所示:

文件名:source.list

复制代码
HOSTNAME=example.com
PORT=8080

文件名:env.list

复制代码
DB_HOST=hostname
DB_USER=user
DB_PASS=password

在这些文件中,你可以包含各种需要的环境变量,每行一个,以键值对的形式表示。然后通过 --env-file 参数将这些环境变量应用到 Docker 容器中。

那命名为env.txt 是否能使用--env-file识别呢

是的,命名为env.txt的文件同样可以使用--env-file参数进行识别。**Docker并不依赖于文件名称的后缀来识别环境变量文件,它只关心文件中包含的环境变量的键值对格式。**因此,当你运行以下命令时:

复制代码
docker run --env-file=env.txt my_image

Docker将会从env.txt文件中读取环境变量的配置,并将这些环境变量应用到运行的容器中。所以,你可以使用各种扩展名来命名你的环境变量文件,只要文件的内容符合.env文件的格式即可。

同理可得sources.list,sources.list.backup 文件名中包含 .backup 后缀,这表明它可能是系统配置文件的备份。通常情况下,.backup 后缀被认为是备份文件的一种常见命名约定

--cpuset="0-2" or --cpuset="0,1,2"

绑定容器到指定CPU运行;

-m

设置容器使用内存最大值;

--net="bridge"

指定容器的网络连接类型,支持 bridge/host/none/container 四种类型;

复制代码
docker run --net=bridge my_image

下面是对每个网络连接类型的用法示例:

  1. bridge :这是默认的网络连接类型它使容器连接到 Docker 守护程序的网桥网络上。这使得容器可以与 Docker 守护程序所在主机上的其他容器进行通信。

示例:

复制代码
docker run --net=bridge my_image
  1. host使用主机的网络栈这意味着容器可以访问宿主机的所有网络接口和端口 。这种网络模式对于需要与宿主机共享网络命名空间的情况非常有用。

示例:

复制代码
docker run --net=host my_image
  1. none禁用网络连接 ,这样容器将不会被连接到任何网络上。这种网络模式适用于一些特定的安全性要求或者只需要本地访问的场景

示例:

复制代码
docker run --net=none my_image
  1. container共享另一个容器的网络栈 。这使得两个容器可以直接通过 localhost 相互通信。这对于需要在两个容器之间建立本地通信的场景非常有用

示例:

复制代码
docker run --net=container:container_name my_image

以上例子中的 my_image 是你要运行的容器的镜像名称,你可以根据自己的实际情况进行替换。

--link=[]

添加链接到另一个容器;
--link=[container_name:alias] 将当前容器链接到另一个容器,并设置别名(alias)来访问另一个容器。

举例:

--link=db_container:db_alias 将当前容器链接到名为db_container的容器,并设置别名为db_alias,这样可以在当前容器中通过db_alias来访问db_container容器

--expose=[]

开放一个端口或一组端口;
--expose=[] 用来在容器中开放一个或多个端口,使其可以被外部访问。

举例:
--expose=80 开放容器中的80端口,使其可以被外部访问。
--expose=8080-8090 开放容器中的8080至8090端口范围,使其可以被外部访问。

--volume , -v

绑定一个卷

--volume, -v

用于在容器中绑定一个卷,将主机的目录或文件与容器内的目录或文件进行关联。

举例:

将主机目录绑定到容器内目录

复制代码
-v /host/directory:/container/directory

将主机的 /host/directory 目录绑定到容器内的 /container/directory 目录。

将主机文件绑定到容器内的文件

复制代码
-v /host/file:/container/file

将主机上的文件/host/file绑定到容器内的/container/file文件。

这个命令的作用是将主机的目录或文件与容器内的目录或文件进行关联。这样可以实现将数据或文件从主机传递到容器,或者将容器内的数据或文件保存到主机上。这在容器的持久化存储和数据共享方面非常有用。

假设你有一个 Web 服务器的容器需要访问主机上的静态网页文件,可以使用 -v 参数来将主机上存放网页文件的目录与容器中的目录进行绑定。

例如:

复制代码
docker run -v /host/web-content:/container/web-content -p 80:80 my-web-server

这将会将主机上的 /host/web-content 目录和容器内的/container/web-content目录进行绑定,实现了主机和容器之间的文件共享。

和共享文件夹的关系

是的,这种方式类似于共享文件夹的概念。当你在容器中使用 -v 参数绑定一个卷时,主机上的目录或文件就会被映射到容器内部,使得它们可以进行数据共享和访问。这类似于共享文件夹的概念,在主机和容器之间共享数据或文件。

扩展

使用docker run创建容器时,docker在后台做了什么?

当使用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止
相关推荐
用户0328472220702 小时前
如何搭建本地yum源(上)
运维
武子康4 小时前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn863 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造