Docker是什么

Docker是一个软件平台,可使构建、测试和部署应用程序更加快速。Docker将代码打包成名为容器(Container)的标准化单元,这些单元包含运行软件所需的所有内容,例如库、系统工具、代码和运行时等。

Docker的工作原理是提供一套标准环境来运行代码。与虚拟机用于虚拟化(无需直接管理)服务器的硬件类似,Docker容器用于虚拟化服务器的操作系统。Docker安装在每个服务器上,并提供构建、启动、停止容器的简单命令。

docker

名词解释

  • 容器(Container):简单来说,容器是一个运行中的沙箱进程,它与其他进程是隔离的。容器即可以运行在本地机器上,也可以运行在虚拟机里或者运行在云上。容器的可移植性非常好,可以运行在多种操作系统上。容器包含了自己运行时需要的软件、二进制文件、配置文件等数据。
  • 容器镜像(Container Image):容器镜像可以理解为容器的静态定义文件。当一个容器运行时,它需要一个隔离的文件系统。这个定制化的文件系统就是由容器镜像提供的。因为镜像包含了容器的文件系统,所以它必须包含运行应用程序所需的所有数据,例如所有的依赖、配置项、脚本、二进制文件等。镜像还包含环境变量、默认启动命令等其它元数据。

Docker小试

安装Docker Desktop

Docker Desktop是在本地机器运行Docker的GUI软件。通过使用Docker Desktop可以更加方便的在本地进行Docker相关的开发。

下载与安装说明详见这里

准备工作

我们需要准备一个可运行的应用程序,用来构建一个新的Docker镜像。这个可运行的运行程序可使用Docker官网的Demo应用。使用Git命令如下:

git clone https://github.com/docker/getting-started.git

试用Docker

生成Dockerfile

要使用Docker,首先需要建立容器镜像。而容器镜像的构建,需要使用Dockerfile文件。Dockerfile是一个简单的文本文件,不带有任何扩展名。Dockerfile中包含一系列Docker用来构建容器镜像的指令。生成Dockerfile步骤如下:

1 进入getting-started/app目录后:

cd getting-started/app

2 创建空白Dockerfile文件:

touch Dockerfile

3 添加如下内容到Dockerfile文件:

# syntax=docker/dockerfile:1
   
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

构建镜像

完成Dockerfile文件的编辑后,就可以根据该文件构建容器镜像了。构建命令如下:

docker build -t getting-started .

命令docker build就是根据Dockerfile文件来构建容器镜像。该命令执行过程中,会下载很多“层(layers)”。这是因为Dockerfile中声明从node:18-alpine基础镜像来构造新的镜像。但因为本地机器没有这个基础镜像,所以Docker需要先进行下载。

dockerbuild

Docker下载完基础镜像后,Dockerfile的指令会拷贝应用程序所在目录(/app),然后使用“yarn”来安装相关依赖项。指令CMD指定了容器启动时默认运行的命令。

命令docker build的参数-t是用来给容器镜像打标签的。这个标签最好是易读易懂的文字,在这个例子中使用的是getting-started。

命令docker build最后的 . 是用来告诉Docker在当前目录寻找Dockerfile文件。

运行容器

运行容器使用docker run命令:

docker run -dp 3000:3000 getting-started

参数-d指定容器进程以“detached”模式运行(即后台运行),参数-p创建容器宿主端口3000与容器端口3000的映射关系。

容器启动后,可通过在浏览器访问http://localhost:3000,来验证运行情况。一切顺利的话,会出现如下页面:

todo-list-empty

这是一个Node.js实现的todo list网页应用。

查看容器实例

因为docker run -d启动的容器是“detached”模式,所以当需要再次查看容器运行相关信息时,可使用docker ps命令:

docker ps

输入命令后,终端会显示类似如下信息

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
df784548666d        getting-started     "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        0.0.0.0:3000->3000/tcp   priceless_mcclintock

当然,也可以使用docker desktop来查看:

dashboard-two-containers.png

学到的Docker命令

一共三个

命令 说明
docker build 构建容器镜像
docker run 运行容器
docker ps 查看容器运行时相关信息

参考链接