为什么删除不了有些Images
当你试图删除一个你不用的image的时候,有时候会告诉你有个container正在使用这个镜像,但是docker ps 并没有发现相关的container,这个是由于对container的exit理解不深造成的。
这里有两个不同的单词,images和container。其中images很好理解,跟平常使用的虚拟机的镜像一个意思,相当于一个模版,而container则是images运行时的的状态。docker对于运行过的image都保留一个状态(container),可以使用命令docker ps来查看正在运行的container,对于已经退出的container,则可以使用docker ps -a来查看。 如果你退出了一个container而忘记保存其中的数据,你可以使用docker ps -a来找到对应的运行过的container使用docker commit命令将其保存为image然后运行。
事实上你需要rm掉那个container才可以进行rmi的操作
docker ps -a
docker rm ${container_id}
docker rmi ${iamge_id}
在Ubuntu下使用docker 但是不想写sudo
原理还是将用户加入docker组 问题解决
挂起一个container
Ctrl+p, Ctrl+q
#不小心exit但是数据没有保存
docker ps -a
检查所有的关掉的container
docker restart ${old_container_id}
但是问题是,也许你会觉得有些container明明都不用了却还在那里碍眼,可以删掉所有旧的container
docker rm $(docker ps -a -q) #这个更暴力一点
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm # 个人更喜欢这个
或者是有些时候你想删掉中间层的镜像
有些时候你可以在run里头加这个参数,这样在退出container的时候就会直接删掉那个container了
--rm=false Automatically remove the container when it exits
Docker commit and docker push
commit是commit一个正在运行的container作为一个新的镜像 push是把整个repo都推上去,包括所有的tag 和git一样的
#指定端口
docker run -ti -p 主机端口:容器端口 镜像 命令
docker ps nostalgic_morse # 用于查看端口映射的情况
#挂载数据卷 挂载数据卷才是Best Practice,Docker的本质不希望和主机发生太多的关系,不要太指望在主机上放数据文件 这篇文章 讲了这件事情的Best practice,反正就是使用data-only-container就对了
主要是还说了另外的方法的drawback
数据卷说白了就是什么都不做的卷
- 拉一个数据镜像
docker pull maxexcloo/data
这个镜像其实很简单,看一下Dockerfile
FROM busybox:latest
MAINTAINER Max Schaefer <max@excloo.com>
RUN mkdir /data
VOLUME /data
基于buzybox,在我看来buzybox就是linux命令的一个子集
You can also use the VOLUME instruction in a Dockerfile to add one or more new volumes to any container created from that image.
这个 VOLUME关键字和 run后面的参数 -v是一个意思,在我看来这个数据是没有办法持久化的(2014.12.10)
- 不拉镜像
docker run -ti --name web -v /src/webapp:/opt/webapp training/webapp python app.py
--name="" Assign a name to the container
注意这两个的区别
-v, --volume=[] Bind mount a volume (e.g., from the host: -v /host:/container, from Docker: -v /container)
这个是指定目录
--volumes-from=[] Mount volumes from the specified container(s)
这个后面跟container_id或者是--name指定的名字
在一个指定的container里头跑一条命令
docker exec container_id command
查看docker container的ip
docker inspect ${CONTAINER_ID}