当我们说 "归档文件包含了容器的所有文件,但不包含容器的元数据和配置",我们是指
docker export
命令导出的 tar 归档文件包含了容器的文件系统中的所有文件,包括应用程序、库、数据等。但是,这个归档文件不包含关于容器本身的信息,例如环境变量、运行命令、网络设置等。这些信息是 Docker 在运行容器时需要的,它们定义了容器的运行环境和行为。例如,环境变量可以用于配置应用程序,运行命令定义了容器启动时要执行的命令,网络设置定义了容器的网络接口和路由。
当你使用
docker import
命令将这个归档文件导入到 Docker 中时,你会得到一个新的镜像。这个镜像只包含文件系统,不包含元数据和配置。你需要在运行这个镜像时提供这些信息,例如使用docker run -e VAR=value -p 80:80 image
命令来设置环境变量和端口映射。
导出镜像
-
如果在公司内部有私有的
Docker
镜像仓库,我们可以把构建好的镜像上传至私有仓库,然后再从测试/线上的机器拉取对应的镜像即可,启动容器即可。 -
在没有私有的
Docker
镜像仓库的情况下,可以将咱们的镜像进行导出,导出之后再拷贝到目标的机器上进行导入,然后启动容器。
如何导出镜像
一、docker save
是用来将一个或多个image
打包保存的工具。
docker save -o images.tar postgres:9.6 mongo:3.4
二、docker export
是用来将container
的文件系统进行打包的。
docker export -o postgres-export.tar postgres
两者之间有什么区别呢:
-
docker save
保存的是镜像(image),docker export
保存的是容器(container); -
docker load
用来载入镜像包,docker import
用来载入容器包,但两者都会恢复为镜像;*docker load
不能对载入的镜像重命名,而docker import
可以为镜像指定新名称。
docker save
的应用场景是,如果你的应用是使用docker-compose.yml
编排的多个镜像组合,但你要部署的客户服务器并不能连外网。这时,你可以使用docker save
将用到的镜像打个包,然后拷贝到客户服务器上使用docker load
载入。
docker export
的应用场景主要用来制作基础镜像,比如你从一个ubuntu
镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export
保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
四、导入镜像
一、使用 docker import
命令则可将这个镜像文件导入进来(跟docker export
配对使用)。
docker import /path/to/latest.tar
二、使用docker load
命令则可将这个镜像文件载入进来(跟docker save
配对使用)。
docker load -i /path/to/fedora-latest.tar
五、启动容器
假设我们已经导入了服务端镜像my-server
以及前端镜像my-front
,我们该如何启动呢?
首先我们需要先创建一个网络,让容器具备互联的基础:
docker network create -d bridge my-net
然后,分别启动一下我们的服务端和前端容器。
-
服务端启动:
docker run -d -p 8360:8360 --network my-net --network-alias myserver my-server
-
web端启动
docker run -d -p 8080:80 --network my-net --network-alias myfront my-front
真实场景下的部署体验感觉
一、传统模式下的部署
传统的部署模式下,我们需要挨个去安装各种各样的环境:
安装完成之后,再拷贝相关的代码以及配置文件到目标的机器上:
启动服务,调试一下前端、服务端、数据库是否能正常链接。
二、使用Docker改造之后的部署
-
安装docker 环境
-
创建 docker 网络:sudo docker network create -d bridge my-net
-
上传镜像文件(my-front.tar、my-server.tar)至服务器
-
导入镜像:sudo docker load -i my-front.tar、sudo docker load -i my-server.tar
-
启动服务端容器:docker run -d -p 8360:8360 --network wenjuan-net --network-alias myserver my-server
-
启动系统前端容器:sudo docker run -d -p 8080:80 --network my-net --network-alias myfront my-front