Docker :常用命令小册子
Posted 琦彦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker :常用命令小册子相关的知识,希望对你有一定的参考价值。
Docker 命令查询
基本语法
Docker 命令有两大类,客户端命令和服务端命令。前者是主要的操作接口,后者用来启动 Docker Daemon。
-
客户端命令:基本命令格式为
docker [OPTIONS] COMMAND [arg...]
; -
服务端命令:基本命令格式为
dockerd [OPTIONS]
。
可以通过 man docker
或 docker help
来查看这些命令。
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: 直接查看
-
准备
- 确认容器 id
-
命令
# 只要有 容器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
Fedora:journalctl -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 :常用命令小册子的主要内容,如果未能解决你的问题,请参考以下文章