如何让docker run 执行命令命令执行时不属于root用户

出于安全原因,运行的 server 上的各种 app 是绝对不能以 root 身份运行的。这一条适合 Docker 么?我认为 Docker 容器本身提供了安全保障,容器内可以使用 root 权限启动 app。
One of the specific goals of user namespaces is to allow a process to have root privileges for operations inside the container, while at the same time being a normal unprivileged process on the wider system hosting the container.To support this behavior, each of a process's user IDs has, in effect, two values: one inside the container and another outside the container.引自:同事给的。
目前docker并不支持用户命名空间。因此容器里的app,如果能够用非root用户执行那么最好。用户命名空间对容器安全非常重要,能够有效降低容器对host的威胁。
目前docker并不支持用户命名空间。因此容器里的app,如果能够用非root用户执行那么最好。用户命名空间对容器安全非常重要,能够有效降低容器对host的威胁。
在最新的docker 1.10里面已经支持user namespace和seccop,之前那些都是老答案了,建议您升级到1.10。 &a href=&///?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&是国内率先支持docker 1.10.3的厂商,你只需要执行一句脚本,就可以方便的安装docker,获得仓库,同时我们会持续不断的做docker自动更新及镜像的升级迁移,整个过程都是透明的。
在最新的docker 1.10里面已经支持user namespace和seccop,之前那些都是老答案了,建议您升级到1.10。 是国内率先支持docker 1.10.3的厂商,你只需要执行一句脚本,就可以方便的安装docker,获得仓库,同时我们会持续不断的做docker自…
已有帐号?
无法登录?
社交帐号登录
愿做东风,处处解冻使用Docker创建两个容器的应用
- 解道Jdon
& & & &&& & &
  本教程展示如何使用两个Docker容器分别装载WordPress博客系统和MySQL数据库,Wordpress是来自于维护的可信容器。Docker的安装可见:,或者直接下载。
