Docker :常用命令小册子

Posted 琦彦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker :常用命令小册子相关的知识,希望对你有一定的参考价值。

Docker 命令查询

基本语法

Docker 命令有两大类,客户端命令和服务端命令。前者是主要的操作接口,后者用来启动 Docker Daemon。

  • 客户端命令:基本命令格式为 docker [OPTIONS] COMMAND [arg...]

  • 服务端命令:基本命令格式为 dockerd [OPTIONS]

可以通过 man docker 或 docker help 来查看这些命令。

Docker命令分布图

Docker 命令自动补齐

  经常大家会碰到这种现象,Docker 已经安装好了,但是使用 docker 命令时 不能自动补齐,即输入 docker 命令后,按 Tab 键无法列出子命令(或参数)的候选项。


自动补齐-机制

Linux 系统许多命令都会提供该命令自身的命令补齐脚本,在安装命令时会自动安装自动补齐脚本,如果有的话,该机制在Linux中被称为 bash-complete。

在 /usr/share/bash-completion/completions/ 目录下有许多命令自动补齐的脚本,可自行查阅。

      与 docker 有关的,有 2 个文件: docker 和 docker-compose。如下:

[root@docker ~]# ls  /usr/share/bash-completion/completions/docker*
/usr/share/bash-completion/completions/docker
/usr/share/bash-completion/completions/docker-compose

备注:如果没有安装 docker compose,那么只有一个 docker 自动补齐脚本

  自动补齐需要依赖工具 bash-complete,如果没有,则需要手动安装,命令如下:

[root@docker ~]# yum -y install bash-completion

   安装成功后,得到文件为  /usr/share/bash-completion/bash_completion  ,如果没有这个文件,则说明系统上没有安装这个工具。


自动补齐-实践

让配置脚本生效的方法是执行 source xxx 命令,先执行 source /usr/share/bash-completion/completions/docker,再输入 docker,然后按2次 Tab键,提示错误如下:

