Docker是一种容器化技术,它通过容器来构建、运行、管理以及分发应用程序。容器可以被看作是一个包含应用程序代码、所需库文件以及其他依赖项的软件单元。这种技术允许开发者在不同的环境之间无缝迁移应用程序,而无需担心环境差异导致的问题。
假设有两个不同的Python应用程序,需要在同一个服务器上运行(无论是物理机还是虚拟机)。进一步假设这两个Python应用程序需要不同版本的Python以及不同的库和依赖项。由于在同一台机器上不可能安装不同版本的Python,要么需要两台不同的物理机,要么需要一台足够强大的物理机来托管两台虚拟机。这两种解决方案都会产生相当大的成本。为了避免这种成本,并且同时拥有一个高效的解决方案,可以使用Docker。在希望运行和安装Docker的机器上,这台机器被称为“宿主机”。
Docker Engine:Docker Engine是一个开源的容器化技术,用于构建和容器化应用程序。它作为一个基于客户端的应用程序,其核心组件包括服务器、REST API和客户端。
Docker Daemon:服务器运行Docker Daemon,这是一个进程,用于管理Docker镜像、容器、网络和存储卷。用户可以通过Docker客户端与之交互。
Docker Engine REST API:这是一个应用程序用于与Docker Daemon交互的API,可以通过HTTP客户端访问。
DockerCLI:用户可以通过这个命令行界面客户端使用Docker命令与Docker Daemon交互。
Docker Image:Docker镜像是一个包含应用程序及其运行所需的所有依赖项的模板。
Docker Container:Docker镜像的运行实例被称为Docker容器。
DockerHub:Docker Hub是一个在线仓库,其中提供了现成的Docker镜像。
可以从以下链接为Mac或Windows环境安装Docker Desktop:
以下是一些常用的Docker CLI命令:
docker create
该命令用于基于指定镜像创建一个新的容器。例如:
$ docker create ubuntu
上述命令使用最新的Ubuntu镜像创建一个容器。
docker start
该命令用于启动任何已停止的容器。例如:
$ docker start 70257
上述命令启动容器ID以70257开头的容器。
docker stop
该命令用于停止任何正在运行的容器。例如:
$ docker stop 70257
上述命令停止容器ID以70257开头的容器。
docker run
该命令用于创建一个容器然后启动它。例如:
$ docker run ubuntu
上述命令从最新的Ubuntu镜像创建一个容器并启动它。如果要与创建的容器交互,可以在docker run命令前指定‘-it’:
$ docker run -it ubuntu
这将提供一个终端,用于与创建的Ubuntu容器交互。
docker rm
该命令用于删除一个容器。例如:
$ docker rm 70257
上述命令删除容器ID以70257开头的容器。
docker ps
该命令用于查看Docker主机上运行的所有容器。例如:
$ docker ps
要查看所有容器,无论其运行状态如何,可以在上述命令中加入‘-a’:
$ docker ps -a
docker images
该命令用于查看Docker主机上存在的所有Docker镜像。例如:
$ docker images
步骤1:创建Dockerfile
创建Docker容器的第一步是创建一个Dockerfile。Dockerfile是一个文本文件,包含了创建容器所需的所有命令。Docker镜像有一个基础镜像,在其上添加层,每一层都添加一些依赖项。
FROM continuumio/anaconda3:4.4.0
COPY . /usr/app/
EXPOSE 5000
WORKDIR /usr/app/
RUN pip install -r requirements.txt
CMD python flask_api.py
在上面的代码中,从一个Anaconda的基础镜像开始。COPY命令用于将当前目录中的所有文件复制到指定目录。EXPOSE命令告诉Docker在运行时从指定端口获取所有所需信息。WORKDIR命令定义了容器的当前工作目录。接下来的命令是运行requirements.txt文件,该文件安装所有必需的Python依赖项。最后一个命令用于运行flask_api.py文件。该文件可以包含一个训练好的机器学习模型,用于预测新数据。该文件将服务所有API请求,因此将包含一个可以被API端点调用的函数。
步骤2:使用Dockerfile构建镜像
要从创建的Dockerfile构建Docker容器,需要运行docker build命令,根据Dockerfile中的指令构建镜像。
$ docker build -t IMAGE_NAME:TAG .
在上述代码中,用户指定了镜像名称和标签。给镜像打标签相当于给镜像一个别名,有助于区分镜像的不同版本。
$ docker run IMAGE_NAME:TAG