Docker构建容器

Docker概述

docker docs

docker hub

docker架构

Docker使用客户端-服务器架构。Docker客户端(client )与Docker守护进程(daemon)通信,后者负责构建、运行和分发Docker容器的繁重工作。Docker客户端和Docker守护进程可以在同一个系统上运行,也可以将Docker客户端连接到远程的Docker守护进程。Docker客户端和守护进程使用REST API通过UNIX套接字(sockets )或网络接口通信。另一个Docker客户端是Docker Compose,它允许使用由一组容器组成的应用程序。

图片来自docker官方网站https://docs.docker.com/get-started/overview/

镜像

镜像是一个只读的模板,包含创建Docker容器的说明。通常,一个镜像基于另一个镜像,并有一些额外的定制。例如,可以构建一个基于ubuntu镜像的镜像,安装Apache web服务器和应用程序,以及运行应用程序所需的配置细节。可以创建自己的镜像,也可以只使用其他人创建并在注册表中发布的镜像。要构建自己的镜像,需要创建一个Dockerfile,使用简单的语法定义创建和运行镜像所需的步骤。Dockerfile中的每一条指令都会在镜像中创建一个层。当更改Dockerfile并重建镜像时,只有那些更改的层会被重建。与其他虚拟化技术相比,这是使镜像轻量级、小巧和快速的部分原因。

容器

容器是镜像的可运行实例。

  • 可以使用Docker API或CLI创建、启动、停止、移动或删除容器。
  • 可以将容器连接到一个或多个网络,为其附加存储空间,甚至根据其当前状态创建新镜像。默认情况下,一个容器与其他容器及其宿主机是相对隔离的。
  • 可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。
  • 容器由它的镜像以及在创建或启动它时提供给它的配置选项定义。当容器被移除时,任何未存储在持久存储中的对其状态的更改都会消失。

容器是一个sandboxed process,与主机上的所有其他进程隔离。这种隔离利用了kernel namespaces和cgroups。可以在本地机器、虚拟机上运行或部署到云端;具有可移植性(可以在任何操作系统上运行);与其他容器隔离,并运行自己的软件、二进制文件和配置。

运行一个ubuntu容器,以交互方式连接到本地命令行会话,然后运行 /bin/bash

docker run -i -t ubuntu /bin/bash

当您运行此命令时,将发生以下情况(假设您使用默认注册表配置):

  1. 如果您没有本地的ubuntu镜像,Docker将从配置的注册表中拉取它,就像手动运行Docker pull ubuntu一样。
  2. Docker会创建一个新容器,就像手动运行Docker container create命令一样。
  3. Docker为容器分配了一个读写文件系统,作为它的最后一层。这允许一个正在运行的容器在其本地文件系统中创建或修改文件和目录。
  4. 由于没有指定任何网络选项,Docker会创建一个网络接口将容器连接到默认网络。这包括为容器分配IP地址。默认情况下,容器可以使用主机的网络连接连接到外部网络。
  5. Docker启动容器并执行/bin/bash.因为容器以交互方式运行,并且连接到终端(因为有-i和-t标志),所以可以使用键盘提供输入,同时将输出记录到终端。
  6. 当你输入exit来终止/bin/bash命令时,容器会停止,但不会被移除。您可以重新启动它或删除它。

容器镜像

当运行容器时,它使用一个隔离的文件系统。这个自定义文件系统由容器镜像提供。镜像包含容器的文件系统,它必须包含运行应用程序所需的一切——所有依赖项、配置、脚本、二进制文件等。镜像还包含容器的其他配置,如环境变量、要运行的默认命令和其他元数据。

Docker实践

第一步

在工程项目文件夹中写好Dockerfile,如下:

FROM 安装好anaconda3的镜像

ADD ./ /opt/test/

WORKDIR /opt/test/

RUN apt update -y && apt install -y libopenblas-dev

RUN /root/anaconda3/envs/cpu/bin/pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

RUN chmod +x ./start.sh

CMD [“/bin/sh”,”-c”, “./start.sh”]

拉取一个具有相关配置和环境的镜像;

然后将当前文件夹中的文件添加到容器中/opt/test的目录下;

工作目录为/opt/text;

然后更新安装包并安装libopenblas-dev;

再安装项目依赖的第三方库;

运行当前目录下的start.sh文件

第二步

执行docker build -t image_name ./ –network=host

第三步

镜像构建好了之后使用docker run -itd -p 12345:12345 –name contrainer_name image_name构建容器

因为我的项目是一个web服务,因此设置了端口的对应关系,宿主机的端口12345,对应容器内的端口为12345

简单docker命令

列出本地镜像使用docker image命令

查看容器信息使用命令docker ps -a,得到容器ID(CONTAINER ID)。

使用命令docker exec -it CONTAINER ID /bin/bash进入容器

使用ctrl+D或者exit退出容器

使用docker start CONTAINER ID可以启动

复制本地文件到docker容器中docker cp

docker cp 源文件夹/文件 容器ID:目标文件夹

宿主机和docker中的文件关联 ,使用-v

例如:使用镜像bitnami/mxnet

docker run -itd –name mxnet1 -v /home/project/:/opt/test/ bitnami/mxnet

此命令将宿主机的文件和容器中的文件指向同一个地址,修改其中一个可以同步到另一个,比如在宿主机中添加一个文件,文件会同步到docker容器中

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注