docker 调用ntp docker 调用手机相机_docker image存储路径

Docker是一个开源的应用容器引擎。可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。

镜像和容器


通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。

容器是镜像的运行实例,当被运行时有镜像状态和用户进程,可以使用docker ps 查看。

容器和虚拟机


容器在linux上本机运行,并与其他容器共享主机的内核,它运行的一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。

虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。

docker 调用ntp docker 调用手机相机_docker 添加端口映射_02



docker 调用ntp docker 调用手机相机_docker 删除image_03

Docker Host指操作的宿主机;

Image 负责与镜像源数据有关的存储、查找,镜像层的索引、查找以及镜像tar包有关的导入、导出操作;

Docker daemon核心程序负责各种docker操作,比如下载镜像,运行容器等;用户是使用Docker Client与Docker Daemon建立通信;

Registry是一个共享docker镜像的镜像仓库服务。

Docker基本操作


docker run 指运行一个Image,创建container

比如docker run nginx运行nginx服务器,运行前会先检查这个容器在本地是否存在对应的image,如果没有,会从远端Registry去下载。

docker 调用ntp docker 调用手机相机_docker 调用ntp_04

docker images可以查看本地有哪些image,显示包含本地所有docker的image:

docker 调用ntp docker 调用手机相机_docker 删除image_05

docker run -p 8080:80 -d daocloud.io/nginx

-p:指做端口映射,将nginx的80端口映射为本地host宿主机的8080端口

-d:允许程序直接返回,把container作为守护进程(守护进程是一个在后台运行并且不受任何终端控制的进程)来执行,产生的一长串字符就是容器ID。

docker ps可以查看当前正在运行的docker container:

docker 调用ntp docker 调用手机相机_docker image存储路径_06



docker 调用ntp docker 调用手机相机_docker 删除image_03

add0a0d934f9指CONTAINER ID ;

IMAGE标识从哪个image来的;

PORTS表示端口映射关系;

目前相当于在本地8080端口开启了nginx服务,查看宿主机的8080服务:

docker 调用ntp docker 调用手机相机_docker 添加端口映射_08

如果想要让nginx界面显示docker相关的页面,首先上传一个index.html文件:

docker 调用ntp docker 调用手机相机_docker导出镜像到本地_09

然后将文件cp复制到容器里:

[root@localhost ~]# docker cp index.html cf6cef3ca485://usr/share/nginx/html

docker 调用ntp docker 调用手机相机_docker 添加端口映射_10

cf6cef3ca485指容器ID;

usr/share/nginx/html指容器内部文件的路径;

再次查看是成功的:

docker 调用ntp docker 调用手机相机_docker导出镜像到本地_11

docker stop 容器ID,停止docker容器:

docker 调用ntp docker 调用手机相机_docker 添加端口映射_12

此时主机HOST的8080服务是关闭的:

docker 调用ntp docker 调用手机相机_docker 添加端口映射_13

此时再执行docker run -p 8080:80 -d daocloud.io/nginx,查看8080服务,发现网页显示仍旧是缺省的nginx服务。这是因为执行docker run的时候是同时执行了docker create 和docker start两步操作。

每次run一个镜像都是新建一个容器,拷贝进nginx的文件,是拷贝到了一个容器里。再运行镜像的时候是新建了一个容器,容器ID是变化的:

docker 调用ntp docker 调用手机相机_docker 调用ntp_14

之前的文件并没有更改,如果再重启之前那个容器,网页依然显示docker的信息:

docker 调用ntp docker 调用手机相机_docker导出镜像到本地_15

docker在容器内所做的改动都是临时的,目前新建容器ID edae0ad9843b,需要通过docker commit 导出成 image 使用,这是制作Docker Image 其中一种方式(后面会分享另一种方式Dockerfile)。

docker 调用ntp docker 调用手机相机_docker 删除image_16

保存时可以添加名称,比如nginx-fun,或者其他参数。830a246c7b88和270266e20467是相同的,只是后者有名称。镜像没有运行过,也就是没有建立容器时可以通过docker rmi删除image:

docker 调用ntp docker 调用手机相机_docker 调用ntp_17

若是镜像有运行过,docker rmi无法删除:

docker 调用ntp docker 调用手机相机_docker导出镜像到本地_18



docker 调用ntp docker 调用手机相机_docker 删除image_03

Tips:

-a :提交的镜像作者;

-c :使用Dockerfile指令来创建镜像;

-m :提交时的说明文字;

-p :在commit时,将容器暂停;

docker rm     刪除已经结束的 container;

docker rmi    删除未运行的 image;

docker cp     在 host 和 container 之间拷贝文件;

docker commit 保存改动为新的 Image,将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像。

容器和镜像区别


写在这里,可能会对容器和镜像有些疑问,查找资料时发现下面这张图很好的解释了他们的区别:

docker 调用ntp docker 调用手机相机_docker导出镜像到本地_20

镜像(Image)就是一堆多个只读层(read-only layer)重叠的统一视角,除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够在主机(运行Docker的机器)的文件系统上访问到。统一文件系统(union file system)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

 总结:容器 = 镜像 + 可读写层。并且容器的定义并没有提及是否要运行容器。

一个运行态容器(running container)被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程,正是文件系统隔离技术使得Docker成为了一个前途无量的技术。一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层(read-write layer)。