https://segmentfault.com/a/1190000002609286
删除所有未运行 Docker 容器
docker rm $(docker ps -a -q)
删除所有 Docker 镜像
删除所有未打 tag 的镜像
docker rmi $(docker images -q | awk '/^<none>/ { print $3 }')
删除所有镜像
docker rmi $(docker images -q)
根据格式删除所有镜像
docker rm $(docker ps -qf status=exited)
移除所有的容器和镜像(大扫除)
用一行命令大扫除:
docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)
注:shell 中的 $() 和 `` 类似,会先执行这里面的内容,上面的脚本会出现如下 docker kill "pids" ; docker kill 在 docker 中用于停止容器,docker rm 删除容器, docker rmi 删除镜像
当没有运行的容器或者是根本没有容器的时候,这只会提示一个警告信息。当你想尝试的时候,这就是个非常好的单行命令。如果你仅仅想删除所有的容器,你可以运行如下命令:
docker kill $(docker ps -q) ; docker rm $(docker ps -a -q)
退出时删除容器
如果你仅仅想在一个容器中快速的运行一个命令,然后退出,并且不用担心容器状态,把 --rm 参数加入 run 命令后面,这将结束很多你保存了的容器,并且清理它们。
示例:docker run --rm -i -t busybox /bin/bash
不在 Shell 上运行命令
如果你使用需要Shell 的扩展项的 docker run 命令处理某些事情,比如 docker run --rm busybox ls '/var/log/', 这个命令将失败。这个失败的原因我花了工夫才弄明白。这个陷阱在这里:你原来没有 Shell , 而 ``` 是 Shell 的扩展项,因此你需要一个能使用的 Shell 。正确方法为:
docker run --rm busybox sh -c 'ls /var/log/*'
Boot2Docker 和 LapTops 处理 DNS 问题的方法
由于这个原因, Boot2Docker 会占用 DNS 服务器很长一段时间。当你在尝试创建镜像的时候,可能会得到离谱的错误。如果你在 Ubuntu 或者 CentOS 上看到下面的提示:
cannot lookup archive.ubuntu.com
聪明的做法是停止,然后启动 boot2docker 。
boot2docker-cli down && boot2docker-cli up
这样问题就解决了
Volumes 解决 docker logs
和 docker copy
问题
如果你想在一个容器中监控另一个容器中的日志文件和文件的使用,你可以看看 volumes ,例如,检查 tomcat 是否启动:
tomcat_id=$(docker run -d -v /var/log/tomcat6 wouterd/tomcat6)# Give Tomcat some time to wake up...sleep 5while ! docker run --rm --volumes-from ${tomcat_id} busybox /bin/sh -c "grep -i -q 'INFO: Server startup in' /var/log/tomcat6/catalina*.log" ; do echo -n "." sleep 5done
你还可以在一个 Dockerfile
中指定 volumes ,这个在我前面的博客文章中结合 Docker 连载了。\
Docker Inspect 结合 Go Templates 的好处
命令 docker inspect
允许使用 Go Templates 来格式化inspect 命令的输出信息如果你擅长这个,你能获取很多 docker 容器命令行的脚本输出信息。这是一个获取正在运行的容器 IP 的示例:
container_ip=$(docker inspect --format '{{.NetworkSettings.IPAddress}}' ${container_id})
这里有一个笨的技巧,用于得到匹配所有暴露(exposed)的端口 host:port ,并且把他们输入一个 java properties 文件:
sut_ip=${BOOT_2_DOCKER_HOST_IP}template='{{ range $key, $value := .NetworkSettings.Ports }}{{ $key }}='"${BOOT_2_DOCKER_HOST_IP}:"'{{ (index $value 0).HostPort }} {{ end }}'tomcat_host_port=$(docker inspect --format="${template}" ${container_id})for line in ${tomcat_host_port} ; do echo "${line}" >> ${work_dir}/docker_container_hosts.propertiesdone
Docker基础命令
查看docker版本信息
$ docker --version
查看docker安装信息
$ docker info
查看本机Docker中存在哪些镜像
$ docker images
检索images
$ docker search images
下行images
$ docker pull images
显示一个镜像的历史操作
$ docker history images
列出一个容器里面被改变的文件或者目录
$ docker diff container
列出当前所有正在运行的容器
$ docker ps
列出所有的容器
$ docker ps -a
列出最近一次启动的容器
$ docker ps -f
查看容器的相关信息
$ docker inspect $CONTAINER_ID
显示容器IP地址和端口号,如果输出是空的说明没有配置IP地址(不同的Docker容器可以通过此IP地址互相访问)
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID
通过容器生成新的镜像
$ docker commit -m "Added ssh from centos" -a "xiaoming" 4a4de4cf223d1 xiaoming/centos:v1
参数:
-m参数用来来指定提交的说明信息;
-a可以指定用户信息的;
4a4de4cf223d1代表的时容器的id;
birdben/ubuntu:v1指定目标镜像的用户名、仓库名和 tag 信息。
构建一个容器
$ docker build -t="centos:v1" .
参数:
-t为构建的镜像制定一个标签,便于记忆/索引等
. 指定Dockerfile文件在当前目录下,也可以替换为一个具体的 Dockerfile 的路径。
在docker中运行centos镜像
$ docker run <相关参数> <镜像 ID> <初始命令>
守护模式启动
$ docker run -it centos:v1
指定端口号启动
$ docker run -p 80:80 centos:v1
指定配置启动
$ sudo docker run -d -p 10.211.55.4:9999:22 birdben/ubuntu:v1 '/usr/sbin/sshd' -D
参数:
-d:表示以“守护模式”执行,日志不会出现在输出终端上。
-i:表示以“交互模式”运行容器,-i 则让容器的标准输入保持打开
-t:表示容器启动后会进入其命令行,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>,-v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
-p:表示宿主机与容器的端口映射,此时将容器内部的 22 端口映射为宿主机的 9999 端口,这样就向外界暴露了 9999 端口,可通过 Docker 网桥来访问容器内部的 22 端口了。
注意:这里使用的是宿主机的 IP 地址:10.211.55.4,与对外暴露的端口号 9999,它映射容器内部的端口号 22。ssh外部需要访问:ssh root@10.211.55.4 -p 9999
不一定要使用“镜像 ID”,也可以使用“仓库名:标签名”
start 启动容器
$ docker start 117843ade696117843ade696
stop 停止正在运行的容器
$ docker stop 117843ade696117843ade696
restart 重启容器
$ docker restart 117843ade696117843ade696
rm 删除容器
$ docker rm 117843ade696117843ade696
rmi 删除镜像
$ docker rmi ed9c93747fe1Deleted
登录Docker Hub中心
$ docker login
发布上传image(push)
$ docker push xiaoming/centos:v1
本文只是一个简单的使用docker来提供一些如数据库,redis等公共服务的搭建过程记录.docker-compose.yml的详细配置可以参考官方文档或这篇文章.由于工作环境是在windows下,docker对windows的支持很不好,如果要在windows下安装docker请确保,系统达到官方要求,这里记录的是使用虚拟机的情况下搭建.
安装docker
官方文档中详细说明了不同系统的安装方法,这里以Centos为例.
确保linux系统满足docker要求( 64-bit version of CentOS 7.3,貌似内核也需要3.x以上的可以通过uname -a
查看)
升级/安装 yum-utils $ sudo yum install -y yum-util
设置仓库$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
将软件包信息缓存 sudo yum makecache fast
安装docker sudo yum -y install docker-ce
启动docker sudo systemctl start docker
测试是否安装成功 sudo docker run hello-world
开机启动dockersudo chkconfig docker on
安装docker-compose
这里使用python-pip的方式来安装
安装python-pipyum -y install epel-release yum -y install python-pip
安装docker-composepip install docker-compose
测试是否安装成功docker-compose version
编写简单docker-compose.yml例子
version: "2.0"services: redis: image: redis:3.2 restart: always ports: - "6379:6379" mongo: image: mongo:3.4.1 restart: always ports: - "27017:27017"
安装启动镜像
在docker-compose.yml所在根目录下执行docker-compose up
统计某人的代码提交量,包括增加,删除:
git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' -
仓库提交者排名前 5(如果看全部,去掉 head 管道即可):
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
仓库提交者(邮箱)排名前 5:这个统计可能不会太准,因为很多人有不同的邮箱,但会使用相同的名字
git log --pretty=format:%ae | gawk -- '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }' | sort -u -n -r | head -n 5
贡献者统计:
git log --pretty='%aN' | sort -u | wc -l
提交数统计:
git log --oneline | wc -l
添加或修改的代码行数:
git log --stat|perl -ne 'END { print $c } $c += $1 if /(\d+) insertions/;