首先,运行:
$ docker run -d -p 80 tutum/wordpress /run.sh
这将会下载wordpress的img,通过命令:
$ docker ps
会查询当前运行的Image中有tutum/wordpress:latest 。
这是WordPress 和 MySQL在一个容器中运行。
现在我们有了一个Image,下面看看如何修改它,让MySQL存在在另外一个Docker容器中,
以交互式运行wordpress:
$ docker run -i -t tutum/wordpress bash
查看run.sh脚本:
root@dfa:/# cat run.sh
#!/bin/bash
if [ ! -f /.mysql_admin_created ]; then
/create_mysql_admin_user.sh
exec supervisord -n
现在我们不希望在这个容器中运行MySQL,通过下面方式修改:
root@dfa:/# rm /etc/supervisor/conf.d/supervisord-mysqld.conf
root@dfa:/# touch /.mysql_admin_created
在另外Docker窗口,运行docker ps会发现你的交互方式容器的ID;比如dfa
这样我们可以确认commit给文件系统我们刚才修改:
$ docker commit dfa myuser/wordpress
852e9ccd1194f5abbcbfb13c61e54a31d5b716b20bec3da39e168a
现在我们已经有了我们自己的tutum的 WordPress,不过没有激活MySQL ,我们来运行它,停止其他容器,启动这个新的image容器: myuser/wordpress.
$ docker stop dfa
$ docker stop e76
$ docker run -d -p 80 myuser/wordpress /run.sh
f1bc5c3bd28aac9a9452fdaeafb527bd56654deed70c
$ docker ps
当docker ps时,3306端口并没有像之前出现,说明mySQL未启动。
从Docker index获得我们自己的mySQL容器:
$ docker run -d -p 3306 tutum/mysql /run.sh
63acdcb93db788dc2ef72cb1f5cbfe2c180b9fdfb1b13c
$ docker ps
然后同样进入交互方式:
$ docker run -i -t tutum/mysql bash
root@a6fd073d27bb:/# cat run.sh
#!/bin/bash
if [ ! -f /.mysql_admin_created ]; then
/create_mysql_admin_user.sh
exec supervisord -n
这里我们不需要任何改变,而是要获得数据库root用户名和密码,退出Docker会看到用户名和密码:
docker run -d -p 3306 tutum/mysql /run.sh
63acdcb93db788dc2ef72cb1f5cbfe2c180b9fdfb1b13c
运行docker ps找到mysql的容器id:63a
$ docker logs 63a
=& Creating MySQL admin user with random password
========================================================================
You can now connect to this MySQL Server using:
mysql -uadmin -pqa1N76pWAri9 -h -P
Please remember to change the above password as soon as possible!
MySQL user 'root' has no password but only allows local connections
========================================================================
21:56:10,100 CRIT Supervisor running as root (no user in config file)
21:56:10,111 WARN Included extra file &/etc/supervisor/conf.d/supervisord-mysqld.conf& during parsing
21:56:10,330 INFO RPC interface 'supervisor' initialized
21:56:10,330 WARN cElementTree not installed, using slower XML parser for XML-RPC
21:56:10,330 CRIT Server 'unix_http_server' running without any HTTP authentication checking
21:56:10,330 INFO supervisord started with pid 1
21:56:11,333 INFO spawned: 'mysqld' with pid 385
21:56:12,536 INFO success: mysqld entered RUNNING state, process has stayed up for & than 1 seconds (startsecs)
进入mysql管理界面创建wordpress数据库
$ mysql -uadmin -pqa1N76pWAri9 -h 0.0.0.0 -P 49165 -e 'creat'
$ docker commit 63a myuser/mysql
c1c5e63d427cc0ab9ed439e8bfe2e95c333ec16bbd
现在我们可以停止之前的通用mysql 的Docker,运行我们自己的mysql的Docker:
$ docker stop 63a
$ docker run -d -p 3306 myuser/mysql /run.sh
最后一步,绑定wordpress和mysql两个容器
$ docker run -i -t myuser/wordpress bash
root@f74cc171d7d5:/# apt-get install curl
root@f74cc171d7d5:/# curl -L /cardmagic/8530589/raw/21c5d2f0a4f5a797e/gistfile1.txt & /app/wp-config.php
开启另外一个Docker窗口,运行:
$ docker commit f74cc171d7d5 myuser/wordpress
$ docker stop f74cc171d7d5
最后,将两者连接一起:
$ export DB_PASSWORD=qa1N76pWAri9
$ docker run -e=&DB_PASSWORD=$DB_PASSWORD& -link angry_bardeen:db -d -p 80 myuser/wordpress /run.sh
$ docker ps出现:
CONTAINER ID
2fb827d3c3a7
myuser/wordpress:latest
2 seconds ago
Up 1 seconds
0.0.0.0:49167-&80/tcp
ecstatic_thompson
5a840e255282
myuser/mysql:latest
22 minutes ago
Up 22 minutes
0.0.0.0:4/tcp
angry_bardeen,ecstatic_thompson/db
通过浏览器或$ curl http://0.0.0.0:49167/wp-admin/install.php访问确认。
| 网站地图 | 设为首页15分钟掌握15个Docker要点_运维之美_传送门
15分钟掌握15个Docker要点
音乐资源加载中...1. 获取最近运行容器的id这是我们经常会用到的一个操作,按照官方示例,你可以这样做:$ ID=$(docker run -d ubuntu echo hello world)
hello world
$ docker commit $ID helloworld
fd08a884dc79这种方式在编写脚本的时候很有用,比如你想在脚本中批量获取id,然后进一步操作。但是这种方式要求你必须给ID赋值,如果是直接敲命令,这样做就不太方便了。 这时,你可以换一种方式:$ alias dl=’docker ps -l -q’
$ docker run ubuntu echo hello world
hello world
$ docker commit `dl` helloworld
fd08a884dc79docker ps -l -q命令将返回最近运行的容器的id,通过设置别名(alias),dl命令就是获取最近容器的id。这样,就无需再输入冗长的docker ps -l -q命令了。通过两个斜引号``,可以获取dl命令的值,也就是最近运行的容器的id。2.尽量在Dockerfile中指定要安装的软件,而不用Docker容器的shell直接安装软件说实话,我有时候也喜欢在shell中安装软件,也许你也一样,喜欢在shell中把所有软件安装都搞定。但是,搞来搞去,最后还是发现,你还是需要在Doockerfile中指定安装文件。在shell中安装软件,你要这样做:$ docker run -i -t ubuntu bash #登陆到docker容器
root@db0c3967abf8:/#然后输入下面的命令来安装文件:apt-get install postgresql然后再调用exit:root@db0c3978abf8:/# exit退出docker容器,再给docker commit命令传递一个复杂的JSON字符串来提交新的镜像:$ docker commit -run=”{“Cmd”:[“postgres”,”-too -many -opts”] }” `dl` postgres太麻烦了,不是吗?还是在Dockerfile中指定安装文件吧,只要两个步骤:1.在一个小巧的Dockerfile中,指定当前操作的镜像为FROM命令的参数2.然后在Dockerfile中指定一些docker的命令,如CMD, ENTERPOINT, VOLUME等等来指定安装的软件3.超-超-超级用户你可能需要一直用超级用户来操作docker,就像早期示例里一直提示的:# 添加docker用户组
$ sudo groupadd docker
# 把自己加到docker用户组中
$ sudo gpasswd -a myusername docker
# 重启docker后台服务
$ sudo service docker restart
# 注销,然后再登陆
$ exitWow!连续三个sudo!三次化身“超级用户”,真可谓是“超-超-超级用户”啊!别担心,设置完毕,以后你就再也不用打那么多sudo了!4. 清理垃圾如果你想删除所有停止运行的容器,用这个命令:$ docker rm $(docker ps -a -q)顺便说一句,docker ps命令很慢,不知道为啥这么慢,按理说Go语言是很快的啊。 docker ps -a -q命令列出所有容器的id,然后根据id删除容器。docker rm命令遇到正在运行的容器就会失效,所以这个命令完美的删除了所有没在运行的容器。5. docker inspect输出结果的解析利器:jq要对docker inspect的输出结果进行过滤,一般情况下,用grep命令,你需要这样操作:$docker inspect `dl` | grep IPAddress | cut -d ‘“‘ -f 4 172.17.0.52哦!看上去很复杂,用jq吧,专业解析docker inspect输出结果,具有更强的可读性,方便易用:$docker inspect `dl` | jq -r ‘.[0].NetworkSettings.IPAddress’ 172.17.0.52其中第一个’.’代表所有的结果。’[0]’代表数组的第一个元素。就像JavaScript访问一个JSON对象一样,简单方便。6.镜像有哪些环境变量?有时候,你需要知道自己创建的镜像有哪些环境变量。简单!只要这样:$ docker run ubuntu env
输出结果如下:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
container=lxc
HOSTNAME=5e调用env查看环境变量,对于后面要讲到的“链接”(-link)很有用,在连接两个容器时候需要用到这些环境变量,具体请看最后一个要点“链接”。7.RUN命令 vs CMD命令Docker的新手用户比较容易混淆RUN和CMD这两个命令。RUN命令在构建(Build)Docker时执行,这时CMD命令不执行。CMD命令在RUN命令执行时才执行。我们来理清关系,假设Dockerfile内容如下:FROM thelanddownunder
MAINTAINER crocdundee我们要向系统中安装一些软件,那么:# docker build将会执行下面的命令:
RUN apt-get update
RUN apt-get install softwares
# dokcer run默认执行下面的命令:
CMD [“softwares”]Build时执行RUN,RUN时执行CMD,也就是说,CMD才是镜像最终执行的命令。8.CMD命令 vs ENTRYPOINT命令又是两条容易混淆的命令!具体细节我们就不说了,举个例子,假设一个容器的Dockerfile指定CMD命令,如下:FROM ubuntu
CMD [“echo”]另一个容器的Dockerfile指定ENTRYPOINT命令,如下:FROM ubuntu
ENTRYPOINT [“echo”]运行第一个容器:docker run image1 echo hello得到的结果:hello运行第二个容器:docker run image2 echo hello得到的结果:echo hello看到不同了吧?实际上,CMD命令是可覆盖的,docker run后面输入的命令与CMD指定的命令匹配时,会把CMD指定的命令替换成docker run中带的命令。而ENTRYPOINT指定的命令只是一个“入口”,docker run后面的内容会全部传给这个“入口”,而不是进行命令的替换,所以得到的结果就是“echo hello”。9.Docker容器有自己的IP地址吗?刚接触Docker的人或许会有这样的疑问:Docker容器有自己的IP地址吗?Docker容器是一个进程?还是一个虚拟机?嗯…也许两者兼具?哈哈,其实,Docker容器确实有自己的IP,就像一个具有IP的进程。只要分别在主机和Docker容器中执行查看ip的命令就知道了。查看主机的ip:$ ip -4 -o addr show eth0得到结果:2: eth0 inet 162.243.139.222/24查看Docker容器的ip:$ docker run ubuntu ip -r -o addr show eth0得到结果:149: eth0
inet 172.17.0.43/16两者并不相同,说明Docker容器有自己的ip。10.基于命令行的瘦客户端,使用UNIX Socket和Docker后台服务的REST接口进行通信Docker默认是用UNIX socket通信的,一直到大概0.5、0.6的版本还是用端口来通信,但现在则改成UNIX socket,所以从外部无法控制Docker容器的内部细节。下面我们来搞点有趣的事情,从主机链接到docker的UNIX socket:# 像HTTP客户端一样连接到UNIX socket
$ nc -U / /var/run/docker.sock连接成功后,输入:GET /images/json HTTP/1.1输入后连敲两个回车,第二个回车表示输入结束。然后,得到的结果应该是:HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 05 Nov :09 GMT
Transfer-Encoding: chunked
[{“Repository”:”postgres”,”Tag”:”......有一天,我不小心把提交的名称打错了,名字开头打成”-xxx”(我把命令和选项的顺序搞混了),所以当我删除的时候出了问题,docker rm -xxx,会把-xxx当成参数而不是镜像的名称。所以我只得通过socket直接连到容器来调用REST Server把错误的东西删掉。11.把镜像的依赖关系绘制成图docker images命令有一个很拉风的选项:-viz,可以把镜像的依赖关系绘制成图并通过管道符号保存到图片文件:# 生成一个依赖关系的图表
$ docker images -viz | dot -T png -o docker.png这样,主机的当前路径下就生成了一张png图,然后,用python开启一个微型的HTTP服务器:python -m SimpleHTTPServer然后在别的机器上用浏览器打开:http://machinename:8000/docker.pngOK,依赖关系一目了然!(译者注:要使用dot命令,主机要安装graphviz包。另外,如果主机ip没有绑定域名,machinename换成主机的ip即可。)12.Docker把东西都存到哪里去了?Docker实际上把所有东西都放到/var/lib/docker路径下了。切换成super用户,到/var/lib/docker下看看,你能学到很多有趣的东西。执行下面的命令:$ sudo su
# cd /var/lib/docker
containers/ graph/ repositories volumes/可以看到不少目录,containers目录当然就是存放容器(container)了,graph目录存放镜像,文件层(file system layer)存放在graph/imageid/layer路径下,这样你就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如何一层一层叠加起来的。13.Docker源代码:Go, Go, Go, Golang!Docker的源代码全部是用Go语言写的。Go是一门非常酷的语言。其实,不只是Docker,很多优秀的软件都是用Go写的。对我来说,Docker源文件中,有4个是我非常喜欢阅读的:commands.godocker的命令行接口,是对REST API的一个轻量级封装。Docker团队不希望在命令中出现逻辑,因此commands.go只是向REST API发送指令,确保其较小的颗粒性。api.goREST API的路由(接受commands.go中的请求,转发到server.go)server.go大部分REST API的实现buildfile.goDockerfile的解析器有的伙计惊叹”Wow!Docker是怎么实现的?!我无法理解!”没关系,Docker是开源软件,去看它的源代码就可以了。如果你不太清楚Dockerfile中的命令是怎么回事,直接去看buildfile.go就明白了。14.运行几个Docker后台程序,再退出容器,会发生什么?OK,倒数第二个要点。如果在Docker中运行几个后台程序,再退出Docker容器,会发生什么?答案是:不要这么做!因为这样做后台程序就全丢了。Dockerfile中用RUN命令去开启一个后台程序,如:RUN pg_ctl start这样的话,RUN命令开启的后台程序就会丢失。调用容器的bash连到容器的shell:$ docker run -i -t postgresimage bash然后调用 ps aux查看进程,你会发现postgres的进程并没有跑起来。 RUN命令会影响文件系统。因此,不要再Dockerfile中用启动后台程序,要把后台程序启动成前台进程。或者,像一些高手提议的那样,写一个启动脚本,在脚本中启动这些后台程序或进程。15.容器之间进行友好沟通:链接这是最拉风的功能!我把它留到最后压轴!这是0.6.5中最重要的新功能,我们前面已经提过两次了。运行一个容器,给它一个名称,在下面的例子中,我们通过-name参数给容器指定名称”loldb”:$ docker run -d -name loldb loldbimage再运行另一个容器,加上-link参数来连接到第一个容器(别名为loldb),并给第二个容器也指定一个别名(这里用的是cheez):$ docker run -link /loldb:cheez otherimage env顺便得到cheez的环境变量:CHEEZ_PORT=tcp://172.17.0.8:6379
CHEEZ_PORT_1337_TCP=tcp://172.17.0.8.6379
CHEEZ_PORT_1337_TCP_ADDR=tcp://172.17.0.12
CHEEZ_PORT_1337_TCP_PORT=6379
CHEEZ_PORT_1337_TCP_PROTO=tcp这样,我们就在两个容器间建立起一个网络通道(bridge),基于此,我们可以建立一个类似rails的程序:一个容器可以访问数据库容器而不对外暴露其他接口。非常酷!数据库容器只需要知道第一个容器的别名(在本例中为cheez)和要打开的端口号。所以数据库容器也可以env命令来查看这个端口是否打开。来源:dockboard原文:http://t.cn/RtaQNm3版权:本文版权归原作者所有
觉得不错,分享给更多人看到
运维之美 微信二维码
分享这篇文章
9月4日 0:17
运维之美 最新文章
运维之美 热门文章如何让docker以daemon方式运行/bin/bash
[问题点数:20分]
如何让docker以daemon方式运行/bin/bash
[问题点数:20分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。当前位置:&>&&>&
Docker基本使用教程
时间: 20:03:01    来源:服务器之家    投稿:root
1.启动docker--有两种方式
如果你是二进制安装的,你可以使用sudo /docker -d &来启动
如果你是apt-get安装的你可以用service docker start开启
2.搜索安装镜像
官方安装方式docker pull
imagename从docker的索引中心下载,imagename是镜像名称,例如docker pull ubuntu就是下载base
ubuntu并且tag是latest。
因为官方速度比较慢你可以从我提供的国内镜像下载,我用的七牛云存储,
#第一种方法url下载安装ubuntu
docker&import&/ubuntu.tar
#第二种方法,下载下来然后根据自己配置安装
wget&/ubuntu.tar
cat&test.tar&|&sudo&docker&import&-&xiaowei:new
启动docker
如果你使用快速安装并且添加到PATH中,docker就被安装到快捷启动了,当Ubuntu系统启动时就启动了!你只需要运行命令sudo
run docker help获得输出.
如果你获得结果是"docker: command not found"或者像"
/var/lib/docker/repositories: permission denied",你需要手动指定路径执行它.
#&Run&docker&in&daemon&mode
sudo&/docker&-d&&
下载一个预建立的镜像
#&下载一个ubuntu镜像
sudo&docker&pull&ubuntu
这个将从索引仓库中通过名字找到ubuntu镜像,并且从索引仓库顶级中心来下载到本地镜像存储
注:当镜像下载成功后,你可以看到12位的hash值像539c0211cd76,这是下载完整的镜像的精简ID,这些短的镜像ID是完整镜像ID的前12个字符--可以使用docker
inspect&或者&docker&images
-notrunc=true来获得完整的镜像ID
运行交互性的shell(就像运行一个单独的linux)
#&使用ubuntu运行一个交互性的shell,
#&分配一个伪终端,附带stdin和stdout(输入/输出流)
#&如果你想退出分离出来的伪终端,
#&可以使用CTRL&-p+CTRL&-q&--就像先按CTRL&-p&然后CTRL&-q
sudo&docker&run&-i&-t&ubuntu&/bin/bash
管理员命令和docker组
docker进程经常使用root用户运行,从docker的0.5.2版本开始,docker的进程绑定Unix
Socket来代替一个TCP端口,在默认情况下Unix Socket属于root用户,所以在默认情况下,你需要赋予权限sudo
从0.5.3版本开始,如果你(或者你安装的docker)创建的时候用的docker或者添加用户的unix群组,当docker进程启动的时
候,这个docker进程会把Unix
socket的读写(read/writable)的所有权交给docker群组.docker进程一般必须root用户运行,但是你运行docker客
户端的用户是docker组的,这个时候你就不需要加sudo就可以运行全部的客户端命令
警告:docker群组必须是和root等价的
#&如果不存在docker群组,添加一个用户群组
sudo&groupadd&docker
#&Add&the&connected&user&"${USER}"&to&the&docker&group.
#&Change&the&user&name&to&match&your&preferred&user.
#&You&may&have&to&logout&and&log&back&in&again&for
#&this&to&take&effect.
sudo&gpasswd&-a&${USER}&docker
#&Restart&the&docker&daemon.
sudo&service&docker&restart
让Docker使用其它的host/port或者Unix socket
改变默认的docker进程绑定的TCP端口或者Unix&docker的用户组,将会
通过允许非root用户获得root权限来修改主机,会增加你的安全风险!
使用 -H 他可以运行你改变docker进程监听指定的IP和端口。默认情况下,他会监听
unix:///var/run/docker.sock只允许本地的root用户连接,你可以设置他 0.0.0.0:4243
或者指定主机IP给任何用户,但是这不是我们所推荐的,因为那么低权限将会获得root正在运行的主机进程的访问权限!
同样,docker客户端可以使用-H 来指定连接的端口
-H 授权主机和端口的格式是这样的:tcp://[host][:port] or unix://path
tcp://host:4243 -& 使用tcp连接 host:4243
unix://path/to/socket -& 使用socket位于 path/to/socket
-H 当空的时候 将会使用默认值就像没有 -H一样
-H 也可以用简短的方式授权TCP绑定: host[:port] or :port
#&Run&docker&in&daemon&mode
sudo&/docker&-H&0.0.0.0:5555&-d&&
#&Download&an&ubuntu&image
sudo&docker&-H&:5555&pull&ubuntu
你可以是用多个 -H 例如你想监听你所有的TCP和Unix socket
#&Run&docker&in&daemon&mode
sudo&/docker&-H&tcp://127.0.0.1:4243&-H&unix:///var/run/docker.sock&-d&&
#&Download&an&ubuntu&image,&use&default&Unix&socket
sudo&docker&pull&ubuntu
#&OR&use&the&TCP&port
sudo&docker&-H&tcp://127.0.0.1:4243&pull&ubuntu
开启一个长时间运行的工作进程
#&开启一个非常有用的长时间工作进程
JOB=$(sudo&docker&run&-d&ubuntu&/bin/sh&-c&"while&&do&echo&Hello&&sleep&1;&done")
#&到目前为止的收集的输出
sudo&docker&logs&$JOB
#&杀死这个进程
sudo&docker&kill&$JOB
监听所有运行着的容器
sudo&docker&ps
为服务绑定一个TCP端口
#&为容器绑定4444端口,并告诉网络监听4444
JOB=$(sudo&docker&run&-d&-p&4444&ubuntu:12.10&/bin/nc&-l&4444)
#&查看我的容器用的公共端口
PORT=$(sudo&docker&port&$JOB&4444&|&awk&-F:&'{&print&$2&}')
#&连接公共端口
echo&hello&world&|&nc&127.0.0.1&$PORT
#&确认网络连接是否工作
echo&"Daemon&received:&$(sudo&docker&logs&$JOB)"
提交(保存)容器的状态
保存你的容器状态作为一个容器镜像,所以容易状态可以重用
当你保存你的容器的时候,仅仅只是保存现在容器和创建容器时候的不同状态(as a diff),用'docker
images'命令查看哪些镜像是你正在所使用
#Commit&your&container&to&a&new&named&image
sudo&docker&commit
#&List&your&containers
sudo&docker&images
现在你有一个新的镜像状态(其实就是一个新的镜像),从中你可以创建新的实例
转载请注明原文地址:

我要回帖

更多关于 docker api执行命令 的文章

 

随机推荐