简介
Docker 是什么
Docker 是一个用于构建、传送和运行应用程序的平台,即可以将程序本体、配置文件及各种依赖打包以便移植——只要在开发环境运行成功,在其他有 Docker 的环境也就一定可以运行成功(甚至不需要管操作系统是否相同)。
Docker 也可以提供多个相互独立的开发环境并方便地进行管理,不会因安装不同开发环境的各种依赖而出现版本冲突或污染主系统环境——在这个方面,Docker 起到的作用与虚拟机类似,但没有那么大的性能损失。
一些相关概念
- Docker:一个运行平台,上面可以跑多个不同的容器,它们相互隔离;
- 容器:里面有应用程序及依赖(类似面向对象语言的实例);
- 镜像:一个只读模版,可以用于创建容器(类似面向对象语言的类);
- 仓库:用于存储镜像(例如 DockerHub)。
下载和安装
Docker 的官网地址是:Docker: Accelerated Container Application Development,选择自己系统对应的版本下载即可。
Windows 需先开启 Hiper-V 功能(仅专业版有,家庭版还需另外的设置),在控制面板 – 程序 – 启用或关闭 Windows 功能 – 勾选 Hiper-V,之后重启即可。若版本为 64 位家庭或专业版 v1903 及以上则无需开启 Hyper-V
安装完成后需先启动,之后可在命令行输入 docker version
查看版本,确认已成功安装并运行。
HelloDocker
容器化:将应用程序打包成容器,并在容器中运行。
随便找个地方创建 HelloDocker
文件夹作为项目文件夹。可以用 VS Code 打开并编辑这个项目。
创建应用程序
我们需要借助一个需要安装配置环境的应用程序来体现 Docker 的优势。例如,创建 index.js
作为应用程序:
console.log("Hello Docker!")
要在网页之外的地方运行 JavaScript,需要安装 Node.js,我们不希望把它安装在主机中污染环境,希望用后即弃,则可以借助 Docker 实现环境隔离——这样就可以使 Node.js 只影响这个容器,而不是安装到主机的文件系统中。
创建 Dockerfile
在项目目录下创建 Dockerfile
文件。注意无后缀,且大小写不能改,它的作用类似 makefile,可以配置 index.js
运行所需的环境。
总之,Dockerfile 可以帮助执行以下内容:
- 安装操作系统;
- 安装 Node.js 作为 JavaScript 运行环境;
- 复制应用程序(
index.js
)、依赖包、配置文件,即指定来镜像文件中有哪些东西、镜像文件的目录结构; - 使用镜像创建容器时要执行的命令,例如
CMD node /index.js
,让应用程序跑起来。
即:Dockerfile 通过以上步骤可以构建镜像,如有需要,还可以在执行 Dockerfile 后执行镜像,创建容器。
Dockerfile 内容如下:
FROM node:14-alpine
COPY index.js /
CMD node /index.js
其中,FROM node:14-alpine
指定了基础镜像为 node:14-alpine
,这是一个轻量级的 Alpine Linux 基础镜像,其中已经准备好了 Node.js 14;COPY index.js /
表示将本地文件系统中的 index.js
文件复制到镜像中的根目录 /
下;CMD node /index.js
表示容器启动时要运行 node /index.js
命令,该命令就是运行 index.js
文件。
构建镜像时,除非你清楚只需要构建这一次,否则请尽量避免使用 latest
来指定最新版本,以保证每次构建的一致性。
使用 Dockerfile 构建镜像
在终端运行以下命令:
docker build -t hellodocker .
它的含义是:使用当前目录 .
下的 Dockerfile
文件,通过 -t
选项命名为 hellodocker
,来构建一个 Docker 镜像。这个镜像会被保存在 Docker 客户端的虚拟文件系统中,而不是直接保存在本地主机的文件系统中。
使用 docker images
可以查看所有已有的镜像,或者直接去客户端看。
使用镜像创建和运行容器
在终端运行以下命令:
docker run --name hellodocker-1 hellodocker
其中 hellodocker
就是之前构建的镜像文件,hellodocker-1
是从镜像创建的容器,被用 --name
命了名。
如果在 Dockerfile 所在目录下修改了 index.js
的源码,之前构建的镜像 hellodocker
并不会被修改。这是因为 Docker 在构建镜像时,会将应用程序的源码复制到镜像中,并在其中生成可执行文件或二进制文件,已经跟项目目录下的文件无关了。要让这种修改能实时体现到镜像或容器上,可以使用 Docker 的多阶段构建功能或 Docker 挂载卷的功能。
注意,docker run
是创建一个新的容器并运行,若想再次运行之前创建的容器,请使用
docker start hellodocker-1
此时容器会在后台运行,并不会把输出打印到宿主机上(输出结果可以用 docker logs hellodocker-1
查看)。若想打印,请使用
docker start -a hellodocker-1
Docker 和三层“文件系统”
基于 Docker,电脑中相当于有三层“文件系统”:一是主机自己原来的文件系统,二是 Docker 存镜像、运行容器的自己的虚拟文件系统(虽然不太准确,Docker 不是一个虚拟文件系统,而是一个容器化平台,它通过 Linux 命名空间和控制组等技术来实现应用程序运行环境的隔离,但可以这么粗略理解,即 Docker 就是虚拟机软件,如 Virtual Box),三是镜像中自己又有一套文件系统(可以理解成每个镜像就是一台虚拟机,而运行起来的虚拟机就是容器);这样就实现了应用程序开发的环境隔离和高可移植性。
总之,Docker 可以粗略看作是一个性能消耗小、可移植性强的虚拟机软件。
Docker Compose
Docker Compose 是 Docker 官方开源的用于定义和运行多容器 Docker 应用程序的工具(例如前后端分离的网站),可以用 docker-compose.yml
文件来配置多个位于不同容器的应用程序的服务,之后用一条命令即可创建多个镜像、启动多个服务并创建多个容器,最后运行这些应用程序。
附录:常用 Docker 命令
镜像相关命令
docker images
:列出系统中所有已有的 Docker 镜像。
docker search <image_name>
:搜索指定名称或关键字的 Docker 镜像。
docker pull <image_name>
:从 Docker Hub 或其他镜像仓库中下载指定的 Docker 镜像。
docker build -t <image_name>
:使用 Dockerfile 文件构建新的 Docker 镜像。
docker push <image_name>
:将本地的 Docker 镜像推送到 Docker Hub 或其他镜像仓库中。
容器相关命令
docker ps
:列出所有正在运行的 Docker 容器。
docker ps -a
:列出所有已经停止的 Docker 容器。
docker run <image_name>
:创建一个新的 Docker 容器并启动它。
docker start <container_id_or_name>
:启动指定的 Docker 容器。
docker stop <container_id_or_name>
:停止指定的 Docker 容器。
docker rm <container_id_or_name>
:删除指定的 Docker 容器。
docker exec <container_id_or_name> <command>
:在运行中的 Docker 容器中执行指定的命令。
卷相关命令
docker volume ls
:列出所有已经创建的 Docker 卷。
docker volume create <volume_name>
:创建一个新的 Docker 卷。
docker volume inspect <volume_name>
:查看指定的 Docker 卷的详细信息。
docker volume rm <volume_name>
:删除指定的 Docker 卷。
网络相关命令
docker network ls
:列出所有已经创建的 Docker 网络。
docker network create <network_name>
:创建一个新的 Docker 网络。
docker network connect <network_name> <container_id_or_name>
:将指定的 Docker 容器连接到指定的 Docker 网络中。
docker network disconnect <network_name> <container_id_or_name>
:将指定的 Docker 容器从指定的 Docker 网络中断开连接。
发表回复
要发表评论,您必须先登录。