命令行大全,带你领略Docker容器的使用

一、查看Docker的信息(info)

  • 容器是基于镜像运行的
  • 启动容器时首先判断本地是否存在指定的镜像,如果存在那么就使用本地镜像启动容器;如果本次不存在,那么就去远程仓库Docker Hub中拉取镜像,拉取到本地之后再运行容器。整个过程如下图所示:

  • 通过下面的命令可以查看Docker的工作情况
sudo docker info

  • 该命令会返回所有容器和镜像的数量、Docker使用的执行驱动和存储驱动(execution and storage driver)、以及Docker的基本配置

二、运行Docker容器(run)

  • 可以使用下面的命令来创建一个容器,相关含义如下:
    • -i:保证容器STDIN是开启的
    • -t:告诉Docker为要创建的容器分配一个伪tty终端。这样新创建的容器就可以提供一个交互式shell
    • ubuntu:用来告诉Docker基于什么镜像来创建容器,本例中我们使用ubuntu镜像
      • ubuntu镜像是一个常备镜像,也可以称为“基础”(base)镜像,它由Docker公司提供,保存在Docker Hub Registry上(http://hub.docker.com/
      • 你可以用 ubuntu 基础镜像(以及类似的 fedora、debian、centos等镜像)为基础,在你选择的操作系统上构建自己的镜像。这里,我们基于此基础镜像启动了一个容器,并且没有对容器进行任何改动
    • /bin/bash:最后告诉Docker在新容器中要运行什么命令,在本例中我们在容器中运行了/bin/nash命令启动了一个Bash shell
sudo docker run -i -t ubuntu /bin/bash

  • 该命令背后做什么什么?
    • 首先Docker检查本地是否存在ubuntu镜像,如果没有该镜像的话,Docker就会连接官方维护的Docker Hub Registry,查看Docker Hub中是否有该镜像,Docker一旦找到该镜像,就会下载镜像并保存到本机中
    • 例如上图所示,第一行在本机没有找到ubuntu镜像,于是就去Docker Hub中中下载
  • 启动之后就会进入Docker容器所指定的ubuntu的命令行中,如下图所示:
    • 我们以root用户登录到了新容器中
    • 容器的ID为e2be0878c77a

  • 现在我们可以输入一些命令来对容器中的主机进行操作
  • 例如,查看容器的主机名,可以看到与其容器ID一致
hostname

  • 例如,查看容器的/etc/hosts文件,如下所示,Docker已在hosts文件中为该容器的IP地址添加了一条主机配置项
cat /etc/hosts

  • 例如,查看容器的网络接口,如下所示:
    • 容器有一个lo的环回接口
    • 还有IP为172.18.0.2的标准eth0网络接口
# Docker第一次没有网络接口工具, 先要进行安装

# 更新软件包
apt-get update

# 安装
apt-get install iproute2 iproute2-doc net-tools

# 查看网络接口
ip a

  • 例如,查看容器中运行的进程

  • 退出当前容器:输入exit即可终止容器的shell,返回到宿主机的shell中
exit

  • 退出当前容器之后,容器也就不工作了,但是没有被删除

容器的停止

  • 如果在运行容器时,容器的任务运行结束了(例如打印一条信息,或者其他事情),那么容器就会自动停止运行
  • 在上面的例子中,我们在docker run最后让其开启了一个shell,这样容器就会一直保持运行状态,从而不会结束

三、列出容器列表(ps)

  • 上面我们终止了容器的shell之后,但是容器仍然存在,可以通过下面的命令查看:
    • CONRAINER ID:容器ID
    • IMAGE:创建该容器的镜像
    • COMMABD:容器最后执行的命令
    • CREATED:容器创建时间
    • STATUS:容器的退出状态(此处为0,表示正常退出)
    • PROTS:容器与宿主机的端口映射,可以参阅该文章“三”中的“第四步”:https://blog.csdn.net/qq_41453285/article/details/107389320
    • NAMES:容器的名称
# 仅列出正在运行的容器
sudo docker ps

# 列出所有容器(不论是否正在运行)
sudo docker ps -a

# 列出最后一个运行的容器
sudo docker ps -l

  • 其他参数选项:
    • --format:用只显示哪些信息,以及如何显示信息
    • -n x:显示最后x个容器

  • 例如,查看当前存在状态的容器

  • 例如,只查看容器的ID(要带上-a选项)

附加

  • 有3种方式可以唯一标识容器:
    • 短UUID:例如f7cbdac22a02
    • 长UUID:例如f7cbdac22a02e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778
    • 名称:例如gray_cat

四、容器命名(--name)

  • 上面我们启动容器时,Docker会为容器自动生成一个随机的名称,例如上面那个容器的名称为“strange_cray”
  • --name选项:如果想要为容器指定一个名称,那么可以使用该选项。例如:
# 启动一个容器,名称为bob_the_container
sudo docker run --name bob_the_container -i -t ubuntu /bin/bash

容器命名规则

  • 一个合法的容器名称只能包含以下字符:小写字母a~z、大写字母A~Z、数字0~9、下划线、圆点、横线
  • 如果用正则表达式来表示这些符号,就是[a-zA-Z0-9_.-]

容器命名的好处

  • 很多Docker命令中,我们都可以用容器的名称来替代容器ID,后面我们将会看到
  • 容器名称有助于分辨容器,当构建容器和应用程序之间的逻辑连接时,容器的名称也有助于从逻辑上理解连接关系。具体的名称(如web、db)比容器ID和随机容器名好记多了(备注:在后面“在测试中使用Docker”的文章中会介绍如何连接到Docker)
  • 容器的命名必须是唯一的:
    • 如果我们试图创建两个名称相同的容器,则命令将会失败
    • 如果要使用的容器名称已经存在,可以先用docker rm命令删除已有的同名容器后,再来创建新的容器

五、启动、停止、重启(start、stop、restrat)

启动

  • 上面我们所有的容器都停止工作了,可以使用下面的命来启动一个Docker容器
sudo docker start bob_the_container

  • 启动之后,可以用不带-a选项的ps选项来查看正在运行的Docker容器
sudo docker ps

  • 当然,也可以通过容器的ID启动已经停止运行的Docker容器
sudo docker start 16ecf568ca88
  • 备注:启动之后不会自动启动Docker的shell,下面会介绍使用attach选项附着到容器

停止

  • 可以使用下面的命令来停止一个正在运行的Docker容器
sudo docker stop bob_the_container

  • 启动之后,可以用不带-a选项的ps选项来查看正在运行的Docker容器,发现没有容器在运行
sudo docker ps

  • 当然,也可以通过容器的ID来停止Docker容器的运行
sudo docker stop 16ecf568ca88

重启

  • 当然,也可以用restart选项来重启一个Docker容器
sudo docker restart bob_the_container

sudo docker restart 16ecf568ca88

六、附着到容器上(attach)

  • Docker容器重启的时候会沿用Docker run命令时指定的参数来运行shell,但是不会像第一次一样直接进入shell
  • 因此可以通过docker attach命令重新附着到容器的会话上,如下所示:
# 启动容器
sudo docker start bob_the_container

# 通过容器名附着
sudo docker attach bob_the_container

# 通过容器ID附着
sudo docker attach 16ecf568ca88

  • 输入exit停止运行容器
exit

七、创建守护式容器(-d)

  • -d选项可以让容器以守护进程的方式在后台运行
  • 与上文介绍的一样,如果容器任务结束了,那么容器也会自动停止运行

演示案例

  • 命令如下:
    • 下面创建了一个守护式容器,名为daemon_dave
    • 该守护式容器会执行shell命令,每1秒打印一次“hello world”
    • 创建成功之后,docker run命令会返回该容器的ID
sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

  • 运行之后可以通过ps命令查看到该守护式容器正在运行:
sudo docker ps

八、查看容器的日志(logs)

  • 可以通过logs选项来查看容器的日志
  • 例如,下面查看bob_the_container容器的日志
# 通过容器名查看
sudo docker logs bob_the_container

# 通过容器ID查看
sudo docker logs 16ecf568ca88

  • 例如,下面查看守护式容器daemon_dave的日志
sudo docker logs daemon_dave

日志格式化查看

  • -f:类似于tail -f命令,可以用来监控Docker的日志,会持续动态更新打印日志的内容,按下Ctrl+C可退出查看。例如:
# 查看守护容器的日志消息
sudo docker logs -f daemon_dave

  • --tail:用来查看日志的某一片段。例如:
# 查看日志的最后10行内容
sudo docker logs --tail 10 daemon_dave

# 查看某个容器的最新日志而不必读取整个日志文件
sudo docker logs --tail 0 -f daemon_dave

  • -t:为每条日志加上时间戳。例如:
sudo docker logs -ft daemon_dave

 

九、Docker日志驱动(--log-driver)

  • 自Docker 1.6开始,也可以控制Docker守护进程和容器所用的日志驱动,这可以通过--log-driver选项来实现
  • --log-driver选项可选的值有:
    • json-file:默认的
    • syslog:将禁用docker logs命令,将所有容器的日志输出都重定向到Syslog中
  • 新的日志驱动也在不断增加,在Docker 1.8中,新增了对Graylog GELF协议、Fluentd以及日志轮转驱动的支持
  • 备注:如果是在Docker Toolbox中运行Docker,应该在虚拟机中启动Syslog守护进程。可以先通过docker-machine shh命令连接到Docker Toolbox虚拟机,再在其中运行syslogd命令来启动Syslog守护进程

演示案例

  • 下面创建一个容器:
    • 容器为守护进程,名为daemon_dwayne
    • 容器每隔1秒打印一次“hello world”
    • 容器的日志驱动为“syslog”,日志都输出到Syslog
sudo docker run --log-driver="syslog" --name daemon_dwayne -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

  • 查看守护进程是否启动成功
sudo docker ps

  • 因此日志都输出到Syslog,所以使用logs选项查看日志时不能显示
sudo docker logs daemon_dwayne

十、查看容器内的进程(top)

  • 除了容器的日志,也可以查看容器内部运行的进程。要做到这一点,要使用docker top命令
  • 例如,下面启动daemon_dave守护容器,并查看其内部运行的进程:
    • UID:用户
    • PID、PPID:进程ID、父进程ID
    • STIME:运行时间
    • CMD:进程执行的命令
sudo docker start daemon_dave

sudo docker top daemon_dave

十一、Docker统计信息(stats)

  • stats选项可以显示一个或多个容器的统计信息,可以显示容器的CPU、内存、网络I/O以及存储I/O的性能和指标
  • 例如,下面同时查看3个Docker容器的运行信息
sudo docker stats daemon_dave daemon_dwayne bob_the_container

十二、在容器内部运行新程序(exec)

  • 在Docker 1.3之后,可以通过docker exec命令在容器内部启动新程序/进程
  • 可以在容器内运行的进程有两种类型:后台任务和交互式任务
  • 通过该命令,可以对容器进行维护、监控以及管理任务
  • 备注:
    • 从Docker 1.7开始,可以对docker exec启动的进程使用-u选项为新启动的进程指定一个用户属主
    • docker exec命令是Docker 1.3引入的,早期版本并不支持该命令。对于早期的Docker版本,请参阅nstnter

“后台任务”演示案例

  • 运行daemon_dave容器
sudo docker start bob_the_container

  • 然后在不进入该容器的情况下,让其执行一条touch命令
sudo docker exec -d bob_the_container touch /etc/new_config_file

  • 进入该容器,可以查看到该文件创建成功
sudo docker attach bob_the_container

ls /etc/new_config_file

“交互任务”演示案例

  • 下面我们让daemon_dave守护容器开启一个伪终端,命令如下:
    • -t:告诉Docker为容器分配一个伪tty终端
    • -i:保证容器STDIN是开启的
    • /bin/bash:告诉容器执行/bin/bash命令开启一个伪终端
sudo docker start daemon_dave

sudo docker exec -t -i daemon_dave /bin/bash

  • 因为上面我们是让daemon_dave守护容器开启一个伪终端,所以输入exit之后,退出的是那个新建的伪终端,但是daemon_dave守护容器仍然在运行
exit

sudo docker ps

  • 输入下面的命令才会真正关闭daemon_dave守护容器
sudo docker stop daemon_dave

sudo docker ps

十三、自动重启容器(--restart)

  • Docker 1.2.0引入了该选项
  • --restart选项可以让Dcoker在出错的情况下自动重启。--restart会检查容器的退出代码,并依次来判断是否要重启容器
  • 默认的情况下,Docker是不会重启任何容器的
  • 例如,下面创建一个容器:--restart的取值为always,表示Docker会自动重启该容器
sudo docker run --restart=always -i -t --name container_dong -d ubuntu /bin/sh
  • 例如,下面创建一个容器:
    • 为--restart指定on-failure标志,on-failure标志表示只有当容器的退出代码为非0值的时候才会自动重启
    • on-failure标志后面还接一个可选的数组,表示最多重启多少次
sudo docker run --restart=on-failure:5 -i -t --name container_dong -d ubuntu /bin/sh

十四、获取容器的详细信息(inspect)

  • 除了docker ps命令可以获取容器的信息,还可以使用inspace选项来获得更多的容器的消息
  • inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置等
  • 演示案例:下面启动bob_the_container容器,并查看其详细信息(内容太多,只截取部分)
sudo docker start bob_the_container

sudo docker inspect bob_the_container

  • --format选项:
    • 该选项可以用来查看指定的结果
    • 备注:Docker命令中的--format选项或-f选项支持完整的Go语言模板。用它进行查询时,可以充分利用Go语言模板的优势
    • 例如,下面的两条命令分别查看该容器的运行状态和IP地址
sudo docker inspect --format='{{ .State.Running }}' bob_the_container

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

  • 演示案例:下面查看多个容器的信息,例如查看bob_the_container容器和daemon_dave容器的名称和运行状态
sudo docker inspect --format='{{ .Name }} {{ .State.Running }}' bob_the_container daemon_dave

附加

  • 除了查看容器,还可以通过相关目录查看Docker的相关数据:
    • /var/lib/docker:该目录存放着Docker镜像、容器以及容器的配置
    • /var/lib/docker/containers:所有的容器都保存在该目录下,例如上面我们创建了4个容器,在这个目录下就有四个容器

十五、删除容器(rm)

  • 如果容器不再使用,可以通过rm选项来删除它们
  • 演示案例:下面删除daemon_dwayne容器,删除之后可以看见/var/lib/docker/containers目录下对应的容器被删除了
sudo docker rm daemon_dwayne

 

-f选项

  • 从Docker 1.6.2开始,可以通过docker rm -f来删除正在运行的Docker容器
  • 但是Docker 1.6.2不能,只能先用docker stop或docker kill名停止容器,然后再删除

删除全部容器

  • 目前,Docker不支持一次删除所有容器的方法,但是可以自己通过命令实现
  • 首先,查看当前机器上的所有容器
sudo docker ps -a

  • 然后输入下面的命令删除所有容器:先使用ps -aq列出所有的容器ID,然后再执行docker rm删除
sudo docker rm $(sudo docker ps -aq)

十六、容器的导入和导出

导出容器

  • 如果要导出本地某个容器,可以使⽤ docker export 命令

  • 导入的时候可以指定容器ID或者名称等
  • 例如,下面先查看容器ID,然后再根据容器ID导出容器
docker container ls -a

docker export 7691a814370e > ubuntu.tar

导入容器

  • 可以使⽤docker import从容器快照⽂件中再导⼊为镜像

  • 例如,下面导入ubuntu.tar,并在本地将容器命名为ubuntu.tar test/ubuntu:v1.0
docker import ubuntu.tar test/ubuntu:v1.0
  • 此外,也可以通过指定 URL 或者某个⽬录来导⼊,例如
docker import http://example.com/exampleimage.tgz example/imagerepo
  • 注:⽤户既可以使⽤ docker load 来导⼊镜像存储⽂件到本地镜像库,也可以使⽤ docker import来导⼊⼀个容器快照到本地镜像库。这两者的区别在于容器快照⽂件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),⽽镜像存储⽂件将保存完整记录,体积也要⼤。此外,从容器快照⽂件导⼊时可以重新指定标签等元数据信息。

  • 我是小董,V公众点击"笔记白嫖"解锁更多【Docker】资料内容。

相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页