列出镜像列表
$ docker images
$ docker image ls -a
运行 Docker 镜像(守护态方式)
$ docker run -d {镜像名}
删除指定 Docker 镜像
$ docker image rm {镜像名}
删除 Docker 虚悬镜像
$ docker image prune
列出正在运行的容器
$ docker ps -a
列出所有容器(包括已停止容器)
$ docker ps -l
进入运行中的 Docker 容器
$ docker exec -it {容器ID} /bin/bash
停止 Docker 容器
$ docker stop {容器ID}
删除指定 Docker 容器
$ docker rm -f {容器ID}
删除停止的 Docker 容器
$ docker container prune
查看 Docker 容器历史运行日志
$ docker logs {容器名}
实时监听 Docker 容器运行日志
$ docker logs -f {容器名}
创建 Docker 数据卷
$ docker volume create {数据卷名}
列出所有 Docker 数据卷
$ docker volume ls
删除指定 Docker 数据卷
$ docker volume rm {数据卷名}
删除未关联(失效) Docker 数据卷
$ docker volume prune
$ docker volume rm $(docker volume ls -qf dangling=true)
从主机复制文件到 Docker 容器中
$ sudo docker cp {主机内文件路径} {容器ID}:{容器内文件存储路径}
从 Docker 容器中复制文件到主机中
$ sudo docker cp {容器ID}:{容器内文件路径} {主机内文件存储路径}
docker run命令首先会从特定的image创之上create一层可写的container,然后通过start命令来启动它。停止的container可以重新启动并保留原来的修改。run命令启动参数有很多,以下是一些常规使用说明
当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
下面是一个例子:
$ sudo docker run --name nginx_test \
> -v /tmp/docker:/usr/share/nginx/html:ro \
> -p 80:80 -d \
> nginx:1.7.6
容器可以通过run新建一个来运行,也可以重新start已经停止的container,但start不能够再指定容器启动时运行的指令,因为docker只能有一个前台进程。
容器stop(或Ctrl+D)时,会在保存当前容器的状态之后退出,下次start时保有上次关闭时更改。而且每次进入attach进去的界面是一样的,与第一次run启动或commit提交的时刻相同。
CONTAINER_ID=$(docker start <containner_id>)
$ sudo docker stop $CONTAINER_ID
$ sudo docker restart $CONTAINER_ID
要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。
官方文档中说attach后可以通过CTRL-C来detach,但实际上经过我的测试,如果container当前在运行bash,CTRL-C自然是当前行的输入,没有退出;如果container当前正在前台运行进程,如输出nginx的access.log日志,CTRL-C不仅会导致退出容器,而且还stop了。这不是我们想要的,detach的意思按理应该是脱离容器终端,但容器依然运行。好在attach是可以带上--sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。
$ sudo docker attach --sig-proxy=false $CONTAINER_ID
inspect的对象可以是image、运行中的container和停止的container。
查看容器的内部IP
$ sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID
容器运行时不一定有/bin/bash终端来交互执行top命令,查看container中正在运行的进程,况且还不一定有top命令,这是docker top <container_id/container_name>就很有用了。实际上在host上使用ps -ef|grep docker也可以看到一组类似的进程信息,把container里的进程看成是host上启动docker的子进程就对了。
$ sudo docker top <container_id/container_name>
build命令可以从Dockerfile和上下文来创建镜像:
$ sudo docker build [OPTIONS] PATH | URL | -
上面的PATH或URL中的文件被称作上下文,build image的过程会先把这些文件传送到docker的服务端来进行的。
# cat Dockerfile
FROM seanlook/nginx:bash_vim
EXPOSE 80
ENTRYPOINT /usr/sbin/nginx -c /etc/nginx/nginx.conf && /bin/bash
# docker build -t seanlook/nginx:bash_vim_Df .
给镜像打上标签(tag)
tag的作用主要有两点:一是为镜像起一个容易理解的名字,二是可以通过docker tag来重新指定镜像的仓库,这样在push时自动提交到仓库。
将同一IMAGE_ID的所有tag,合并为一个新的
$ sudo docker tag 195eb90b5349 seanlook/ubuntu:rm_test
新建一个tag,保留旧的那条记录
$ sudo docker tag Registry/Repos:Tag New_Registry/New_Repos:New_Tag
当我们在制作自己的镜像的时候,会在container中安装一些工具、修改配置,如果不做commit保存起来,那么container停止以后再启动,这些更改就消失了。
$ sudo docker commit <container> [repo:tag]
后面的repo:tag可选
只能提交正在运行的container,即通过docker ps可以看见的容器
与上面的pull对应,可以推送到Docker Hub的Public、Private以及私服,但不能推送到Top Level Repository。
$ sudo docker push seanlook/mongo
$ sudo docker push registry.tp-link.net:5000/mongo:2014-10-27
registry.tp-link.net也可以写成IP,172.29.88.222。
在repository不存在的情况下,命令行下push上去的会为我们创建为私有库,然而通过浏览器创建的默认为公共库。
docker还有一些如login、cp、logs、export、import、load、kill等不是很常用的命令,比较简单,请参考官网。
events、history和logs命令
这3个命令用于查看Docker的系统日志信息。events命令会打印出实时的系统事件;history命令会打印出指定镜像的历史版本信息,即构建该镜像的每一层镜像的命令记录;logs命令会打印出容器中进程的运行日志。
docker events [options] :从服务器获取实时事件。
docker history [options] image:查看指定镜像的创建历史。
docker logs [options] container
Options:
--details 显示更多的信息
-f, --follow 跟踪日志输出,最后一行为当前时间戳的日志
--since string 显示自具体某个时间或时间段的日志
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