Docker教程
视频学习地址:
【资料图】
什么是Docker
Docker是一种开源的容器化平台,用于帮助开发者更轻松地打包、分发和运行应用程序。它通过使用操作系统级虚拟化技术,将应用程序及其所有依赖项打包到称为"容器"的独立运行环境中。这些容器可以在不同的系统上运行,而无需担心环境差异和依赖冲突。
Docker的核心概念是镜像(Image)和容器(Container):
镜像是一个只读的文件,包含了运行应用程序所需的所有文件系统、库和依赖项。它可以被认为是一个应用程序的模板。
容器是镜像的运行实例,可以被启动、停止、删除等。每个容器都是相互隔离的、独立运行的环境,具有自己的文件系统、进程空间、网络配置等。
使用Docker可以带来许多优势:
简化部署:Docker允许开发人员将应用程序和其依赖项打包到一个独立的、可移植的容器中,使得部署变得非常简单和一致。
跨平台:Docker容器可以在不同的操作系统和硬件平台上运行,无需担心环境差异和依赖问题。
高效资源利用:Docker使用操作系统级虚拟化技术,可以在主机上同时运行多个容器,以更高效地利用硬件资源。
快速开发和测试:容器的轻量级和快速启动能力使得开发人员可以快速创建、修改和测试应用程序。
总的来说,Docker是一个强大的工具,可以帮助开发者简化应用程序的交付和运行,提高开发效率和系统的可移植性。
配置环境
版本
镜像源(加速下载)
北京大学镜像源
/Mirrors
方式一:通过命令替换
sudo wget /repoconfig/ -O /etc/apt/
方式二:修改镜像源头位置。
gedit /etc/apt/
粘贴下面内容并保存。
deb /ubuntu hirsute main restricted universe multiverse# deb-src /ubuntu hirsute main restricted universe multiversedeb /ubuntu hirsute-updates main restricted universe multiverse# deb-src /ubuntu hirsute-updates main restricted universe multiversedeb /ubuntu hirsute-backports main restricted universe multiverse# deb-src /ubuntu hirsute-backports main restricted universe multiversedeb /ubuntu hirsute-security main restricted universe multiverse# deb-src /ubuntu hirsute-security main restricted universe multiverse## Uncomment the following two lines to add software from Canonical's## 'partner' repository.## This software is not part of Ubuntu, but is offered by Canonical and the## respective vendors as a service to Ubuntu users.# deb /ubuntu hirsute partner# deb-src /ubuntu hirsute partner
更新软件包列表
sudo apt update
升级软件包到最新版
sudo apt upgrade
安装
删除已经安装的docker
sudo apt-get remove docker docker-engine containerd runc
安装依赖
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
添加Docker官方GPG密钥
curl -fsSL /docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/
添加软件仓库
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/] /docker-ce/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/ > /dev/null
更新安装包
sudo apt-get update
安装docker社区版本(免费)
sudo apt-get update
检查安装状态
sudo systemctl status docker
返回结果
● - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/; enabled; vendor preset: enabled) Active: active (running) since Mon 2021-09-20 10:18:47 UTC; 2 weeks 0 days agoTriggeredBy: ● Docs: Main PID: 891 (dockerd) Tasks: 8 Memory: CGroup: / └─891 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/ 20 10:18:47 ubuntu systemd[1]: Started Docker Application Container Engine.
Loaded
:显示 Docker 服务的配置文件位置。
Active
:显示 Docker 服务是否正在运行。
Main PID
:显示 Docker 守护进程(dockerd)的进程 ID。
Memory
:显示 Docker 服务当前的内存使用情况。
CGroup
:显示 Docker 服务运行在的控制组(CGroup)。
在示例输出中,Active
字段的值为 active (running)
,表示 Docker 服务正在运行。如果状态为 inactive
,表示 Docker 服务未运行。
验证docker安装
docker run hello-world
镜像
镜像加速
网易docker加速器
创建docker配置文件
sudo gedit /etc/default/docker
修改docker配置文件
DOCKER_OPTS="--registry-mirror="
重启服务
systemctl daemon-reloadsystemctl restart docker
方法2
$ sudo echo "DOCKER_OPTS=\"--registry-mirror=\"" >> /etc/default/docker$ service docker restart
方法3
gedit /etc/docker/{"registry-mirrors":[""]}
镜像列表
docker images
返回结果
REPOSITORY
:镜像的仓库名称。这通常是Docker镜像的名称,如ubuntu
、nginx
等。
TAG
:镜像的标签。标签是用于区分不同版本或变体的附加标识符。例如,latest
、等。
IMAGE ID
:镜像的唯一标识符。每个镜像都有一个唯一的ID,它由Docker生成。
CREATED
:镜像创建的时间。它显示了镜像的创建日期和时间。
SIZE
:镜像的大小。以字节、千字节(KB)、兆字节(MB)等形式表示。
下载
docker pull [镜像名]
删除
docker rmi [镜像名]
容器
获取
下载官方案例
docker pull hello-world
下载Ubuntu镜像
docker pull ubuntu
启动
启动Ubuntu容器
docker run -it ubuntu /bin/bash
docker run
是 Docker 命令,用于在容器中运行一个新的进程。
-it
参数使得容器中的标准输入(stdin)保持打开状态,并分配一个伪终端(tty)。这样,我们就可以与容器进行交互了。
ubuntu
是要运行的容器镜像的名称。在这种情况下,我们选择了 Ubuntu 操作系统的官方镜像。
/bin/bash
是要在容器中运行的命令,即进入容器的 bash 终端。
这个命令的作用是在一个新的容器中启动 Ubuntu 操作系统,并打开一个交互式 bash 终端,以便您可以在容器中执行各种操作和命令。
伪终端(tty)是一个模拟终端设备的软件实现。它允许用户与计算机进行交互,就像在物理终端上一样。当在容器中使用-it
参数时,Docker会为容器提供一个伪终端,使得我们可以通过标准输入(stdin)与容器进行交互。
伪终端在容器中的作用类似于用户与计算机交互的终端或命令行界面。它允许我们在容器中输入命令、运行程序,并在终端中查看程序的输出。通过交互式终端,我们可以像在实际操作系统中一样,与容器中运行的程序进行交互。
停止
列出所有的容器,包括正在运行的和已经停止的容器。
docker ps -a
docker
是 Docker 命令的前缀。
ps
是 Docker 命令,用于列出容器的信息。
-a
参数用于显示所有的容器,包括正在运行的和已经停止的容器。
该命令的作用是显示所有的容器的信息,包括容器的 ID、状态、创建时间、镜像名称、对外映射的端口等。通过执行 docker ps -a
命令,您可以查看系统中所有容器的状态,包括已经停止的容器,以便进行管理或进一步操作。
停止一个容器
docker stop [容器 ID]
docker
是 Docker 命令的前缀。
stop
是 Docker 命令,用于停止容器的运行。
[容器 ID]
是要停止的容器的唯一标识符。
该命令的作用是停止正在运行的容器。当执行 docker stop [容器 ID]
命令后,Docker 会向指定的容器发送停止信号(SIGTERM),容器会收到该信号并进行相应的处理。如果容器没有在一定时间内响应停止信号,Docker 会发送强制停止信号(SIGKILL)。停止容器后,容器中运行的进程会被终止,并释放相应的系统资源。
注意:请将 [容器 ID]
替换为实际要停止的容器的 ID。您可以使用 docker ps
命令查看容器的 ID。
启动一个容器
docker start [容器 ID]
docker
是 Docker 命令的前缀。
start
是 Docker 命令,用于启动容器的运行。
[容器 ID]
是要启动的容器的唯一标识符。
该命令的作用是启动已经停止的容器。当执行 docker start [容器 ID]
命令后,Docker 会尝试重新启动指定的容器。容器会使用原先的配置和状态恢复运行。需要注意的是,只有处于停止状态的容器才能被启动。
通过执行 docker start [容器 ID]
命令,您可以重新启动已经停止运行的容器,使其继续运行。这样可以方便地管理容器,避免每次都需要重新创建容器。
注意:请将 [容器 ID]
替换为实际要启动的容器的 ID。您可以使用 docker ps -a
命令查看所有容器的 ID。
重启一个容器
docker restart [容器 ID]
docker
是 Docker 命令的前缀。
restart
是 Docker 命令,用于重启容器的运行。
[容器 ID]
是要重启的容器的唯一标识符。
该命令的作用是停止并重新启动指定容器。执行 docker restart [容器 ID]
命令后,Docker 会先发送停止信号(SIGTERM)给指定的容器,然后等待一段时间后,再发送启动信号,重新启动容器。这个过程相当于先执行了 docker stop [容器 ID]
命令,再执行了 docker start [容器 ID]
命令。
通过执行 docker restart [容器 ID]
命令,您可以方便地重启运行中的容器,使其重新加载配置或应用程序的更新,或应用其他更改。
注意:请将 [容器 ID]
替换为实际要重启的容器的 ID。您可以使用 docker ps
命令查看运行中的容器的 ID。
进入
进入方式一
docker exec -it [容器 ID] /bin/bash
docker
是 Docker 命令的前缀。
exec
是 Docker 命令,用于在容器内部执行命令。
-it
是 docker exec
命令的选项,将命令绑定到交互式的终端。
[容器 ID]
是要进入的容器的唯一标识符。
/bin/bash
是要在容器内执行的命令,此处是指定进入容器并打开一个交互式的 Bash Shell。
该命令的作用是进入指定容器的内部,并在容器内部打开一个交互式的 Bash Shell。通过执行 docker exec -it [容器 ID] /bin/bash
命令,您可以在容器内部执行命令、调试、配置和管理容器。
注意:请将 [容器 ID]
替换为实际要进入的容器的 ID。您可以使用 docker ps
命令查看运行中的容器的 ID。
进入容器后,您可以像在本地计算机的终端中一样使用 Bash Shell,执行任意命令、查看容器内部的文件系统、修改配置等。这个功能非常有用,尤其在调试容器或执行一些特定任务时。
进入方式二
docker attach [容器 ID]
docker -it和-d不可以同时使用
docker一共有两种模式,交互模式和守护进程模式(或后台模式)。
交互模式
-it
选项用于创建一个交互式的终端会话,可以与容器进行交互,类似于在本机操作系统中打开一个终端窗口并连接到容器。当您退出终端会话时,容器也会停止。
守护进程模式(或后台模式)
-d
选项用于将容器置于后台运行模式,也称为守护进程模式或分离模式。容器将在后台运行,不会附加到当前终端会话。当您退出终端会话时,容器将继续在后台运行。
因此,您需要根据自己的需求选择使用-it
选项或-d
选项。如果您需要与容器进行交互并查看输出,可以使用-it
选项。如果您只想在后台运行容器而不需要交互,可以使用-d
选项。
刚启动容器就关闭
主要原因:后台没有进程运行
通过日志查看是否正常关闭。
docker logs [容器ID]
如果没有内容返回,则是刚启动因为没有进程运行,就自动关闭了。
查看容器状
docker ps -a Exited (0)
如果容器的状态显示为 Exited (0)
,这表示容器已正常退出,并且退出代码为 0。
如果"Status"字段显示为"exited",并且"ExitCode"字段为非零值,那么容器可能是由于执行的命令或应用程序发生错误而停止。
退出
请使用 exit
命令或 Ctrl + D
组合键来退出容器。
使用"exit"命令退出容器: 当您在容器的命令行中输入"exit"命令并按下回车键时,该命令会告诉容器中的主要进程以正常的方式退出,并终止容器。这相当于在容器内部执行了一个退出指令,这将关闭容器并结束容器的生命周期。
使用"Ctrl+D"组合键退出容器: 在容器的命令行中,按下"Ctrl+D"组合键,这将模拟输入文件的结尾(EOF字符),导致终端会话结束。对于大多数交互式终端,这相当于发送了一个信号(SIGQUIT)给容器中的主要进程,要求它退出。容器中的主要进程收到这个信号后,将会先处理自己的退出逻辑,然后自行退出。这样也会导致容器的终止和生命周期结束。
总的来说,"exit"命令是直接在容器内部执行的指令,而"Ctrl+D"是通过发送信号的方式请求容器内的主要进程退出。无论使用哪种方式,容器的退出和生命周期的结束都是相同的。
退出容器,同时不关闭容器
使用"Ctrl+P"组合键。
使用"Ctrl+Q"组合键。
按下Ctrl + p,然后按下 q
Ctrl + P:从容器终端中分离,保持容器在后台运行。 Ctrl + Q:分离(退出)容器终端,但保持容器继续在后台运行。 这两个组合键通常在交互式模式下使用,用于在保持容器运行的同时退出容器终端,以便在后续需要时重新附加到容器终端。
小提示
由于我现在案例中的是Ubuntu镜像容器,它本身里面没有任何进程在运行,因此我们使用-d参数会出现刚启动就自动关闭了。
如果我们有项目在容器内运行,启动容器后,就不会自动关闭。
导出
首先,确保您的容器正在运行。您可以使用 docker ps
命令查看正在运行的容器列表。
执行以下命令导出容器:
docker export [容器 ID] >
其中,[容器 ID]
是要导出的容器的 ID,是导出的容器文件的名称。您可以自定义
的名称和路径。
注意:导出的容器将被压缩为单个 tar 文件。
导出完成后,您可以使用 ls
命令确认导出的文件是否创建成功。
现在,您已经成功地导出了 Docker 容器。您可以将这个导出的文件(tar 文件)传输到其他机器上,并通过docker import
命令导入到 Docker 中,以创建相同的容器。或者,您可以在需要时保留该文件作为容器的备份。
导入
首先,将包含要导入的容器的镜像文件(tar 文件)传输到目标机器上。
在目标机器上执行以下命令导入容器:
docker import [新镜像名称]
其中,是包含要导入的容器的 tar 文件,
[新镜像名称]
是为新镜像指定的名称。您可以自定义 [新镜像名称]
。
注意:导入的容器将被作为一个新的镜像创建。
导入完成后,您可以使用 docker images
命令查看导入的镜像是否创建成功,并显示其相关的信息。
现在,您已经成功地将 Docker 容器导入为一个新的镜像。您可以使用这个新镜像创建和运行新的容器。
删除
普通删除
首先,使用 docker ps -a
命令查看所有的容器,包括已停止的容器。
找到要删除的容器的 ID 或名称。
执行以下命令删除容器:
docker rm [容器 ID 或名称]
其中,[容器 ID 或名称]
是要删除的容器的 ID 或名称。您可以根据需要选择使用容器的 ID 或名称。
注意:删除容器将永久删除容器及其关联的数据。
您可以使用 docker ps -a
命令再次验证容器是否已成功删除。
现在,您已经成功地删除了 Docker 容器。请注意,删除容器后,与该容器关联的数据也将被永久删除。
强制删除容器
docker rm -f [容器 ID 或名称]
可以实现停止正在运行的容器,并卸载,减去手动停止容器的步骤。
批量强制删除所有容器
docker rm -f $(docker ps -aq)
docker ps -aq
:这个命令将列出所有容器的ID,选项-a
用于显示所有容器,而选项-q
用于只显示容器的ID。
docker rm -f
:这个命令将强制删除指定的容器。选项-f
用于强制删除容器,即使容器正在运行中。
通过将这两个命令结合起来,并使用子命令$(...)
将第一个命令的输出作为第二个命令的参数,我们可以批量删除所有容器。
查看状态
列出所有的容器,包括正在运行的和已经停止的容器。
docker ps -a
docker
是 Docker 命令的前缀。
ps
是 Docker 命令,用于列出容器的信息。
-a
参数用于显示所有的容器,包括正在运行的和已经停止的容器。
该命令的作用是显示所有的容器的信息,包括容器的 ID、状态、创建时间、镜像名称、对外映射的端口等。通过执行 docker ps -a
命令,您可以查看系统中所有容器的状态,包括已经停止的容器,以便进行管理或进一步操作。
下载
打开终端或命令行窗口。
在终端或命令行中,输入以下命令来下载容器镜像:
docker pull [镜像名称]
其中,[镜像名称]
是您要下载的容器镜像的名称。您可以使用 Docker 镜像仓库中的公共镜像,也可以使用自己私有的镜像。
例如,要下载官方的 Nginx 镜像,可以执行以下命令:
docker pull nginx
Docker 将从 Docker 镜像仓库中下载指定的镜像,并保存到本地。
下载的镜像将显示下载进度和状态。
完成下载后,您可以使用 docker images
命令来查看已下载的镜像列表:
docker images
该命令将显示已下载的容器镜像的列表,包括镜像的名称、版本、大小等信息。
现在,您已经成功地下载了 Docker 容器镜像。您可以根据需要,下载所需的容器镜像,并使用它们创建和运行容器。
定义容器名称
使用 --name
选项,可以在创建容器时为其指定一个可读性高的名称,方便在后续的操作中引用和管理容器。默认情况下,Docker 将为容器分配一个随机的名称。
docker run --name mycontainer nginx
上述命令会创建一个名为 "mycontainer" 的容器,并使用 "nginx" 镜像作为其基础。
网络
Docker网络是Docker容器间进行通信的网络环境。在Docker中,每个容器都有一个独立的网络栈,这样它们可以相互通信,并且与宿主机和其他容器隔离开来。
Docker提供了多种网络模式,可以根据实际需求选择适合的模式。
默认桥接网络(bridge network):这是Docker默认的网络模式。在这种模式下,所有容器连接到单个特定的网桥(default bridge)上,并被分配IP地址。默认桥接网络只允许同一主机上的容器通信。
主机网络(host network):使用主机网络模式时,容器与宿主机共享网络栈,即容器使用宿主机的网络接口,与宿主机共享IP地址。这种模式下容器可以直接使用宿主机上的端口。
自定义桥接网络(user-defined bridge network):用户可以创建自己的桥接网络并将容器连接到这个网络中。在自定义桥接网络中,容器之间可以相互通信,并且与默认桥接网络隔离开来。可以为自定义桥接网络配置子网、网关、IP地址等。
Overlay网络:Overlay网络是在多个Docker宿主机之间创建的虚拟网络,用于在跨主机的容器之间提供通信。这种网络模式适用于分布式应用程序和集群环境。
除了以上几种网络模式,Docker还支持其他网络插件和第三方工具,用于扩展网络功能和提供更高级的网络服务。
日志
docker logs [容器名称或ID]
-f
或 --follow
:实时显示日志输出,并保持连接,类似于 tail -f
命令。
--tail [行数]
:仅显示最后指定行数的日志,默认为全部日志。
-t
或 --timestamps
:显示日志的时间戳。
查看容器的实时日志:使用 docker logs -f
或 docker logs --follow
命令可以实时查看容器的日志输出。这对于观察容器的运行状态、调试问题以及监视应用程序的实时日志非常有用。
故障排查:通过查看容器的日志,您可以识别容器是否出现了异常、错误或崩溃。它可以帮助您找到容器启动失败、应用程序错误等问题的原因,从而进行相应的故障排查和修复。
记录应用程序日志:如果您的应用程序在容器内生成日志,例如日志文件或控制台输出,您可以使用 docker logs
命令来查看这些日志。这是一种方便的方式,可以从已运行的容器中获取应用程序的日志信息。
监控和分析:通过查看容器的日志,您可以监控应用程序的活动并进行分析。您可以建立监控系统,收集容器的日志数据,并进行检索、过滤、聚合和可视化等操作,以了解应用程序的性能、行为和趋势。
总而言之,docker logs
命令是在 Docker 环境中查看容器日志的主要工具,是监控、故障排查和分析容器的重要手段之一。它可以帮助您了解容器的运行状态和应用程序的日志输出。
数据卷
Docker数据卷是将宿主机上的目录或文件与容器内的目录或文件进行映射的一种机制。通过使用数据卷,可以在容器之外创建、持久化和共享数据。
使用数据卷的好处包括:
数据持久性:数据卷允许在容器终止或重新创建时保留数据。即使删除容器,数据卷仍然存在,并且可以重新挂载到新的容器中,以保留数据。
数据共享:可以通过将多个容器挂载到同一个数据卷,实现容器之间的数据共享。这使得数据在多个容器之间的传递和共享变得更加容易,无需复制或移动数据。
数据备份和恢复:通过将数据卷映射到宿主机上的特定目录,可以方便地对数据进行备份和恢复。这样即使容器或Docker环境出现故障,数据仍然安全可靠。
使用数据卷可以通过两种方式进行:
匿名数据卷:在创建容器时可以使用 -v
或 --volume
参数创建匿名数据卷,Docker将自动为其生成一个唯一的目录并与容器中指定的路径进行映射。
示例命令:docker run -v /path/in/host:/path/in/container image:tag
命名数据卷:可以使用 docker volume create
命令显式创建命名数据卷,这样可以更方便地管理和重用数据卷。
示例命令:
创建数据卷:docker volume create myvolume
挂载数据卷:docker run -v myvolume:/path/in/container image:tag
一旦数据卷创建成功并且与容器建立了映射关系,容器内的操作就会直接影响到映射的宿主机上的目录或文件。但需要注意的是,Docker数据卷是与容器关联的,一旦容器被删除,数据卷也会一起被删除。如果需要保留数据卷,可以将其挂载到另一个容器或使用 docker volume prune
命令进行清理。
端口映射
单个端口映射
docker run -p [宿主机端口]:[docker容器内部端口] ...
案例
docker run -p 8080:80 ...
这样,当你在主机上访问 http://localhost:8080
时,实际上是在访问容器内的服务。
多个端口映射
docker run -p 8080:80 -p 3000:3000 ...
这将同时将容器内的 80 端口映射到主机的 8080 端口上,以及将容器内的 3000 端口映射到主机的 3000 端口上。
Docker -p和-P区别
-p
选项的语法是-p hostPort:containerPort
,它允许你将主机的端口映射到容器的指定端口。例如,使用-p 8080:80
将主机的8080端口映射到容器的80端口。
相反地,-P
选项会自动将容器的所有公开端口映射到主机上的任意端口。Docker会随机分配一个未使用的主机端口并映射到容器的相应端口。这个选项在你不需要指定特定的主机端口时很方便。
下面是一个简单的例子来说明这两个选项的区别:
docker run -d -p 8080:80 nginx
上面的命令将在后台运行一个nginx容器,并将主机的8080端口映射到容器的80端口。
docker run -d -P nginx
而这个命令会在后台运行一个nginx容器,并自动将容器的所有公开端口映射到主机上的任意端口。
总结来说,-p
选项允许你显式地指定主机端口与容器端口的映射关系,而-P
选项则会自动随机分配主机端口并映射容器的所有公开端口。
容器互联
在 Docker 中,容器互联允许不同的容器之间进行通信和交互。通过容器互联,可以在不使用端口映射的情况下,在容器之间建立网络连接。
要实现容器互联,可以使用 Docker 的网络功能。有两种主要的网络模式可以实现容器之间的互联:桥接模式(Bridge Mode)和用户定义网络(User-defined Network)。
桥接模式
桥接模式(Bridge Mode): 桥接模式是 Docker 默认使用的网络模式。在桥接模式下,Docker 会为每个容器分配一个唯一的 IP 地址,并且容器之间可以相互访问。你可以创建多个容器并将它们加入同一个网络中,这样它们就可以通过容器名称或 IP 地址进行通信。Docker 创建的默认网络名为 bridge
。例如,可以使用以下命令创建两个容器并加入同一个网络:
docker network create my-networkdocker run --name container1 --network my-network -d image1docker run --name container2 --network my-network -d image2
在这个例子中,container1
和 container2
将加入名为 my-network
的网络,并且可以通过容器名称相互访问。
用户定义网络
用户定义网络(User-defined Network): 用户定义网络允许你创建自己的网络,并在该网络上运行容器。通过使用用户定义网络,你可以更好地管理容器之间的互联。创建用户定义网络的步骤如下:
docker network create my-networkdocker network connect my-network container1docker network connect my-network container2
在这个例子中,container1
和 container2
将加入名为 my-network
的网络。它们之间可以通过容器名称或 IP 地址进行通信。如果要从网络中删除容器,可以使用 docker network disconnect
命令。
无论是桥接模式还是用户定义网络,容器之间的通信都可以通过它们的名称或 IP 地址进行。你可以像使用普通网络一样使用容器之间的互联来建立各种通信和交互场景。
查看已经创建的网络
docker network list
该命令将列出当前系统中的所有 Docker 网络。输出结果将包含网络的名称(NAME)、唯一标识符(ID)、驱动程序(DRIVER)以及网络范围(SCOPE)等信息。
示例输出:
NETWORK ID NAME DRIVER SCOPE1a4c7f14e867 bridge bridge localdf7bd7a75196 host host local84aa34d3fdf7 none null local
其中,bridge
是 Docker 默认的桥接网络,host
是主机网络模式,none
是无网络模式。
如果想查看特定网络的详细信息,可以使用以下命令,将 <network_name>
替换为具体的网络名称:
docker network inspect <network_name>
这将在终端中显示有关该网络的详细信息,包括网络的子网、网关和连接到该网络的容器列表等。
删除网络
docker network rm [network_name]
将 "[network_name]" 替换为要删除的网络的名称。
请注意,只有当该网络没有正在运行的容器时,才能成功删除网络。如果网络仍在被使用,您需要先停止或删除使用该网络的容器,然后才能删除网络。
网络中删除容器
使用 docker network disconnect
命令将容器从网络中断开连接:
docker network disconnect [network_name] [container_id or container_name]
将 "[network_name]" 替换为要从中断开连接的网络的名称,"[container_id or container_name]" 替换为要从网络中断开连接的容器的 CONTAINER ID 或名称。
如此,您就成功将容器从指定的 Docker 网络中删除了。请注意,此操作只是将容器与网络断开连接,并不会删除容器本身。如果需要完全删除容器,请使用 docker rm
命令。
DockerFile(制作镜像)
案例制作nginx镜像
准备工作
首先,创建一个名为Dockerfile
的文件。
touch Dockerfile
2.创建配置文件
touch nginx;worker_processes auto;error_log /var/log/nginx/ notice;pid /var/run/;events { worker_connections 1024;}http { include /etc/nginx/; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/ main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx//*.conf; include /etc/nginx/sites-enabled/*;}
3.创建网页源代码文件
touch <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>沧桑docker教程</title> </head> <body> <p>作者:沧桑</p> <p>哔哩哔哩平台</p> <p>搜索UID:507560163</p> <p>经常拍摄电脑编程、软件等知识分享</p> </body></html>
制作镜像
1.在Dockerfile
文件中,使用以下内容来定义镜像构建过程:
# 使用Nginx官方的基础镜像FROM nginx:latest# 将本地的自定义 Nginx 配置文件复制到容器中COPY /etc/nginx/# 将本地的网站文件复制到容器中的默认 Nginx 网站目录COPY /usr/share/nginx/html# 定义容器启动时需要暴露的端口EXPOSE 80# 在容器启动时运行 NginxCMD ["nginx", "-g", "daemon off;"]
在这个例子中,我们使用了nginx:latest
作为基础镜像。然后,我们将我们自定义的Nginx配置文件()复制到容器的
/etc/nginx/
目录下,将网站文件复制到容器的默认Nginx网站目录(/usr/share/nginx/html
)下。我们还通过EXPOSE
命令暴露了容器的80端口,并使用CMD
命令指定在容器启动时运行Nginx。
2.在同一目录下,创建自定义的Nginx配置文件和网站文件
website
。
touch -R website
根据自己的需求,可以在文件中配置Nginx服务器的具体设置,将网站文件放在
website
目录中。
3.构建Docker镜像。在终端中进入包含Dockerfile
文件的目录,并执行以下命令:
docker build -t my-nginx-image .
这将根据Dockerfile
文件的内容构建一个名为my-nginx-image
的新的Docker镜像。请注意最后的点号.
表示使用当前目录作为构建上下文。
4.等待镜像构建完成后,可以使用以下命令运行容器:
docker run -p 80:80 --name my-nginx-container my-nginx-image
这将在端口80上运行一个名为my-nginx-container
的新容器,并将该容器的80端口映射到主机的80端口。
现在你应该拥有一个基于Nginx的Docker镜像,并且可以运行一个Nginx服务器的容器了。请根据你的实际需求进行自定义配置和修改。
构建镜像
在Docker主机上构建镜像:在已经安装了Docker的主机上,使用docker build
命令来构建镜像。在命令行中进入Dockerfile所在的目录,然后运行以下命令:
docker build -t <image_name> .
其中,<image_name>
是你想要为镜像命名的名字。命令中的.
表示Dockerfile所在的当前目录。
查看已构建的镜像:完成构建后,你可以使用以下命令来查看已构建的镜像:
docker images
这将显示一个列表,其中包含已构建的镜像以及它们的标签和大小。
运行镜像
运行容器:基于已构建的镜像,你可以使用docker run
命令来运行容器。例如:
docker run --name <container_name> -d -p <host_port>:<container_port> <image_name>
其中,<container_name>
是你为容器指定的名字,<host_port>
是你要映射到容器的端口号,<container_port>
是容器内部运行的应用程序的端口号,<image_name>
是之前构建的镜像的名字。
注意,根据你的需求,可以使用不同的标志来调整容器的配置和行为。
查看运行中的容器:运行以下命令来查看正在运行的容器:
docker ps
这将显示当前正在运行的容器的列表,包括容器的ID、名称、运行时间等信息。
发布
注意:Docker原本所有镜像都是通过Docker Hub下载资源,但是这个平台今年开始收费了,不交钱的仓库就要被强制下架,我为了方便大家学习,选中阿里云仓库。
以后阿里云仓库收不收费,我也不知道,视频内容也用不了了。
大家知道大致的流程,并且可以理解,就算学会发布了。
登录阿里云官网
1.搜索容器镜像服务
2.选择管理控制台
3.创建个人实例,点击并进入
4.选择镜像仓库,并创建
5.创建仓库信息
输入仓库名称、是否公开、私有,以及仓库的描述。
6.来源选择本地仓库,并且点击创建。
7.复制仓库推送信息并使用
8.登录失败怎么办
请回到个人实例位置,点击访问凭证并重新设置密码。
下载镜像
$ docker pull /docker8886/cangsangdockerdemo:
因为我创建的这个镜像仓库是“公开”,所以他人下载的时候,不需要输入登录密码。
运行容器
docker run -p 8080:80 -d [镜像名称或ID]
修改DNS
编辑/etc/
文件,可以使用以下命令打开编辑器:
sudo gedit /etc/
在文件中,找到并删除所有已存在的nameserver
行。
添加以下两行来指定新的DNS服务器地址:
nameserver
这将把和作为首选DNS服务器地址。
Dockerfile和容器导入导出区别
Dockerfile:Dockerfile是用于定义和构建Docker镜像的文本文件。它包含一系列的指令和参数,用于描述Docker镜像的构建过程。通过执行Dockerfile中的指令,我们可以自动化地构建出一个可重复部署的镜像。Dockerfile通常包含了基础镜像的选择、软件安装、配置文件、环境变量、暴露端口等信息,以及构建镜像所需要的其他步骤。Dockerfile的主要作用是定义镜像的构建过程,并提供了一种可重复和可移植的方式来构建镜像。
容器的导入导出:容器的导入导出是指将正在运行的Docker容器导出为一个文件,并且可以将这个文件导入到另外一台Docker主机上。通过导出容器,可以将容器的状态和数据打包成一个文件,然后在其他主机上导入并保留原有的状态和数据。导出的文件包含了容器的文件系统和元数据,可以用于备份、迁移容器和共享容器状态。导入导出容器的常用命令是docker export
和docker import
。
总结来说,Dockerfile用于定义和构建镜像,而容器的导入导出用于将运行中的容器保存成文件以及将导出文件导入到其他主机上。两者分别针对不同的场景和需求。
FROM
"FROM"是Dockerfile中的一条指令,它用于指定基础镜像。基础镜像是构建Docker容器所需的起点,可以理解为一个用于构建应用程序环境的空白板。
在Dockerfile中,使用"FROM"指令可以选择一个现有的基础镜像作为构建的起点,然后在该基础镜像的基础上进行进一步的定制。
使用"FROM"指令时,可以指定一个完整的镜像名称,或者使用一个简写名称。如果指定的镜像名称不是完整的URL,Docker引擎会去预定义的镜像仓库中查找该镜像。
例如,下面是一个简单的Dockerfile示例,使用FROM指令选择了一个基础镜像:
FROM ubuntu:latest
这个示例中,基础镜像选择了Ubuntu操作系统的最新版本。接着,你可以在Dockerfile中添加更多的指令来定制你的应用程序环境,例如安装软件包、复制文件等。
总之,"FROM"指令的作用是选择一个基础镜像,该基础镜像将成为构建Docker容器的起点。
MAINTAINER
在早期版本的Docker中,可以使用MAINTAINER
指令来指定维护者(maintainer)的信息。维护者通常是负责创建和维护Docker镜像的人或团队。
MAINTAINER
指令的作用是向用户提供关于维护者的信息。它的语法如下:
MAINTAINER <name>
<name>
可以是维护者的任意文本信息,例如维护者的姓名、邮箱地址或组织名称。
然而,在Docker 版本以后,MAINTAINER
指令已被弃用,取而代之的是通过标签(label)来提供镜像的相关信息。通过标签,你可以为镜像指定一系列自定义的键值对,其中包括维护者的信息。
以下是一个使用标签代替MAINTAINER
指令的示例:
LABEL maintainer="your_email@"
这样,你就可以使用docker image inspect
命令来查看镜像的标签,其中就会包含维护者的信息:
$ docker image inspect your_image_name"Labels": { "maintainer": "your_email@"},
总结来说,MAINTAINER
指令的作用是在Dockerfile中提供维护者的信息。然而,最好的做法是使用标签来代替MAINTAINER
指令,以便提供更多灵活性和自定义性。
RUN
在Dockerfile中,"RUN"指令用于在镜像构建过程中执行命令。它的作用是在构建镜像的过程中运行指定的命令,以便安装软件包、创建文件、设置环境变量等。
"RUN"指令的语法如下:
RUN <command>
""可以是任意的命令或命令串,可以使用Shell执行命令。Docker引擎将按照Dockerfile中的顺序逐行执行"RUN"指令。每个"RUN"指令都会在容器中执行一个新的临时容器,并且对该容器的更改都会被记录到镜像中。
以下是一个示例,展示了在Dockerfile中使用"RUN"指令安装软件包的例子:
FROM ubuntu:latestRUN apt-get update && apt-get install -y \ package1 \ package2 \ package3
在这个示例中,首先选择了一个基础镜像,然后使用"RUN"指令运行了两个命令。第一个命令是更新Ubuntu系统的软件源列表,第二个命令通过apt-get
命令安装了三个软件包。
在构建镜像时,Docker引擎会执行这两个命令,并将生成的更改记录到最终的镜像中。这样,在之后的容器中,这些软件包就都已经预先安装好了。
总之,"RUN"指令在Dockerfile中用于执行命令,以便在构建镜像的过程中进行一系列操作,如安装软件包、创建文件、设置环境变量等。
CMD
在Dockerfile中,"CMD"指令用于设置容器启动时要执行的默认命令或者程序。
"CMD"指令的语法有两种不同的方式:
Exec 格式:
CMD ["executable","param1","param2"]
这种格式使用 JSON 数组的形式来指定要执行的命令。其中,可执行文件和参数都必须以字符串的形式进行指定。当容器启动时,会执行这个命令。
Shell 格式:
CMD command param1 param2
这种格式以字符串形式直接指定要执行的命令。当容器启动时,会将这个字符串交给默认的 Shell 进行解析执行。
需要注意的是,Dockerfile中只能有一个"CMD"指令。如果在一个Dockerfile中出现了多个"CMD"指令,则只有最后一个会生效。
另外,如果在运行Docker容器时指定了要执行的命令(通过docker run
命令的参数来指定),则会覆盖掉"Dockerfile"中设置的默认命令。
以下是一个使用"CMD"指令的示例:
FROM ubuntu:latestRUN apt-get update && apt-get install -y \ package1 \ package2 \ package3CMD ["echo", "Hello, Docker!"]
在这个示例中,首先选择了一个基础镜像,然后通过"RUN"指令安装了一些软件包。最后,通过"CMD"指令设置了默认的命令"echo Hello, Docker!"。
当我们构建这个镜像并在容器中运行时,会自动执行默认命令"echo Hello, Docker!"。
总结来说,"CMD"指令在Dockerfile中用于设置容器启动时要执行的默认命令或程序。它有两种语法格式,可以通过配置Dockerfile中的"CMD"指令来定义容器的默认行为。
VOLUME
在Dockerfile中,"VOLUME"指令用于在容器中创建一个或多个挂载点,使得容器内的特定路径可以与宿主机或其他容器进行数据共享。
"VOLUME"指令的语法如下:
VOLUME ["<path>"]
或者
VOLUME <path>
其中,<path>
表示容器中的目录路径,可以是绝对路径或相对路径。
使用"VOLUME"指令可以实现以下几个功能:
数据共享:通过将容器内的某个目录路径挂载到宿主机或其他容器上的目录,可以实现数据的共享和持久化。这样在容器启动、停止、重新创建等操作时,数据都能保持不变,使得容器更加可移植和可靠。
数据持久化:通过挂载容器内的目录到宿主机上的目录,可以将容器中的数据持久化保存到宿主机上,而不会随着容器的删除而丢失。这样在容器重新启动时,可以通过挂载同样的目录,恢复之前的数据。
以下是一个使用"VOLUME"指令的示例:
FROM ubuntu:latestVOLUME /data
在这个示例中,首先选择了一个基础镜像,然后使用"VOLUME"指令创建了一个挂载点。它将容器内的/data
目录路径映射到宿主机上的某个目录,以实现数据共享和持久化。
在运行容器时,可以通过-v
参数指定宿主机上的目录与容器内的挂载点之间的映射关系,例如:
docker run -v /host/data:/data image_name
这样就将宿主机上的/host/data
目录与容器内的/data
目录进行了映射,实现了数据共享和持久化。
总结来说,"VOLUME"指令在Dockerfile中用于创建一个或多个挂载点,以实现容器内数据的共享和持久化。通过在运行容器时,指定宿主机上的目录与容器内的挂载点之间的映射关系,可以将数据存储在宿主机上,而不会随着容器的生命周期改变。
USER
在Dockerfile中,"USER"指令用于指定在容器中运行应用程序时使用的用户或用户组。它的作用是在容器中设置一个特定的用户身份,以增加容器的安全性和隔离性。
"USER"指令的语法如下:
USER <user>[:<group>] or USER <UID>[:<GID>]
其中,<user>
可以是用户名或用户ID(UID), <group>
可以是组名或组ID(GID),也可以省略不写。如果省略了<group>
,则容器中的默认组将会被使用。
使用"USER"指令可以实现以下几个功能:
提高容器的安全性:在容器中运行应用程序时,使用非特权用户身份可以减少潜在的安全风险。通过使用"USER"指令,可以将容器中的进程限制在一个非特权用户的权限范围内,减少潜在的攻击面。
隔离应用程序环境:通过指定特定的用户身份,可以将应用程序与宿主机或其他容器隔离开来,避免可能的冲突和干扰。这有助于增加应用程序的可移植性和可靠性。
以下是一个使用"USER"指令的示例:
FROM ubuntu:latestRUN groupadd -r mygroup && useradd -r -g mygroup myuserUSER myuser:mygroup
在这个示例中,首先选择了一个基础镜像,然后通过RUN
指令创建了一个用户组和用户。最后,使用"USER"指令将容器中的进程限制在myuser
用户和mygroup
组的权限范围内。
请注意,"USER"指令只影响通过Dockerfile构建的镜像中的用户身份。在运行镜像时,可以通过--user
参数来指定要使用的用户身份,覆盖Dockerfile中的设置。
总结来说,"USER"指令在Dockerfile中用于指定容器中运行应用程序时使用的用户或用户组,以增加容器的安全性和隔离性。
WORKDIR
在Dockerfile中,"WORKDIR"指令用于设置容器内部工作目录,即在容器中执行命令时的默认目录。
使用"WORKDIR"指令可以实现以下几个功能:
指定默认工作目录:通过使用"WORKDIR"指令,可以设置容器中的默认工作目录。这样,当在容器内部执行命令时,可以省略完整路径,直接相对于该工作目录执行命令。这提供了简洁性和便利性。
简化指令路径:容器中的每个指令都会在指定的工作目录中执行。这样可以避免在每个执行命令时都写入长路径,简化了指令的编写。
支持相对路径:"WORKDIR"指令可以接受相对路径和绝对路径。使用相对路径时,它会相对于当前工作目录进行解析。这样可以更灵活地操作容器中的文件和目录。
以下是一个使用"WORKDIR"指令的示例:
FROM ubuntu:latestWORKDIR /appCOPY . .RUN makeCMD [ "./app" ]
在这个示例中,首先选择了一个基础镜像,然后使用"WORKDIR"指令将工作目录设置为/app
。接下来,使用COPY
指令将当前目录的文件复制到容器中的工作目录。然后使用make
命令构建应用程序。最后,使用CMD
指令定义了容器启动时默认执行的命令,相对路径"./app"
会在工作目录/app
中执行。
简单来说,"WORKDIR"指令用于设置容器内部的工作目录,以方便在容器中执行命令时使用相对路径。
HEALTHCHECH
在Dockerfile中,"HEALTHCHECK"指令用于指定容器运行时的健康检查命令。
使用"HEALTHCHECK"指令可以实现以下几个功能:
容器健康状态检查:通过定义健康检查命令,可以在容器运行时定期或定时检查容器的健康状态。健康检查可以包括各种类型的检查,如执行命令、发送HTTP请求、检查端口等。
自动容器重启:当容器的健康状态检查失败时,Docker守护进程可以自动在指定条件下重启容器,以使其恢复正常运行状态。这样可以实现容器的自动恢复和高可用性。
以下是一个使用"HEALTHCHECK"指令的示例:
FROM ubuntu:latestHEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD curl -f http://localhost/ || exit 1CMD [ "nginx" ]
在这个示例中,首先选择了一个基础镜像,然后使用"HEALTHCHECK"指令定义了容器的健康检查命令。该命令使用"curl"命令发送HTTP请求来测试容器是否可以成功访问http://localhost/。如果请求失败,则返回状态码1,这将被Docker守护进程视为容器的健康检查失败。最后,使用"CMD"指令定义了容器启动时默认执行的命令,此例中为启动"nginx"服务。
总结来说,"HEALTHCHECK"指令用于定义容器的健康检查命令,以检查容器的健康状态并实现自动容器重启功能。这有助于提高容器的可靠性和可用性。
ARG
在Dockerfile中,"ARG"指令用于定义构建时的变量。这些变量可以在构建过程中被引用,但在容器运行时不可见。
使用"ARG"指令可以实现以下几个功能:
设置构建时的参数:通过使用"ARG"指令,可以设置构建过程中的参数。这些参数可以在构建过程中被引用,如设置环境变量、镜像标签等。
可在构建命令中传递参数:构建镜像时,可以通过命令行传递参数给"ARG"指令定义的变量。这样可以在构建过程中根据不同的参数值执行不同的操作,使构建过程更加灵活。
以下是一个使用"ARG"指令的示例:
FROM ubuntu:latestARG VERSION= APP_VERSION=$VERSION
在这个示例中,首先选择了一个基础镜像,然后使用"ARG"指令定义了一个名为"VERSION"的变量,并设置其默认值为""。接下来,使用"ENV"指令将这个变量的值赋给一个环境变量"APP_VERSION"。在构建过程中,可以通过修改"ARG"指令定义的变量值,或者通过构建命令传递参数来改变环境变量的值。
总结来说,"ARG"指令用于定义构建时的变量,在构建过程中可以根据这些变量执行不同的操作,如设置环境变量、镜像标签等。这增加了构建过程的灵活性和可配置性。
EXPOSE
在Dockerfile中,"EXPOSE"指令用于声明容器运行时所监听的网络端口。
使用"EXPOSE"指令可以实现以下几个功能:
声明容器对外暴露的端口:通过使用"EXPOSE"指令,可以告诉Docker守护进程容器将要监听的网络端口。这样,其他容器或主机可以通过网络与该端口进行通信。
仅作为文档使用:"EXPOSE"指令还可以作为Dockerfile中的文档说明,用于指示容器设计者或使用者应该将哪些端口暴露出来。
需要注意的是,"EXPOSE"指令并不会自动在主机上映射这些端口,它只是声明这些端口可以被容器监听。在运行容器时,可以使用"-p"或"-P"选项来映射容器内部的某个端口到主机上,以使外部可以访问。
以下是一个使用"EXPOSE"指令的示例:
FROM nginx:latestEXPOSE 80 443
在这个示例中,选择了一个基于最新版的nginx镜像。然后,使用"EXPOSE"指令声明容器将会监听80和443端口。这意味着其他容器或主机可以通过网络与容器内的这两个端口进行通信。
总结来说,"EXPOSE"指令用于声明容器运行时所监听的网络端口,是一种向Docker守护进程提供容器服务端口信息的方式。它并不会自动在主机上映射这些端口,而是需要在运行容器时使用"-p"或"-P"选项进行端口映射。
ENV
在Dockerfile中,"ENV"指令用于设置容器中的环境变量。
使用"ENV"指令可以实现以下几个功能:
定义容器中的环境变量:通过使用"ENV"指令,可以设置容器中的环境变量。这些环境变量可以在容器运行时被访问,供应用程序使用。
传递构建时的参数:"ENV"指令还可以通过引用构建时的参数,将构建时的参数值传递给容器中的环境变量。这样可以在构建过程中根据不同的参数值设置不同的环境变量。
以下是一个使用"ENV"指令的示例:
FROM ubuntu:latestENV VERSION= \ PORT=8080
在这个示例中,首先选择了一个基础镜像,然后使用"ENV"指令定义了两个环境变量,分别是"VERSION"和"PORT"。"VERSION"的值被设置为"","PORT"的值被设置为"8080"。在容器运行时,可以通过这两个环境变量访问其值。
总结来说,"ENV"指令用于设置容器中的环境变量,可以在容器运行时被访问。它可以用于定义静态的环境变量,也可以通过引用构建时的参数来设置动态的环境变量。
ADD
在Dockerfile中,"ADD"指令用于将文件、目录或远程URL添加到容器中。
"ADD"指令的作用包括:
将本地文件或目录添加到容器中:可以使用"ADD"指令将主机上的文件或目录添加到容器中。Docker会将这些文件或目录复制到镜像中的相应位置。
ADD <src> <dest>
其中,""指定了主机上的文件或目录路径,""指定了容器中放置文件或目录的路径。如果""是一个目录,那么将会把""中的内容复制到""目录下。
解压缩文件:如果""是一个压缩文件(例如.tar,.,.),Docker会自动解压缩该文件并将解压后的内容添加到容器中。
添加远程URL中的文件:可以使用"ADD"指令将来自远程服务器的文件添加到容器中。Docker会从远程URL下载文件,然后将其复制到镜像中。
ADD <src>... <dest>
这种情况下,可以指定多个""参数,每个参数都是一个URL地址,Docker会依次下载文件并将其添加到镜像中。
需要注意的是,相对路径的文件或目录会相对于当前的构建上下文(通过docker build
命令指定的目录)进行解析。同时,使用"ADD"指令时会触发Docker的缓存策略,只有当""的内容改变时,Docker才会重新复制文件。
在实际使用中,"COPY"指令更常用于文件和目录的复制操作,而"ADD"指令则主要用于需要自动解压缩或从远程URL下载文件的场景。
总结来说,"ADD"指令用于将文件、目录或远程URL添加到容器中。它可以将主机上的文件或目录复制到容器中,也可以解压缩文件或从远程URL下载文件并添加到镜像中。
COPY
在Dockerfile中,"COPY"指令用于将文件或目录从主机复制到容器中。
"COPY"指令的作用包括:
复制本地文件或目录到容器中:可以使用"COPY"指令将主机上的文件或目录复制到容器中。Docker会将这些文件或目录复制到镜像中的相应位置。
COPY <src> <dest>
其中,""指定了主机上的文件或目录路径,""指定了容器中放置文件或目录的路径。如果""是一个目录,那么将会把""中的内容复制到""目录下。
复制文件或目录的权限:使用"COPY"指令复制文件或目录时,Docker会保留这些文件或目录的权限,并将其应用于镜像中的相应文件或目录。
需要注意的是,相对路径的文件或目录会相对于当前的构建上下文(通过docker build
命令指定的目录)进行解析。同时,使用"COPY"指令时会触发Docker的缓存策略,只有当""的内容改变时,Docker才会重新复制文件。
与"ADD"指令相比,"COPY"指令更适合简单的文件和目录复制操作,不支持自动解压缩和从远程URL下载文件的功能。
以下是一个使用"COPY"指令的示例:
FROM ubuntu:latestCOPY /app/
在这个示例中,选择了一个基础镜像,然后使用"COPY"指令将主机上的""文件复制到容器中的"/app/"路径下。
总结来说,"COPY"指令用于将文件或目录从主机复制到容器中。它可以用于复制本地文件或目录,并保留权限。相对于"ADD"指令,"COPY"更适合简单的文件和目录复制操作。
ENTRYPOINT
在Dockerfile中,"ENTRYPOINT"指令用于配置容器启动时要执行的命令。
"ENTRYPOINT"指令的作用包括:
设置容器的默认执行命令:通过指定"ENTRYPOINT"指令,可以将容器的默认执行命令设置为特定的命令或脚本。这些命令在容器启动时会自动执行。
ENTRYPOINT ["command", "arg1", "arg2"]
在这个例子中,"command"是要执行的命令,"arg1"和"arg2"是命令的参数。可以通过添加多个参数来指定命令的参数列表。
支持传递额外的参数:使用"ENTRYPOINT"指令定义容器的默认执行命令后,可以在启动容器时传递额外的参数来修改默认行为。传递的参数将作为默认执行命令的参数。
docker run --rm myimage extra-arg
在这个例子中,"extra-arg"是额外的参数,它将作为默认执行命令的参数。
需要注意的是,"ENTRYPOINT"指令中使用的形式是JSON数组形式,而不是常规的命令行形式。这是因为JSON数组形式可以避免由于特殊字符解析问题引起的错误,并允许更好地处理参数。
"ENTRYPOINT"指令还可以与"Dockerfile"中的其他指令(如"CMD")结合使用,以组合多个命令,并定义容器的启动命令和默认参数。
以下是一个使用"ENTRYPOINT"指令的示例:
FROM ubuntu:latestENTRYPOINT ["echo"]CMD ["Hello, Docker!"]
在这个示例中,选择了一个基础镜像,然后使用"ENTRYPOINT"指令将默认执行命令设置为"echo"命令,使用"CMD"指令将默认参数设置为"Hello, Docker!"。当容器启动时,默认执行命令为"echo",并将"Hello, Docker!"作为参数传递。
总结来说,"ENTRYPOINT"指令用于配置容器启动时要执行的命令,并可以支持传递额外的参数。它可以设置容器的默认执行命令,并与其他指令组合使用以定义容器的启动命令和默认参数。
视频学习地址: