Docker 快速上手
约 8407 字大约 28 分钟
Docker
2025-07-22
Docker 简单来说就是一个开源的应用容器引擎。它让开发者可以将他们的应用程序及其所有依赖项打包到一个标准化的、可移植的容器中。这个容器可以在任何支持 Docker 的环境中运行,无论是开发者的笔记本电脑、测试服务器还是生产环境的云服务器,都可以保持一致的行为。通过 Docker,应用程序的部署变得更加快速、可靠和高效,因为它消除了不同运行环境之间的兼容性问题。它使得开发、测试和生产环境的一致性成为可能,大大简化了软件的交付流程。
docker pull docker.io/library/nginx:latest
dock pull
命令用于从配置的镜像仓库(registry),例如 Docker Hub 或私有镜像仓库中,下载特定的 Docker 镜像到本地系统。docker.io
是Docker 仓库的注册表地址,表示这是docker hub的官方仓仓库,官方仓库可以省略仓库地址library
是命名空间,docker hub是公共仓库,每个人都可以上传自己的镜像,所以要用名称进行区分,library是docker官方仓库的命名空间,如果一个镜像属于是官方的命名空间,那这部分可以省略不写nginx
是镜像名称,表示要下载的镜像是 nginxlatest
是镜像的标签,表示要下载的镜像是 nginx 的最新版本,标签可以省略,默认就是latest,也可以指定其他版本的标签,例如nginx:1.21
这些镜像包含了运行一个或多个容器实例所需的所有应用程序组件、依赖库、运行时环境、以及相关的代码和配置文件。在用户创建并启动容器之前,必须确保其所依赖的基础或特定应用镜像已通过 pull
操作下载到本地。
该命令是 Docker 工作流中的一个基本且重要的步骤,它保证了用户能够获取到最新版本或特定标签(tag)的镜像,从而为容器的正确部署和运行奠定基础。
简化后的命令为:
docker pull nginx
表示从 Docker Hub 上拉取最新版本的 nginx 镜像。
Docker Hub是 Docker 官方提供的公共镜像仓库,用户可以在其中找到各种开源和官方维护的 Docker 镜像。Docker Hub 提供了一个集中式的平台,允许用户上传、分享和下载 Docker 镜像。地址为 Docker Hub,其他镜像站:Docker Hub 镜像搜索
在国内的网络环境中执行命令可能会遇到报错,可以通过修改配置文件来使用国内的镜像源。详细资源:https://github.com/tech-shrimp/docker_installer
docker image
命令用于管理本地的 Docker 镜像,包括查看、删除、标记等操作。常用的子命令包括:
docker image ls
:列出本地所有的镜像docker image rm
:删除一个或多个镜像docker image tag
:为镜像添加一个新的标签
docker rmi
命令用于删除一个或多个 Docker 镜像,将需要删除的镜像 ID 或名称作为参数传递给该命令,这个命令可以帮助用户清理不再需要的镜像,释放存储空间。
docker pull --platform=xxx
命令用于从 Docker 仓库中拉取特定平台的镜像。这个命令允许用户指定所需的操作系统架构和平台类型,以确保拉取到的镜像能够在目标环境中正确运行。
默认情况Docker 会根据当前系统的架构自动选择合适的镜像,但有时用户可能需要拉取特定平台的镜像,例如在 ARM 架构的设备上运行 x86 架构的镜像,或者在 x86 架构的设备上运行 ARM 架构的镜像。
例如,docker pull --platform=linux/amd64 nginx
将拉取适用于 Linux 操作系统和 AMD64 架构的 Nginx 镜像。
docker run
命令用于创建并启动一个新的容器实例。将需要运行的镜像名称作为参数传递给该命令,这个命令是 Docker 的核心命令之一,允许用户从指定的镜像创建一个新的容器,并在该容器中运行指定的命令或应用程序。
docker ps
命令用于列出当前正在运行的容器,ps
就是 process status (进程状态) 的缩写,它显示了容器的基本信息,包括容器 ID、镜像名称、创建时间、状态、端口映射等。
第一列container id容器的id,每创建一个容器,Docker 就会分配一个唯一的 ID,用于标识该容器。IMAGE 列显示了容器所基于的镜像名称,COMMAND 列显示了容器启动时执行的命令,CREATED 列显示了容器创建的时间,STATUS 列显示了容器的当前状态(如运行中、已停止等),PORTS 列显示了容器暴露的端口映射信息,NAMES 列显示了容器的名称。
docker run -d
,其中的d
表示 detached mode(分离模式),容器将在后台运行,而不是绑定到当前终端,执行后会返回一个容器 ID。这个命令常用于需要长时间运行的服务或应用程序,例如 Web 服务器、数据库等。
当直接使用 docker run
命令时,如果发现本地不存在 指定的镜像,Docker 会自动尝试从默认的 Docker Hub 仓库中拉取该镜像。如果需要从其他仓库拉取镜像,可以使用 docker pull
命令手动拉取。
docker run -p
命令用于将容器的端口映射到宿主机的端口。通过指定 -p
选项,用户可以将容器内部的服务暴露到宿主机上,从而实现外部访问。例如,docker run -p 8080:80 nginx
将容器的 80 端口映射到宿主机的 8080 端口。
docker run -p
参数用于端口映射,其主要作用是将Docker容器内部的网络端口与宿主机的网络端口进行关联,从而允许外部访问容器内运行的服务。
核心概念:
- 网络隔离: Docker容器拥有独立的虚拟网络环境,与宿主机网络默认是隔离的。这意味着,即使容器内运行着一个服务(如Nginx),在不进行端口映射的情况下,也无法直接通过宿主机的IP地址和端口访问到该服务。
- 端口映射的作用: 解决网络隔离问题,实现宿主机与容器之间的通信。通过端口映射,当访问宿主机的特定端口时,流量会被转发到容器内部对应的端口,从而能够访问容器内运行的服务。
使用方法:
使用 -p
参数进行端口映射的格式为:宿主机端口:容器内端口
。
冒号前: 宿主机的端口(外部端口)。
冒号后: 容器内部的端口(内部端口)。
示例:
docker run -p 80:80 nginx
- 这个命令会将宿主机的80端口映射到Nginx容器内部的80端口。
- 这样,当在宿主机浏览器中访问
localhost:80
时,实际上就是访问到了Nginx容器内的服务,网页因此可以正常显示。
一个容器端口可以映射到多个宿主端口。要实现这一点,你需要在 docker run
命令中使用 -p
参数多次,每个所需的映射使用一次。
例如,要将容器的端口 33 映射到宿主端口 1253 和宿主端口 2313,你可以使用以下命令:
docker run -p 1253:33 -p 2313:33 my_image
在这个命令中:
-p 1253:33
将宿主端口 1253 映射到容器端口 33。-p 2313:33
将宿主端口 2313 映射到容器端口 33。
这允许你从宿主机的两个不同端口访问在容器内部运行在端口 33 上的服务。
在 Windows 上,Docker 镜像的默认下载位置取决于 Docker 的设置:
对于 Windows 上的 Docker Desktop: 镜像通常存储在 Docker Desktop 管理的虚拟硬盘文件中。此文件通常位于 C:\ProgramData\DockerDesktop
或 C:\Users\<YourUser>\AppData\Local\Docker\wsl
(如果使用 WSL2 作为后端)。
当使用带有 Docker Desktop 的 WSL2 时: 将创建一个名为 docker-desktop-data
的新发行版,并且镜像层存储在 \\wsl$\docker-desktop-data\version-pack-data\community\docker\overlay2
下。
请注意,通常通过 Docker CLI 命令与 Docker 镜像交互,而不是直接访问或修改这些文件。您也可以使用 docker info
命令查看 Docker Root Dir,它指示 Docker 存储其数据的位置。
在Linux系统中,Docker的默认数据存储位置通常是 /var/lib/docker
。修改此位置需要配置Docker守护进程。
步骤:
停止Docker服务: 在修改任何配置前,务必停止Docker服务以避免数据损坏。
sudo systemctl stop docker
备份(可选但强烈建议): 为了安全起见,可以备份当前的Docker数据目录。
sudo cp -rp /var/lib/docker /var/lib/docker_backup
创建新的存储目录: 选择一个新的位置来存储Docker数据,并创建该目录。例如,在
/mnt/new_docker_data
:sudo mkdir -p /mnt/new_docker_data
移动现有Docker数据到新目录: 将旧目录中的所有内容移动到新创建的目录。这一步非常重要,因为这将保留你现有的镜像、容器和卷等数据。
sudo mv /var/lib/docker/* /mnt/new_docker_data/
注意: 如果新目录是空的,你也可以选择不移动,让Docker重新创建一个全新的环境。但如果你有重要的现有数据,那么移动是必须的。
配置Docker守护进程: Docker的配置文件是
/etc/docker/daemon.json
。如果文件不存在,则创建它;如果存在,则编辑它。使用你喜欢的文本编辑器打开或创建
daemon.json
文件:sudo nano /etc/docker/daemon.json
添加或修改
data-root
字段指向新的存储路径。如果文件中有其他配置,请确保这是一个有效的JSON格式(例如,用逗号分隔多个条目)。{ "data-root": "/mnt/new_docker_data" }
保存并关闭文件。
启动Docker服务:
sudo systemctl start docker
验证: 运行
docker info
命令,查找 "Docker Root Dir" 行,确认其指向新的路径。docker info | grep "Docker Root Dir"
输出应显示你刚刚配置的新路径。
Windows上Docker的存储位置取决于你使用的是经典的Windows Server版Docker还是更常见的Docker Desktop。
Docker Desktop on Windows (推荐,包含WSL2)
对于大多数Windows用户,你安装的是Docker Desktop,它通常在后台使用WSL2(Windows Subsystem for Linux 2)或Hyper-V虚拟机来运行Docker。
通过Docker Desktop设置修改(最简单和推荐的方式):
- 打开Docker Desktop应用程序。
- 点击任务栏托盘中的Docker图标(通常在右下角)。
- 选择 "Settings" (设置)。
- 导航到 "Resources" (资源) -> "WSL Integration" (WSL集成) 或 "Advanced" (高级)。
如果使用WSL2作为后端:
- 早期版本可能在 "Resources" -> "Advanced" 中有 "Disk image location" 选项,允许你移动整个WSL2磁盘映像(包括Docker数据)。
- 新版本通常在 "Resources" -> "WSL Integration" 中直接管理WSL发行版。Docker Desktop的数据位于一个名为
docker-desktop-data
的WSL发行版中。直接移动这个WSL发行版是更复杂的操作,通常不建议直接手动移动其内部数据。 - 最直接的方法是,如果你想将整个Docker Desktop的数据盘移动到另一个驱动器,你可以在WSL2的命令行中导出和导入
docker-desktop-data
发行版。这个过程相对复杂,涉及到WSL命令:- 在 PowerShell/CMD 中:
wsl --shutdown
(关闭所有WSL发行版) wsl --export docker-desktop-data E:\path\to\new\location\docker-desktop-data.tar
(导出,E:\path\to\new\location
是你希望的新位置)wsl --unregister docker-desktop-data
(注销旧的发行版)wsl --import docker-desktop-data E:\path\to\new\location E:\path\to\new\location\docker-desktop-data.tar --version 2
(导入到新位置)- 然后重新启动Docker Desktop。
- 在 PowerShell/CMD 中:
- 更简单的方法可能是使用Docker Desktop GUI中提供的“Move data folder”或“Disk image location”选项(如果你的版本有的话)。如果没有,建议通过WSL命令进行管理。
如果使用Hyper-V作为后端(旧版本或特定配置):
- 在 "Resources" -> "Advanced" 选项卡中,通常会有一个 "Disk image location" (磁盘镜像位置) 选项。
- 点击 "Browse" (浏览) 选择新的
.vhdx
文件存储路径。 - 点击 "Apply & Restart" (应用并重启)。Docker Desktop会将数据迁移到新位置。
注意事项:
- Docker Desktop对数据存储的管理比原生Linux或Windows Server版更集成和自动化。
- 直接在Windows文件系统中找到并修改Docker数据文件是不可取的,因为它们通常在WSL或Hyper-V虚拟磁盘内部。
- 如果Docker Desktop没有直接的GUI选项来移动数据,WSL版本的解决方案会涉及到WSL命令,它移动的是整个WSL虚拟磁盘。
B. Windows Server (原生Docker Daemon)
如果你在Windows Server上手动安装了Docker引擎而不是Docker Desktop,其行为更类似于Linux版本。
步骤:
停止Docker服务:
Stop-Service docker
创建新的存储目录: 选择一个新的位置,例如
D:\DockerData
:New-Item -ItemType Directory -Path D:\DockerData
移动现有Docker数据到新目录: 默认路径通常是
C:\ProgramData\Docker
。Move-Item -Path "C:\ProgramData\Docker\daemon.json" -Destination "D:\DockerData" -Force # 移动 daemon.json 如果存在,通常它可能不存在 Move-Item -Path "C:\ProgramData\Docker\containers" -Destination "D:\DockerData" -Force -Recurse -ErrorAction SilentlyContinue # 移动容器数据 Move-Item -Path "C:\ProgramData\Docker\image" -Destination "D:\DockerData" -Force -Recurse -ErrorAction SilentlyContinue # 移动镜像数据 # 根据需要移动其他子目录,如 volumes, swarm, network等
- 注意: 确保移动了
C:\ProgramData\Docker
下所有重要的子目录。或者,你可以直接将整个C:\ProgramData\Docker
文件夹移动到新位置,但请确保在移动前没有任何进程占用这些文件。
- 注意: 确保移动了
配置Docker守护进程: 创建一个或编辑
daemon.json
文件。在Windows Server上,这个文件通常位于C:\ProgramData\Docker\config
或C:\ProgramData\Docker
。如果文件不存在,你需要创建它。使用记事本或其他文本编辑器打开或创建此文件: 例如,打开
C:\ProgramData\Docker\config\daemon.json
。添加或修改
data-root
字段指向新的存储路径:{ "data-root": "D:\\DockerData" }
请注意Windows路径中使用双反斜杠
\\
,或者使用正斜杠/
。保存并关闭文件。
启动Docker服务:
Start-Service docker
验证: 运行以下命令并查找 "Docker Root Dir" 行:
docker info | Select-String "Docker Root Dir"
输出应显示你配置的新路径。
一般注意事项:
- 权限: 确保新的存储目录具有Docker服务账户的读写权限。在Linux上,通常是
root
或docker
组。 - 空间: 确保新的存储位置有足够的磁盘空间来容纳现有的Docker数据和未来的增长。
- 重启: 每次修改
daemon.json
后,都需要重启Docker服务才能使更改生效。 - 数据丢失风险: 在操作前最好进行备份。错误的操作可能导致镜像和容器数据的丢失。
docker run -v
参数用于挂载卷(Volume Mounting) ,其核心功能是实现宿主机与容器之间文件目录的双向绑定。
核心功能和作用:
- 文件目录绑定:
-v
参数将宿主机上的一个文件目录与容器内部的某个指定目录关联起来。 - 双向同步: 一旦绑定建立,对其中任何一端(宿主机或容器)该目录内容的修改,都会实时反映到另一端。宿主机与容器通过这个共享目录紧密联系。
- 数据持久化: 这是挂载卷最重要的作用。当容器被删除时,容器内部的所有数据通常也会被一并删除。然而,如果使用了挂载卷,容器中与宿主机目录绑定的数据实际上是存储在宿主机上的。这意味着,即使容器被删除,这些数据也会安全地保留在宿主机上,从而实现了数据的持久化保存。
比如:
docker run -v /website/html:/usr/share/nginx/html nginx
在这个命令中:
-v /website/html:/usr/share/nginx/html
表示将宿主机的/website/html
目录挂载到容器内的/usr/share/nginx/html
目录。- 这意味着容器内的 Nginx 服务器将使用宿主机上的
/website/html
目录作为其网站内容的根目录,Nginx 的文件存放目录通常都是/usr/share/nginx/html
。 - 如果宿主机上的
/website/html
目录中有 HTML 文件,这些文件将被 Nginx 服务器直接提供服务。 - 如果你在容器内修改了
/usr/share/nginx/html
目录中的文件,这些修改也会反映到宿主机的/website/html
目录中。 - 如果初次绑定,宿主机文件中没有内容,容器内的
/usr/share/nginx/html
目录将被清空。
在windows中,通常使用绝对路径,例如:
docker run -v C:/Users/you-path/site:/usr/share/nginx/html nginx
-v 宿主机路径:容器内路径
这种挂载方式被称为绑定挂载,还有一种方式是让Docker自动创建一个存储位置,为存储空间提供一个名称,然后在挂载的时候直接使用名称就行了,这种方式叫命名卷挂载。
docker rm 容器ID
命令用于删除一个或多个 Docker 容器。这个命令可以帮助用户清理不再需要的容器,释放系统资源,在删除正在运行的容器可以使用 -f
参数强制删除,列出所有容器可以使用 docker ps -a
命令,-a
参数表示列出所有容器,包括已停止的容器。docker ps
命令默认只列出正在运行的容器。
使用-a
列出的所有容器中,状态为 Exited
的容器表示已经停止运行的容器。可以使用 docker rm
命令删除这些已停止的容器,这些停止运行的容器不会占用系统资源,但如果不删除,它们仍然会占用存储空间。
在运行的时候可以通过 -name
参数为容器指定一个名称,这样在删除容器时可以使用名称而不是容器 ID。例如:
docker run --rm -d --name mynginx -p 8080:80 nginx
--name mynginx
:给容器起一个名字,方便下次用这个名字操作(如 docker stop mynginx)。
--rm
:容器一旦停止就自动删除,不会出现在 docker ps -a 中。
可以使用 docker start/stop
重启已有容器,如果你没有用 --rm
,可以下次这样启动:
docker start mynginx
docker stop mynginx
批量删除所有停止的容器:
docker container prune
会提示确认,删除所有“Exited”或“Created”的容器。
删除所有容器(慎用):
docker rm $(docker ps -aq)
docker rmi 镜像ID
命令用于删除一个或多个 Docker 镜像。这个命令可以帮助用户清理不再需要的镜像,释放存储空间。
docker volume create 卷名称
命令用于创建一个新的 Docker 卷(挂载卷)。卷是 Docker 中用于持久化数据的机制,它允许容器之间共享数据,并在容器删除后保留数据。
创建的挂载卷的位置取决于 Docker 的配置和操作系统。默认情况下,Docker 卷存储在以下位置:
- Linux:
/var/lib/docker/volumes/
- Windows:
C:\ProgramData\Docker\volumes\
docker volume inspect
命令可以查看卷的详细信息,包括其存储位置、创建时间、挂载点等。
在下次docker run
命令中使用 -v 卷名称:容器内路径
参数来挂载这个卷。例如:
docker run -d -v my_volume_name:/data nginx
# docker run -d -p 3000:80 -v nginx_html:/usr/share/nginx/html nginx
sudo -i
用于在 Linux 系统中以 root 用户身份运行命令。使用 sudo -i
可以获得一个交互式的 root shell,允许用户执行需要更高权限的操作。在使用 Docker 时,如果需要访问 Docker 的系统目录或执行特权操作,可能需要使用 sudo -i
切换到 root 用户。
命名卷在第一次使用时Docker会把容器的文件同步到卷中进行一个初始化,但是绑定挂载不会进行初始化,绑定挂载会直接使用宿主机的文件内容。
docker volume list
命令用于列出所有 Docker 卷。这个命令可以帮助用户查看当前系统中存在的所有卷,包括它们的名称、驱动程序和挂载点等信息。
docker volume rm 卷名称
命令用于删除一个或多个 Docker 卷。这个命令可以帮助用户清理不再需要的卷,释放存储空间。
docker volume prune
命令用于删除所有未使用的 Docker 卷。这个命令可以帮助用户清理不再需要的卷,释放存储空间,可以加上-a
参数来删除所有未使用的卷,不加-a
参数只会删除那些没有被任何容器使用的卷。
加 -a
和不加的区别可以简单理解为:
- 不加
-a
:只会删除那些完全没有被任何容器使用的卷(即“孤立”的卷)。 - 加
-a
:会删除所有未被容器挂载的卷,无论这些卷是否曾经被容器使用过。这样可以更彻底地清理无用的卷。
一般情况下,建议先不加 -a
,以免误删还可能需要的数据卷。
docker run -e
命令用于在创建容器时设置环境变量。这个命令允许用户在容器内定义特定的环境变量,以便在运行时使用。
docker run -e MY_ENV_VAR=value nginx
可以传递多个环境变量,使用多个 -e
参数:
docker run -e MY_ENV_VAR1=value1 -e MY_ENV_VAR2=value2 nginx
docker --name
参数用于为容器指定一个名称。这样可以在后续的操作中使用名称而不是容器 ID,从而简化命令,这个名称必须是唯一的。
docker run --name mynginx -p 8080:80 nginx
docker run -it
命令用于创建并启动一个新的容器实例,并进入该容器的交互式终端。这个命令常用于需要与容器内的应用程序进行交互的场景,例如调试或测试。
docker run --rm
参数用于在容器停止后自动删除该容器。这个参数可以帮助用户在容器不再需要时自动清理资源,避免积累大量已停止的容器。
docker run -it --rm alpine sh
进入容器后,可以使用 exit
命令退出容器的交互式终端。由于使用了 --rm
参数,容器停止后会自动被删除。
docker --restart 重启策略[always|unless-stopped|on-failure]
参数用于设置容器的重启策略。重启策略决定了容器在停止后是否自动重启,以及重启的条件。
docker run --restart always nginx
always
:容器无论何时停止都会自动重启,比如容器内部的应用崩溃。unless-stopped
:容器在停止后会自动重启,但如果手动停止则不会再重启。on-failure
:容器只有在非零状态码退出时才会自动重启,可以指定最大重启次数。
docker run
命令用于从镜像创建并启动一个新的容器实例。这个命令可以接受多个参数,以便在启动容器时进行配置。
每次运行 docker run
命令时,Docker 会根据指定的镜像创建一个新的容器实例。容器是镜像的一个运行时实例,它包含了应用程序及其所有依赖项。
如果不想反复的创建和删除容器,可以使用 docker start
和 docker stop
命令来管理已存在的容器。这样可以避免重复的资源开销,提高效率。
docker start mynginx
docker stop mynginx
之前使用docker run
运行时传入的配置已经被保留,下次启动时会使用相同的配置。
docker inspect
命令用于查看容器或镜像的详细信息,包括其配置、状态、网络设置等信息。
docker inspect mynginx
docker create
命令用于创建一个新的容器实例,但不会立即启动它。这个命令可以用于预先配置容器的设置,然后在需要时手动启动。
docker create --name mynginx -p 8080:80 nginx
后续启动使用docker start
命令
docker logs 容器ID
命令用于查看容器的日志输出。这个命令可以帮助用户调试和监控容器内运行的应用程序。
docker logs mynginx
可以加上-f
参数来实时查看日志输出
docker exec 进程ID 执行的命令
命令用于在运行中的容器内执行命令。这个命令允许用户在容器内运行特定的命令或进入容器的交互式终端。
docker exec b12a3072d8b3 ps -ef
其中ps -ef
命令用于列出容器内的所有进程。
docker exec -it 进程ID /bin/bash
命令用于进入正在运行的容器的交互式终端。这个命令允许用户在容器内执行命令,就像在本地终端一样。
docker exec -it mynginx /bin/bash
/bin/bash
是容器内的一个常用 shell,允许用户在容器内执行命令。
使用exit
命令退出容器的交互式终端。
容器内部的命令行是一个极简的 Linux 环境,通常只包含最基本的命令和工具。为了在容器内执行更复杂的操作,可能需要安装额外的软件包。
执行命令前先执行cat /etc/os-release
查看容器的操作系统版本。
比如:
cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
其中显示了容器的操作系统信息,包括名称、版本等。
比如上述的系统的软件的包管理工具是 apt
,可以使用以下命令安装软件包:
apt update
apt install package_name
安装 Vim 编辑器的命令为:
apt install vim
docker file 是一个文本文件,包含了一系列的指令和参数,用于定义如何构建一个 Docker 镜像。Dockerfile 中的每一条指令都会创建一个新的镜像层,这些层会被组合在一起形成最终的镜像。
如果要将一个项目打包成 Docker 镜像,先在项目的根目录下创建一个名为 Dockerfile
的文件。这个文件将包含构建镜像所需的所有指令。
所有的 Dockerfile
文件的第一行都是 FROM
指令,用于指定基础镜像。基础镜像可以是一个操作系统镜像,也可以是一个已经存在的应用程序镜像。
FROM nginx:latest
WORKDIR
指令用于设置工作目录。所有后续的指令都会在这个目录下执行。如果目录不存在,Docker 会自动创建它。
WORKDIR app
COPY
指令用于将文件从宿主机复制到镜像中。可以指定源路径和目标路径。
COPY 宿主机路径 镜像路径
指令将宿主机上的文件或目录复制到镜像中的指定路径。
COPY . .
上述代码表示将宿主机当前目录下的所有文件和子目录复制到镜像中的工作目录 app
下。
RUN
指令用于在镜像构建过程中执行命令。可以使用 RUN
指令安装软件包、复制文件等。
RUN npm install --production
EXPOSE
指令用于指定容器运行时要暴露的端口。这个指令不会实际打开端口,但它会在镜像的元数据中记录下要暴露的端口。
EXPOSE 8090
实际使用还是以-p
参数来进行端口映射。
CMD
指令用于指定容器启动时要执行的命令。这个指令只能出现一次,如果有多个 CMD
指令,只有最后一个会生效。
CMD ["npm", "run", "start"]
ENTRYPOINT
指令用于设置容器启动时的默认命令和参数。与 CMD
不同,ENTRYPOINT
指令指定的命令无法被 docker run
命令的参数覆盖,它的优先级更高。
ENTRYPOINT ["npm", "run", "start"]
最后就可以在终端执行
docker build -t [myAppName]:[myAppVersion] .
可以在项目的根目录中创建.dockerignore
文件来指定在构建镜像时要忽略的文件和目录。这个文件的语法与 .gitignore
类似,可以使用通配符来匹配文件和目录。 例如,以下是一个 .dockerignore
文件的示例:
node_modules
.git
Dockerfile
.dockerignore
*.log
为了将镜像推送到 Docker Hub,先进行登录操作:
docker login
推送到 Docker Hub的镜像需要有一个唯一的名称。通常镜像名称的格式为 用户名/镜像名:标签
,所以在打包的时候需要指定用户名。
docker build -t username/myapp:latest .
推送到 Docker Hub 的命令为:
docker push username/myapp:latest
推送镜像到 Docker Hub 后,可以在任何地方使用 docker pull username/myapp:latest
命令来拉取这个镜像。
Docker网络默认是桥接模式(bridge),它允许容器之间通过虚拟网络进行通信。Docker提供了多种网络模式,包括:
- bridge:默认的网络模式,容器通过虚拟网桥连接到宿主机的网络。
- host:容器直接使用宿主机的网络栈,不进行网络隔离。
- none:容器没有网络连接。
- overlay:用于跨多个 Docker 主机的网络连接,通常用于 Swarm 集群。
所有的容器都链接到这个默认的桥接网络上,每个容器内部都分配了一个虚拟 IP 地址。容器之间可以通过这个 IP 地址进行通信。
容器网络和宿主机的网络是隔离的,容器内部的 IP 地址和宿主机的 IP 地址是不同的。容器可以通过端口映射将其服务暴露到宿主机上,从而允许外部访问。
docker network create
命令用于创建一个新的 Docker 子网络。默认也是桥接模式的一种。
可以指定容器加入不同的子网络,以实现容器之间的隔离和通信。
同一个子网络中的容器可以通过容器名称或 IP 地址进行通信,跨子网络则不能。
子网络中的容器可以通过名称互相访问,而不需要使用内部 IP 地址。
docker network create network1
docker run -d --name container1 --network network1 nginx
--network
参数用于指定容器要加入的网络。
比如同一个子网络中,有两个容器 container1
和 container2
,可以在 container2
中通过 ping 命令测试与 container1
的连接:
docker exec -it container2 ping container1
ping container1
Docker 子网络内部有一套 DNS 系统,可以通过容器名称进行解析。
host
网络模式允许容器直接使用宿主机的网络栈,不进行网络隔离。在这种模式下,容器将共享宿主机的 IP 地址和端口,在启动时候无需进行端口映射,因为容器的服务直接运行在宿主机的网络上。
在启动的时候使用 --network host
参数来指定容器使用宿主机网络模式。
docker run --network host nginx
启动后可以进入容器内查询IP 地址:
docker exec -it container_id /bin/sh
apt update
apt install iproute2
ip addr show
docker network list
命令用于列出当前 Docker 主机上所有的网络,包括默认的桥接网络和用户创建的自定义网络。
其中列出的以下种网络是不能删除的:
bridge
:默认的桥接网络。host
:宿主机网络模式。none
:无网络模式。
docker network rm [network_name/ID]
命令用于删除用户创建的自定义网络。
Docker compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来配置应用程序的服务、网络和卷等。
它使用 yaml
文件来管理多个容器,其中配置了容器之间是如何相互连接的,以及它们的环境变量、端口映射等。
Docker 会为每一个compose 文件创建一个独立的子网络,容器之间可以通过服务名称进行通信。
同一个Compose 文件中的容器都会自动加入到同一个子网络中,这样它们可以通过服务名称进行互相访问。
Docker compose 还可以自定义启动顺序,确保某些服务在其他服务之前启动。
创建好 docker-compose.yml
文件后,可以使用以下命令来启动所有服务:
docker compose up -d
如果需要停止所有服务并且删除容器,可以使用以下命令:
docker compose down
如果只想停止服务而不删除容器,可以使用以下命令:
docker compose stop
使用docker compose start
命令可以重新启动已停止的服务。
如果容器已经在运行了,再次执行 docker compose up
命令不会重新创建容器,而是会根据 docker-compose.yml
文件中的配置更新现有容器。
对于非标准的yaml文件名,可以使用 -f
参数指定文件名:
docker compose -f custom-compose.yml up -d
贡献者
更新日志
7eec2
-Document organization于9de0b
-全局优化于b1c4a
-文档迁移于