Docker 新手入门(一)——Dockerfile 和 Docker CLI 命令
什么是 Docker?——“一次构建,随处运行”。
Docker 是一种软件开发工具和虚拟化技术,它使用容器简化了应用程序的开发、部署和管理。容器是指轻量级、独立、可执行的软件包,其中包含运行应用程序所需的所有库、配置文件、依赖项和其他必要组件。
换句话说,无论应用程序位于何处,运行在哪台机器上,它们都能以相同的方式运行,因为容器在整个应用程序的软件开发生命周期中都提供了环境。由于容器是隔离的,因此它们提供了安全性,从而允许多个容器在给定的主机上同时运行。此外,容器是轻量级的,因为它们不需要额外的虚拟机管理程序负载。虚拟机管理程序是一个像 VMWare 或 VirtualBox 这样的客户操作系统,而容器则直接在主机的内核中运行。
什么时候使用docker?
学习新技术: Docker 提供了一个隔离且可一次性使用的环境,让您无需花费时间进行安装和配置即可快速上手新工具。许多项目维护的 Docker 镜像中,已安装并配置了应用程序。
基本用例:如果您的应用程序足够基础或标准,可以使用默认 Docker 镜像,那么从 Docker Hub 拉取镜像也是一个不错的解决方案。例如,使用 MERN 堆栈开发和托管网站时,节点、MongoDB 官方镜像已经在 DockerHub 上提供,并且得到了良好的支持。如果这些镜像中的默认配置能够满足您的需求,那么拉取镜像可以节省大量原本需要花费在设置环境和安装必要工具上的时间。
应用程序隔离:如果您想在一台服务器上运行多个应用程序,将每个应用程序的组件保存在单独的容器中将避免依赖项管理问题。
开发团队: 它在我的机器上就能运行!作为开发者,我们深知软件开发中最棘手的问题之一就是处理不同机器和平台之间的环境差异。Docker 允许您在本地运行容器,从而消除开发环境和生产环境之间以及两者之间的所有差异。无需在本地安装软件包。开发环境所需的一切都可以作为容器在 Docker 引擎上运行。无论使用何种语言或工具,您都可以轻松地在本地容器化您的环境。
有限的系统资源:容器化应用实例占用的内存远少于虚拟机,启动和停止速度更快,并且可以在主机硬件上更密集地部署。所有这些都意味着IT支出的减少。
成本节省将取决于正在运行的应用类型及其资源密集程度,但容器的效率无疑高于虚拟机。此外,由于运行相同工作负载所需的操作系统实例数量显著减少,因此还可以节省软件许可证成本。
虚拟机与 Docker
Docker 容器和虚拟机都是在与底层硬件隔离的环境中部署应用程序的方式。它们的主要区别在于隔离级别。
使用虚拟机,虚拟机内部运行的所有内容都独立于主机操作系统(或称虚拟机管理程序)。虚拟机平台会启动一个进程(称为虚拟机监视器,简称 VMM)来管理特定虚拟机的虚拟化进程,而主机系统则会将其部分硬件资源分配给该虚拟机。然而,虚拟机的根本区别在于,它在启动时会为该虚拟机环境启动一个新的专用内核,并启动一组(通常相当庞大的)操作系统进程。这使得虚拟机的大小比仅包含应用程序的典型容器要大得多。
相比之下,使用像 Docker 这样的容器运行时,您的应用程序会被沙盒化,并享受容器提供的隔离功能,但仍然与同一主机上的其他容器共享相同的内核。因此,容器内运行的进程在主机系统中可见(前提是拥有足够的权限才能列出所有进程)。多个容器共享同一个内核,允许最终用户在同一台机器上打包大量容器,并实现近乎即时的启动时间。此外,由于容器无需嵌入完整的操作系统,它们非常轻量,通常大小约为 5-100 MB。
什么是容器?
容器是镜像的可运行实例。您可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。您可以将容器连接到一个或多个网络、为其附加存储,甚至可以根据其当前状态创建新的镜像。
默认情况下,容器与其他容器及其主机之间具有相对良好的隔离。您可以控制容器的网络、存储或其他底层子系统与其他容器或主机之间的隔离程度。
容器由其镜像以及您在创建或启动容器时提供的任何配置选项定义。当容器被移除时,任何未存储在持久化存储中的状态更改都会消失。
什么是 Docker 镜像?
镜像是一个只读模板,其中包含创建 Docker 容器的说明。通常,一个镜像基于另一个镜像,并进行了一些额外的自定义。例如,您可以构建一个基于 Ubuntu 镜像的镜像,但在其上安装了 Apache Web 服务器和您的应用程序,以及运行应用程序所需的配置详细信息。
您可以创建自己的镜像,也可以只使用其他人创建并发布在镜像仓库中的镜像。要构建自己的镜像,您需要创建一个 Dockerfile ,并使用简单的语法来定义创建和运行镜像所需的步骤。Dockerfile 中的每条指令都会在镜像中创建一个层。当您更改 Dockerfile 并重建镜像时,只有那些已更改的层会被重建。与其他虚拟化技术相比,这正是镜像如此轻量、小巧和快速的原因之一。
什么是 Docker Hub?
Docker Hub 是 Docker 提供的基于云的存储库服务,用户可以在其中创建、测试、存储和分发容器镜像。通过 Docker Hub,用户可以访问公共的开源镜像存储库,还可以使用空间创建自己的私有存储库、自动构建功能、Web 钩子和工作组。
编写简单的 Dockerfile
假设我们有一个简单的 Node.js 应用程序,其中包含一个 server.js 文件,它监听 3040 端口,并在访问“localhost:3040/”时打印“Hello World!”。
文件结构如下:
simpleNodeApplication
- Dockerfile
- 包-lock.json
- 包.json
- 服务器.js
//Initializes a new build stage and sets the Base Image for subsequent instructions
FROM node:14-alpine
//Defining working directory for our application and
it will be the default directory for our further steps
WORKDIR /app
//Copy package.json file to our created workdir
COPY package.json .
//Does npm install
RUN npm install
//Copy entire code from local to our workdir
COPY . .
//Exposing application on port 3040
EXPOSE 3040
//Command to run our application
CMD ["node", "server.js"]
使用上面的dockerfile
构建镜像=>docker build -t myApp:V1 .
创建容器并映射到3000端口=>docker run -p 3000:3040 --name myContainer myApp:V1
列出正在运行的容器=>docker ps
停止容器=>docker stop myContainer
再次启动容器=>docker start myContainer
注意:我们可能想知道 RUN 和 CMD 之间的区别,
RUN
命令将在构建映像时执行,而CMD
指令应该用于运行映像中包含的软件
Docker 命令
以下是我们日常使用的一些 docker CLI 命令
让 ImageId 为myApp:V1
,让 ContainerName 为myContainer
图像docker build [OPTIONS] PATH | URL | -
docker build -t myApp:V1 .
此命令帮助我们使用编写的 dockerfile 构建应用程序的镜像。
我们可以自己命名镜像,为此使用-t
选项docker build -t name:tag .
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag myApp:V1 myNewApp:V1
这使得我们可以重命名/标记已经创建的图像,而无需重建它。
docker images
列出本地可用的所有图像。
docker image inspect Name|ImageId
docker image inspect myApp:V1
这默认以 JSON 格式提供图像的详细信息。
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rmi myApp:V1
此命令允许我们删除一个或多个镜像。
只有当镜像未被任何容器(包括已停止的容器)使用时,我们才能删除该镜像。要删除镜像,我们需要先删除容器。
docker system prune [OPTIONS]
删除所有未使用的容器、网络、图像(悬空和未引用)以及可选的卷。
容器docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -p 3000:3040 -it --rm --name myContainer myApp:V1
此命令首先在指定镜像上创建一个可写的容器层,然后使用指定的命令启动它。默认情况下,此命令以附加模式运行。每次运行此命令时,它都会使用给定的镜像创建一个新容器。
默认情况下,此命令在本地搜索镜像,如果未找到,它还会在存储库中查找。
为了命名我们的容器,我们可以使用--name
选项docker run --name string Name|ImageId
。
为了以交互模式运行应用程序(从控制台读取输入等...),请使用-it
选项。--rm
选项将告诉docker在容器停止后删除容器。
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop myContainer
此命令帮助我们停止一个或多个容器。
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker start myContainer
此命令帮助我们启动一个或多个已停止的容器。默认情况下,它以分离模式运行。
docker restart [OPTIONS] CONTAINER [CONTAINER...]
docker restart myContainer
重新启动一个或多个容器。
docker rename CONTAINER NEW_NAME
docker rename myContainer myNewContainer
允许我们重命名已创建的容器。
docker ps [OPTIONS]
默认列出所有正在运行的容器。
要列出所有容器,请使用-a
选项。
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm myContainer
此命令允许我们删除一个或多个容器。
docker logs [OPTIONS] CONTAINER
docker logs myContainer
获取容器的日志。
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
在容器和本地文件系统之间复制文件/文件夹。这可以在一些场景中使用,例如当我们想要将日志文件从容器拉取到本地文件系统进行调试时。
docker login [OPTIONS] [SERVER]
docker login localhost:8080
登录到 Docker 注册表。
docker logout [SERVER]
docker logout localhost:8080
从 Docker 注册表注销。
docker push [OPTIONS] NAME[:TAG]
docker image push myApp:V1
使用 docker image push 将您的图像分享到 Docker Hub 注册表或自托管注册表。
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull ubuntu:20.04
Docker Hub 包含许多预构建的镜像,您可以直接拉取并试用,而无需自行定义和配置。
此命令允许我们下载特定镜像或一组镜像(即存储库)。
希望您对 docker 基础知识有了很好的理解,知道如何在 docker checkout第 2 部分
中管理数据 ,感谢您的阅读!!