Docker

Docker 常用命令汇总

Posted on 2020-09-11,8 min read

Docker 镜像命令

列出镜像列表

$ docker images
$ docker image ls -a

运行 Docker 镜像(守护态方式)

$ docker run -d {镜像名}

删除指定 Docker 镜像

$ docker  image rm {镜像名}

删除 Docker 虚悬镜像

$ docker image prune

Docker 容器命令

列出正在运行的容器

$ 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 数据卷

$ 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 文件操作命令

从主机复制文件到 Docker 容器中

$ sudo docker cp {主机内文件路径} {容器ID}:{容器内文件存储路径}

从 Docker 容器中复制文件到主机中

$ sudo docker cp {容器ID}:{容器内文件路径} {主机内文件存储路径}

从image启动一个container

docker run命令首先会从特定的image创之上create一层可写的container,然后通过start命令来启动它。停止的container可以重新启动并保留原来的修改。run命令启动参数有很多,以下是一些常规使用说明

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止
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

开启/停止/重启container(start/stop/restart

容器可以通过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

连接到正在运行中的container(attach)

要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

查看image或container的底层信息(inspect)

inspect的对象可以是image、运行中的container和停止的container。

查看容器的内部IP

$ sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID

查看容器中正在运行的进程(top)

容器运行时不一定有/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>

Docker build 命令

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固化为一个新的image(commit)

当我们在制作自己的镜像的时候,会在container中安装一些工具、修改配置,如果不做commit保存起来,那么container停止以后再启动,这些更改就消失了。

$ sudo docker commit <container> [repo:tag]

后面的repo:tag可选

只能提交正在运行的container,即通过docker ps可以看见的容器

推送一个image或repository到registry(push)

与上面的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] :从服务器获取实时事件。

  • Options:
    
    - **-f** **:**根据条件过滤事件;
    - **--since** **:**从指定的时间戳后显示所有事件;
    - **--until** **:**流水时间显示到指定的时间为止;
    

docker history [options] image:查看指定镜像的创建历史。

  • Options:
    
    - **-H :**以可读的格式打印镜像大小和日期,默认为true;
    - **--no-trunc :**显示完整的提交记录;
    - **-q :**仅列出提交记录ID。
    

docker logs [options] container

Options:

     --details    显示更多的信息
   -f, --follow     跟踪日志输出,最后一行为当前时间戳的日志
     --since string  显示自具体某个时间或时间段的日志
     --tail string  从日志末尾显示多少行日志, 默认是all
   -t, --timestamps   显示时间戳

下一篇: Docker使用Portainer搭建可视化管理界面→