[root@docker ~]# docker  (docker + 空格 + 连续按2次Tab键)
docker bash: _get_comp_words_by_ref: command not found
bash: [: : integer expression expected
bash: [: : integer expression expected
bash: [: : integer expression expected
bash: _get_comp_words_by_ref: command not found
bash: [: : integer expression expected
bash: [: : integer expression expected
bash: [: : integer expression expected

注:第一行的docker,实际是输入的命令,其它是按Tab键的输出信息。

  前面已经安装了 bash_completion,执行如下命令:

[root@docker ~]# source /usr/share/bash-completion/bash_completion

再次尝试,发现可以正常列出docker的子命令,示例如下:

[root@docker ~]# docker  (docker + 空格 + 连续按2次Tab键)
attach    container  engine    history   inspect   logs      port     restart   search    stats    top      volume
build     context    events    image     kill      network   ps       rm        secret    stop     trust    wait
builder   cp         exec      images    load      node      pull     rmi       service   swarm    unpause    
commit    create     export    import    login     pause     push     run       stack     system   update     
config    diff       help      info      logout    plugin    rename   save      start     tag      version

尝试 Docker 容器名称的自动补齐功能,示例如下:

[root@docker ~]# docker logs izheng-  (注:输入izheng-后按2次Tab键)
izheng-wordpress    izheng-apache     izheng-mysql        
izheng-zentao       izheng-gitlab     izheng-jenkins

若安装了 Docker Compose,则也可事实 docker-compose 命令的自动补齐功能。

重启系统后,也能进行自动补齐。

Docker 客户端命令分类

命令分类 

命  令 

Docker环境信息 

info、version

容器生命周期管理

create、exec、kill、pause、restart、rm、run、start、stop、unpause

镜像仓库命令

login、logout、pull、push、search

镜像管理

build、images、import、load、rmi、save、tag、commit

容器运维操作

attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff、update

容器资源管理

volume、network

系统日志信息

events、history、logs

容器生命周期管理

docker run :创建一个新的容器并运行一个命令

语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

  • -d: 后台运行容器,并返回容器ID;

  • -i: 以交互模式运行容器,通常与 -t 同时使用;

  • -P: 随机端口映射,容器内部端口随机映射到主机的端口

  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口

  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

  • --name="nginx-lb": 为容器指定一个名称;

  • --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

  • --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

  • -h "mars": 指定容器的hostname;

  • -e username="ritchie": 设置环境变量;

  • --env-file=[]: 从指定文件读入环境变量;

  • --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

  • -m :设置容器使用内存最大值;

  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

  • --link=[]: 添加链接到另一个容器;

  • --expose=[]: 开放一个端口或一组端口;

  • --volume , -v: 绑定一个卷

实例

使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

docker run -d -p 80:80 -v /data:/data nginx:latest

绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。

$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

runoob@runoob:~$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/# 

 主机的目录映射到容器的指定目录(tomcat的war拷贝进去,不用重启可以自动启动)

docker run -d -p 8081:8080 --name tomcat02 -v /root/apps:/usr/local/tomcat/webapps tomcat:8.5.35-jre8

容器操作

docker logs : 获取容器的日志

语法

docker logs [OPTIONS] CONTAINER

OPTIONS说明:

  • -f : 跟踪日志输出

  • --since :显示某个开始时间的所有日志

  • -t : 显示时间戳

  • --tail :仅列出最新N条容器日志

实例

查看容器mynginx从2016年7月1日后的最新10条日志。

docker logs --since="2016-07-01" --tail=10 mynginx

容器rootfs命令

镜像仓库

本地镜像管理

rmi : 强制删除所有本地镜像

docker rmi -f $(docker images -q)

[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   13 months ago   13.3kB
[root@localhost ~]# docker rmi -f $(docker images -q)
Untagged: hello-world:latest
Untagged: hello-world@sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@localhost ~]# 

info|version

Docker客户端命令

可以通过 docker COMMAND --help 来查看这些命令的具体用法。

  • attach:连接到一个正在运行的容器中;
  • build:从一个 Dockerfile 创建一个镜像;
  • commit:从一个容器的修改中创建一个新的镜像;
  • cp:在容器和本地宿主系统之间复制文件中;
  • create:创建一个新容器,但并不运行它;
  • diff:检查一个容器内文件系统的修改,包括修改和增加;
  • events:从服务端获取实时的事件;
  • exec:在运行的容器内执行命令;
  • export:导出容器内容为一个 tar 包;
  • history:显示一个镜像的历史信息;
  • images:列出存在的镜像;
  • import:导入一个文件(典型为 tar 包)路径或目录来创建一个本地镜像;
  • info:显示一些相关的系统信息;
  • inspect:显示一个容器的具体配置信息;
  • kill:关闭一个运行中的容器 (包括进程和所有相关资源);
  • load:从一个 tar 包中加载一个镜像;
  • login:注册或登录到一个 Docker 的仓库服务器;
  • logout:从 Docker 的仓库服务器登出;
  • logs:获取容器的 log 信息;
  • network:管理 Docker 的网络,包括查看、创建、删除、挂载、卸载等;
  • node:管理 swarm 集群中的节点,包括查看、更新、删除、提升/取消管理节点等;
  • pause:暂停一个容器中的所有进程;
  • port:查找一个 nat 到一个私有网口的公共口;
  • ps:列出主机上的容器;
  • pull:从一个Docker的仓库服务器下拉一个镜像或仓库;
  • push:将一个镜像或者仓库推送到一个 Docker 的注册服务器;
  • rename:重命名一个容器;
  • restart:重启一个运行中的容器;
  • rm:删除给定的若干个容器;
  • rmi:删除给定的若干个镜像;
  • run:创建一个新容器,并在其中运行给定命令;
  • save:保存一个镜像为 tar 包文件;
  • search:在 Docker index 中搜索一个镜像;
  • service:管理 Docker 所启动的应用服务,包括创建、更新、删除等;
  • start:启动一个容器;
  • stats:输出(一个或多个)容器的资源使用统计信息;
  • stop:终止一个运行中的容器;
  • swarm:管理 Docker swarm 集群,包括创建、加入、退出、更新等;
  • tag:为一个镜像打标签;
  • top:查看一个容器中的正在运行的进程信息;
  • unpause:将一个容器内所有的进程从暂停状态中恢复;
  • update:更新指定的若干容器的配置信息;
  • version:输出 Docker 的版本信息;
  • volume:管理 Docker volume,包括查看、创建、删除等;
  • wait:阻塞直到一个容器终止,然后输出它的退出符。

1. docker commit :从容器创建一个新的镜像。

语法

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:

  • -a :提交的镜像作者;

  • -c :使用Dockerfile指令来创建镜像;

  • -m :提交时的说明文字;

  • -p :在commit时,将容器暂停。

实例

将容器a404c6c174a2 保存为新的镜像,并添加提交人信息和说明信息。

runoob@runoob:~$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1 

2. 查看容器进程在宿主机的 PID

方法1: docker container top

docker container top <container>

方法2: docker  inspect

docker inspect -f '.State.Pid' <container>

方法3: 直接查看

  1. 准备

    1. 确认容器 id
  2. 命令

    # 只要有 容器id, 可以在 docker daemon无法启动的情况下, 确认 pid
    cat /sys/fs/cgroup/memory/docker/<containerId>/cgroup.procs

3. 删除Docker已经停止容器

方法一:

我是想把这个镜像的所有未运行的容器都删了

查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器

sudo docker rm `docker ps -a|grep Exited|awk 'print $1'`

 方法二:

删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了),不推荐这样使用

sudo docker rm  $(sudo docker ps -a -q)

 方法三:

根据容器的状态,删除Exited状态的容器

sudo docker rm $(sudo docker ps -qf status=exited)

 方法四:

可以使用 docker containers prune 命令,删除孤立的容器。

sudo docker containers prune 

4. Docker的自启动

sudo systemctl enable docker
sudo systemctl start docker

Docker容器的自启动

我们设置了docker自启动后,docker可以管理各种容器了,对于容器我们也可以设置重启的策略。

在容器退出或断电开机后,docker可以通过在容器创建时的--restart参数来指定重启策略;

# 多个参数值选择
no	不自动重启容器. (默认值)
on-failure 	容器发生error而退出(容器退出状态不为0)重启容器,可以指定重启的最大次数,如:on-failure:10
unless-stopped 	在容器已经stop掉或Docker stoped/restarted的时候才重启容器
always 	在容器已经stop掉或Docker stoped/restarted的时候才重启容器,手动stop的不算
# 设置启动策略
docker run --restart always --name mynginx -d nginx
  • 如果容器已经被创建,我们想要修改容器的重启策略
docker update --restart no mynginx

注意:

  • 容器只有在成功启动后restart policy才能生效。这里的"成功启动"是指容器处于up至少10秒且已经处于docker监管。这是避免没有成功启动的容器陷入restart的死循环。

  • 如果手动stop一个容器,容器设置的restart policy将会被忽略,除非Docker守护进程重启或者容器手动重启;这是避免了如果重启策略设置了always,如果不忽略policy那么容器无法手动停止。

5. Docker守护进程日志

在守护进程日志级别上,有四个级别的日志可用:

debug:详细描述了守护进程处理的所有可能的信息。

info:详细说明了守护进程处理的所有错误和信息。

errors :详细说明了守护进程处理的所有错误。

fatal:只详细说明了守护进程处理的所有致命错误。

启用日志的方法:

1)需要停止docker守护进程,如果它已经在运行。可以使用下面的命令来停止

sudo service docker stop 

或者

sudo systemctl stop docker

2)启动docker守护进程时,需要附加-l参数来指定日志记录选项

sudo dockerd -l debug &

注意:Dockerd是docker守护进程的可执行文件。选项-l用于指定日志级别。&用于启用日志记录后返回命令提示符。也就是后台运行。这样可以同一个终端执行任何Docker命令,例如,docker ps,debug信息也将被发送到终端控制台。如不使用&,也可以另外在打开终端执行docker命令,用之前的终端查看日志。

可以使用下面命令:

dockerd --log-level debug  

关闭命令:

killall dockerd

Docker daemon日志的位置

Docker daemon日志的位置,不同的系统各不相同,如下:

Ubuntu/var/log/upstart/docker.log

Boot2Docker/var/log/docker.log

Debian GNU/Linux/var/log/daemon.log

CentOS/var/log/daemon.log | grep docker

Fedorajournalctl -u docker.service

Red Hat Enterprise Linux Server/var/log/messages | grep docker

# 示例
journalctl -f -u docker -n 20 --no-pager

tail -f -n 100 /var/log/messages | grep docker

6. 查看容器ip

1.进入容器内部

docker exec -it <container_name_or_id>  ip addr 

2. inspenct命令

# docker管理的容器
docker inspect --format ' .NetworkSettings.IPAddress ' <container_name_or_id> 


docker inspect <container_name_or_id>  grep -C 5 IPAddress

# dockercompose的容器

docker inspect -f 'range .NetworkSettings.Networks.IPAddressend' <container_name_or_id> 

显示所有容器 IP 地址
 

# docker管理的容器
docker inspect -f '.Name - .NetworkSettings.IPAddress ' $(docker ps -aq)

# docker compose管理的容器
docker inspect --format='.Name - range .NetworkSettings.Networks.IPAddressend' $(docker ps -aq)

以上是关于Docker :常用命令小册子的主要内容,如果未能解决你的问题,请参考以下文章

docker常用命令

Docker 容器 如何用java读取宿主机里的文件?

docker常用命令

Docker常用命令

docker常用命令

Docker常用命令大全