『 云原生·Docker』Docker容器相关操作

时间:2022-10-13 14:53:51

系列文章目录

本系列主要分为以下六大部分,正在更新中,尽请期待!

????点击关注本专栏


提示:已经更新的或正在更新的文章前面打勾了哈!


前言

容器是 Docker的另一个核心概念。

简单来说,容器是镜像的一个运行实例(Java中的对象与类)。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时容器中的应用进程处于运行状态。

如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用。

那么 Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。

一、创建容器

1.创建运行容器

使用 docker create [OPTIONS] IMAGE [COMMAND] [ARG...]命令新建的容器,如下:

docker create -it ubuntu:latest

使用 docker create命令新建的容器处于停止状态,可以使用 docker start [OPTIONS] CONTAINER [CONTAINER...]命令来启动它,如下:

docker start

也可以直接新建并启动容器,docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 等价于先执行 docker create 再执行docker start 命令。

docker run ubuntu

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

  1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
  2. 利用镜像创建一个容器,并启动该容器。
  3. 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层。
  4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
  5. 从网桥的地址池配置一个IP地址给容器。
  6. 执行用户指定的应用程序。
  7. 执行完毕后容器被自动终止。

OPTIONS说明:

  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口;
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口;
  • --name="nginx-lb": 为容器指定一个名称;
  • -e username="ritchie": 设置环境变量;
  • --env-file=[]: 从指定文件读入环境变量;
  • -m :设置容器使用内存最大值;
  • --link=[]: 添加链接到另一个容器;
  • --expose=[]: 开放一个端口或一组端口;

某些时候执行 docker run时候因为命令无法正常执行容器会出错,直接退出,此时可以查看退出的错误代码。

默认情况下,常见错误代码包括:

  • 125: Docker daemon执行出错,例如指定了不支持的 Docker命令参数;
  • 126:所指定命令无法执行,例如权限出错;
  • 127:容器内命令无法找到。

命令执行后出错,会默认返回命令的退出错误码。

2.守护态运行

更多的时候,需要让 Docker容器在后台以守护态( Demonized)形式运行。此时,可以通过添加 -d 参数来实现。

容器启动后会返回一个唯一的id,也可以通过 docker psdocker container ls 命令来查看容器信息

3.查看容器输出

要获取容器的输出信息,可以通过 docker logs [OPTIONS] CONTAINER命令。

OPTIONS说明:

  • -details:打印详细信息;
  • -f, -follow:持续保持输出;
  • -since string:输出从某个时间开始的日志;
  • -tail string:输出最近的若干日志;
  • -t,- timestamps:显示时间戳信息;
  • -until string:输出某个时间之前的日志。

我们可以使用 docker container help 命令查看 Docker支持的容器操作子命令。

二、进入容器

在启动Docker容器的时如果使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。

这个时候如果需要进入容器进行操作,推荐使用官方的 attachexec命令。

1.attach命令

使用docker attach [OPTIONS] CONTAINER可以连接到正在运行中的容器,如下:

# 启动容器
docker run -d --name demo ubuntu /usr/bin/top -b
# 连接正在运行的容器
docker attach demo

但是使用 attach命令要注意:

  1. 当多个窗口同时 attach到同一个容器的时候,所有窗口都会同步显示;
  2. 当某个窗口因命令阻塞时,其他窗口也无法执行操作了;

2.exec命令

使用docker exec [OPTIONS] CONTAINER COMMAND [ARG...]在运行的容器中执行命令,如下:

OPTIONS说明:

  • -d, --detach:在容器中后台执行命令;
  • --detach-keys="":指定将容器切回后台的按键;
  • -e,--env=[]:指定环境变量列表;
  • -i, --interactive=true|false : 打开标准输入接受用户输人命令,默认值为false;
  • --privileged=true| false:是否给执行命令以高权限,默认值为false;
  • -t , --tty= true false:分配伪终端,默认值为 false;
  • -u, --user="" : 执行命令的用户名或ID;

例如:进入到刚创建的容器中,并启动一个bash

docker exec -it e9df568dfad7 /bin/bash

可以看到会打开一个新的bash终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。

注意:通过指定 -it 参数来保持标准输入打开,并且分配一个伪终端。通过 exec 命令对容器执行操作是最为推荐的方式

三、停止容器

1.暂停容器

使用docker pause命令暂停容器,处于paused状态的容器,可以使用 docker unpause 命令来恢复到运行状态

大家可以自己动手试试:

# 查看当前处于运行状态的容器
docker ps
#暂停一个容器
docker pause NAME
# 查看当前处于运行状态的容器
docker ps

2.终止容器

终止容器常见有以下几种方式:

  1. 使用docker stop 命令终止容器。
    该命令会首先向容器发送 SIGTERM信号,等待一段超时时间后(默认为10秒),再发送SIGKILL信号来终止容器。
  2. 执行 docker container prune 命令,会自动清除掉所有处于停止状态的容器。
  3. 还可以通过 docker kill 直接发送 SIGKILL信号来强行终止容器。
  4. 当 Docker容器中指定的应用终结时,容器也会自动终止。
    例如:只启动了一个终端的容器,用户通过 exit 命令或 Ctrl + d 来退出终端时,所创建的容器立刻终止,处于 stopped状态。

我们可以用 docker ps -qa 命令看到所有容器的ID。

四、删除容器

可以使用 docker rm [OPTIONS] CONTAINER [CONTAINER...]命令来删除处于终止或退出状态的容器。

OPTIONS说明:

  • -f, --force= false : 是否强行终止并删除一个运行中的容器;
  • -l, --link=false : 删除容器的连接,但保留容器;
  • -v,--volumes=false : 删除容器挂载的数据卷;

例如:查看处于终止状态的容器并删除:

#查看处于终止状态的容器
docker ps -a
#删除f8988cc08e1a
docker rm f8988cc08e1a
#查看处于终止状态的容器
docker ps -a

如下图:
『 云原生·Docker』Docker容器相关操作

默认情况下,docker rm命令只能删除已经处于终止或退岀状态的容器,并不能删除还处于运行状态的容器。

如果要直接删除一个运行中的容器,可以添加-f参数。 Docker会先发送SIGKILL 信号给容器,终止其中的应用,之后强行删除。

看看本专栏文章有哪些吧!

本系列文章目录:

  • 『 云原生·生之门』
  • 『 云原生·前置知识』
  • 『 云原生·Docker』
  • 『 云原生·Kubernetes』
  • 『 云原生·KubeSphere』
  • 『 云原生·DevOps』

可以看出来本系列文章将会带你从-1到1的学习云原生的,一起加油吧!

总结

容器是直接提供应用服务的组件,也是 Docker整个技术栈中最为核心的概念。围绕容器,Docker提供了十分丰富的操作命令,允许用户高效地管理容器的整个生命周期。