一般,从Docker中已有的镜像,通过Docker的run参数可从镜像创建实例。当实例创建,将一并创建该实例的容器。容器同镜像相似,内部存储了实例运行中相对镜像所做的变更。
使用run参数从镜像创建一个容器并启动该实例。例如,启动刚才获取的centos镜像的新实例。
#docker run -i -t centos 0;@24dc643ad20a:/[root@a89fd26b68e0 /]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 0;@24dc643ad20a:/[root@a89fd26b68e0 /]# nslookup bash: nslookup: command not found 0;@24dc643ad20a:/[root@a89fd26b68e0 /]# yum install nslookup -y |
当启动新实例后,会切入该实例中的终端,可以看到该终端已经是CentOS的环境了,@后面的是该实例所在容器的ID。
Docker的运行参数如下:
docker run -it –name 容器别名 其他参数 镜像仓库名称:版本 要在容器实例中运行的命令
如果没有提供要在容器实例中运行的命令,则默认运行命令行。如果容器中运行的命令已经终止(不论正常结束或是异常结束),该实例将停止,对应的容器也就处于停止状态。我们可以使用
docker start 容器名称或容器ID
来启动处于停止状态的容器,该方法将从停止的容器启动实例并重新运行创建该容器时执行的命令,如该容器由下列命令创建
docker run -it –name main centos:centos6 /usr/bin/mysql
则当实例销毁后再通过命令
docker start main
再次启动时仍将运行/usr/bin/mysql,此时实例将后台运行,若要切入运行中的容器(实例),可以执行
docker attach 容器名称或容器ID
需要停止时可以通过
docker stop main
来停止刚才建立的实例
从镜像启动实例生成的容器,保存了该实例运行时对文件系统所做的一切变更,可以在宿主的终端中执行commit参数来将上述实例的变更保存为/回镜像
#docker commit 24dc643ad20a 6a99041b562fff25160e93ce8fbfddcf7b52fccb0eab562461e00288a0db8360 |
变更一经保存,会返回新的镜像ID
一旦新的镜像创建,可以从该新镜像建立实例
#docker run -i -t 6a99041b562f 0;@b39b435bfc78:/[root@b39b435bfc78 /]# nslookup > www.baidu.com. Server: 172.16.5.8 Address: 172.16.5.8#53 Non-authoritative answer: |
小贴士: 向Docker提供容器或镜像ID时,可以只提供该ID的一部分,只要提供的部分具有唯一性即可。另外,输入一部分ID后,按下TAB建可实现ID的自动补全。
另外,在docker的images参数中也可以看到刚才保存变更时创建的镜像
#docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE <none> <none> 6a99041b562f 20 minutes ago 275.9 MB Centos latest eeb3a076a0be 2 weeks ago 196.7 MB |
要在每一次保存变更前都查询id实际是一件相当令人不爽的事,因为很麻烦,很麻烦,很麻烦!!!所以,可以在启动一个新实例的时候为这个实例对应的容器指定一个名称,例如从刚才保存的镜像6a99041b启动一个新的实例,便可以将其容器命名
#docker run -i -t --name "main" 6a99041b 0;@4ea285858de2:/[root@4ea285858de2 /]#exit exit |
小贴士: 向Docker提供参数时,需要遵守参数的顺序,如—name参数不能放在ID之后,否则报错,且难以根据报错信息定位参数错误。
之后,可以不使用ID而是使用名称作为凭据来提交变更
#docker commit main 5b7dcb396eb90610cd81b16e83bbfecd243c04022ed538d1ff31a03f78c9f247 |
那么,能不能通过名称这个凭据来启动实例呢
#docker run -i -t main Unable to find image 'main:latest' locally |
运行下docker images看下
#docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE <none> <none> 5b7dcb396eb9 18 minutes ago 275.9 MB centos latest eeb3a076a0be 6 weeks ago 196.7 MB |
很显然,未能找到main镜像的latest版本的镜像。而刚才从main容器建立的新镜像不包含名称(REPOSITORY,仓库)和版本(TAG,标记)
启动一个docker虚拟环境是从已有的镜像启动的而非容器,先前我们启动实例时实际是为运行该实例的容器命名,而非镜像。docker commit时需要指定的参数是容器的ID或名称,因此使用docker commit来提交保存变更到新镜像时可以使用先前定义的名称main来作为凭据。
那么如何才能在提交变更时设定新镜像的名称和版本呢?只需要增加一个参数即可。
原先,我们采用这样的格式来提交变更:
docker commit <容器名/容器ID>
现在只需增加一个参数来指定新镜像的名称和版本即可,上述命令可更改为
docker commit <容器名/容器ID> 镜像名称:版本
我们运行下命令看看
#docker commit main main:lastest |
我们再看一下镜像
#docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE main latest c8e5f7af1d91 11 seconds ago 275.9 MB <none> <none> 5b7dcb396eb9 38 minutes ago 275.9 MB Centos latest eeb3a076a0be 6 weeks ago 196.7 MB |
不难发现,刚才建立的镜像已经有了名称和版本,试着用名称作为凭据来运行下看看
#docker run -i -t main 0;@1b648dcd066e:/[root@1b648dcd066e /]# |
这样就可以用名称来启动实例了。
上面说到了如何从镜像运行实例,实际使用中我们通常会需要利用docker内部运行的实例来提供服务,这就涉及两个问题:1是如何向外映射端口,2是如何向内映射宿主机文件夹
Docker的端口映射默认采用的是NAT方式,通过iptables实现,若要实现端口映射只需增加-p参数即可,如下
docker run -d -p 监听地址:对外端口:内部端口 镜像名称:镜像版本
若要只和宿主机间暴露端口,可以将监听地址设置为127.0.0.1,笔者也测试了[::1]这样的IPv6环回地址,结果提示无法识别。若不填写 监听地址: 则默认监听全部接口
接下来我们试着做另一件事: 将宿主机的 /data/mysql 映射到docker实例的 /var/lib/mysql 目录上
Dockers目录映射的参数是-v 因此可以这么写
docker run -d -v /data/mysql:/var/lib/mysql mysql:latest
看上面的命令不难明白,映射宿主机文件夹的方式是这样的
docker run -d -v 宿主机文件夹:内部文件夹 镜像名称:镜像版本
至此,对docker从镜像启动实例的简单介绍就结束了。
一旦将某个容器中的变更提交并生成新的镜像,该容器就没有意义了,可以通过docker rm命令来删除。
请注意,本站的所有文章均要求阁下在转载时注明出处和原作者,阁下转载本站文章即表示阁下同意并遵守此规程,除非特别注明转载出处,否则文章即为其发布者所著。本站及文章作者保留文章的著作权并有权在阁下违反上述规程时予以追究。
本文链接地址: 初识DOCKER(4)–运行实例和提交变更