Docker篇之docker容器

前言:什么是容器¿

什么是容器¿
容器,是Docker的另一个核心概念,简单来说,容器是运行在镜像之上的,基于镜像而运行的。镜像是只读的,无法进行修改的,但是我们可以在容器中,基于镜像,来进行操作。


一、创建容器

1.创建容器(create)

首先我们先来看一下命令格式:

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

用上一节的镜像来创建个容器试一下

[root@localhost ~]# docker create -it newnginx:newtar
404aba21efb67897b4d298678573effc1705f7953c31a7d54b8209fd6e4e27da

使用create创建出来的容器是处于暂停状态下的,可以使用docker start来启动,这个命令后面会说。

容器可以说是整个Docker技术栈的核心, 所以创建命令create已经后面的run命令支持的选项非常之多,需要在实践中慢慢实践。我们可以用docker create --help 或者 docker run --help来查看详细介绍。在这里我贴几张中文对照图供大家查看。

(1)create与容器运行模式相关的选项
在这里插入图片描述
(2)create与容器环境和配置相关的选项
在这里插入图片描述
(3)create 与容器资源限制和安全保护相关的选项

在这里插入图片描述
在这里插入图片描述

2.启动容器(start)

命令格式:

docker start [OPTIONS] CONTAINER [CONTAINER...]

通过容器的CONTAINER ID来控制的,现在我们来启动一下刚才创建的容器。

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
404aba21efb6        newnginx:newtar     "/docker-entrypoint.…"   37 minutes ago      Created                                 elated_booth
[root@localhost ~]# docker start 404
404

这是我们通过docker ps命令查看到运行的容器,具体命令后面会讲。

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
404aba21efb6        newnginx:newtar     "/docker-entrypoint.…"   38 minutes ago      Up 39 seconds       80/tcp              elated_booth

3.创建并新建容器(run)

创建容器除了可以用create命令外,还可以使用run命令,等同于先create然后在start。

命令格式:

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

具体的OPTIONS选项可以用docker run --help来查看,这里先说下常用的,像端口映射之类的后期会有介绍,这里暂不赘述,一步一步来。
-i:让容器的标准输入保持打开
-t:让 Docker 分配一个伪终端并绑定到容器的标准输入上
-d: 让Docker 容器在后台以守护态形式运行。

4.查看容器输出(logs)

命令格式:

docker logs [OPTIONS] CONTAINER

具体可以用docker logs --help查看,这里不做解释。

二、停止容器

1.暂停容器(pause)

格式:

docker pause CONTAINER [CONTAINER...]

暂停上边创建的容器,并查看。

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
404aba21efb6        newnginx:newtar     "/docker-entrypoint.…"   About an hour ago   Up 41 minutes       80/tcp              elated_booth
[root@localhost ~]# docker pause 40
40
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
404aba21efb6        newnginx:newtar     "/docker-entrypoint.…"   About an hour ago   Up 41 minutes (Paused)   80/tcp              elated_booth

位于Paused状态下的容器,可以用unpause来恢复到运行状态,格式为

docker unpause CONTAINER [CONTAINER...]

2.终止容器(stop)

格式:

docker stop [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS选项:
-t:等待t秒后在关闭容器,默认10秒

此外,还可以用kill来强行终止容器,格式如下:

docker kill [OPTIONS] CONTAINER [CONTAINER...]

处于终止状态下的容器,可以用docker start来开启;也可以使用docker restart来进行重启容器。

三、操作容器

3.进入容器(attach|exec)

上面说过,创建启动容器时,如果用了-d选项,那么容器会在后台运行,既没有输出也无法操作。这时候有两个命令可以让我们进入容器。那就是attach和exec命令。

(1)attach命令格式:

docker attach [OPTIONS] CONTAINER

Options:
–detach-keys string :指定退出 attach 模式的快捷键序列, 默认是 CTRL-P-Q
–no-stdin 是否关闭标准输入,默认是保持打开
–sig-proxy 是否代理收到的系统信号给应用进程,默认为 true

这里来测试下命令的使用

[root@localhost ~]# docker pull centos:centos7.3.1611        #下载了一个centos的镜像
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
newnginx            newtar              4bb46517cac3        3 weeks ago         133MB
nginx               1.19.2              4bb46517cac3        3 weeks ago         133MB
centos              centos7.3.1611      c5d48e81b986        18 months ago       192MB
[root@localhost ~]# docker run -itd c5               #通过这个镜像创建了一个容器
f19e2a048673c997fff2353ba26298665b978988873c159337c20121430d5c1d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f19e2a048673        c5                  "/bin/bash"              6 seconds ago       Up 5 seconds                            naughty_khorana
[root@localhost ~]# docker attach f1
[root@f19e2a048673 /]# 

不过attach也有不便之处,就是如果你开多个窗口并同时attach到同一个容器时,所有窗口都会同步显示;当某一个窗口因命令阻塞时,其他窗口也无法执行操作。

(2)exec命令格式:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS:
-d, --detach 在容器中后台执行命令;
–detach-keys string 指定将容器切回后台的按键;
-e, --env list :指定环境变量列表
-i, --interactive 打开标准输入接受用户输入命令, 默认值为false;
–privileged 是否给执行命令以高权限,默认值为 false
-t, --tty 分配伪终端,默认值为 false;
-u, --user string :执行命令的用户名或 ID
-w, --workdir string 容器内的工作目录
通过指定 it 参数来保持标准输入打开,并 且分配 一个伪终端 通过 ec 命令对容器执行操作是最为推荐的方式

4.删除容器(rm)

格式:

docker rm [OPTIONS] CONTAINER [CONTAINER...]

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

默认情况docker rm下无法在容器运行的状态下进行容器的删除,添加-f选项后会先发送SIGKILL信号给容器,终止其内的应用,然后在强行删除。

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f19e2a048673        c5                  "/bin/bash"              30 minutes ago      Up 30 minutes                           naughty_khorana
0ab0bc5b18f1        c5                  "/bin/bash"              31 minutes ago      Up 31 minutes                           modest_easley
f758e99d39a1        4bb                 "/docker-entrypoint.…"   40 minutes ago      Up 40 minutes       80/tcp              gracious_nobel
404aba21efb6        newnginx:newtar     "/docker-entrypoint.…"   3 hours ago         Up 2 hours          80/tcp              elated_booth
[root@localhost ~]# docker rm -f 0ab0bc5b18f1           #强制删除0ab0bc5b18f1容器
0ab0bc5b18f1
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f19e2a048673        c5                  "/bin/bash"              31 minutes ago      Up 31 minutes                           naughty_khorana
f758e99d39a1        4bb                 "/docker-entrypoint.…"   40 minutes ago      Up 40 minutes       80/tcp              gracious_nobel
404aba21efb6        newnginx:newtar     "/docker-entrypoint.…"   3 hours ago         Up 2 hours          80/tcp              elated_booth

5.导出导入容器(export、import)

(1)导出容器

官方的解释是这样的:将容器的文件系统导出为tar存档。

命令格式:

docker export [OPTIONS] CONTAINER

Options:
-o, --output string 指定导出的tar文件名

(2)导入容器

命令格式:

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

Options:
-c, --change list 在导入的同时执行对容器进行修改的 Dockerfile(可用于创建镜像的文件,后续文章会介绍)
-m, --message string 为导入的映像设置提交消息
–platform string 如果服务器支持多平台,则设置平台

6.查看容器(ps,top,inspet…)

(1)查看容器详情

查看某容器的具体信息,会以 json 格式返回包括容器 Id 创建时间、路径、状态、镜像、配置等在内的各项信息,

命令格式:

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

(2)查看容器内进程

打印出容器内的进程信息,包括 PID、用户、时间、命令等 例如,查看某容器内的进程信息。

命令格式:

docker top CONTAINER [ps OPTIONS]

(3)查看统计信息

显示 CPU 、内存、存储、网络等使用情况的统计信息

格式:

docker stats [OPTIONS] [CONTAINER...]

栏名描述
CONTAINER ID 和 Name 容器的ID和名称
CPU % 和 MEM % 容器正在使用的主机CPU和内存的百分比
MEM USAGE / LIMIT 容器正在使用的总内存以及允许使用的总内存量
NET I/O 容器通过其网络接口发送和接收的数据量
BLOCK I/O 容器已从主机上的块设备读取和写入的数据量
PIDs 容器创建的进程或线程数

Options:
-a, --all: 输出所有容器统计信息,默认仅在运行中;
–format string :格式化输出信息;
–no-stream :不持续输出,默认会自动更新持续实时结果;
–no-trunc :不截断输出信息

(4)列出容器

命令格式:

docker ps [OPTIONS]

可用参数:
-a, --all 查看所有
-f, --filter filter Filter output based on conditions provided
–format string Pretty-print containers using a Go template
-n, --last int 显示最后创建的n个容器(-1是显示所有)
-l, --latest 显示最后创建的那个容器
–no-trunc Don’t truncate output
-q, --quiet 只输出容器ID
-s, --size 显示容器文件大小

7.其他容器命令

(1)复制文件cp

容器支持与主机之间复制文件,命令格式如下:

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

Options:
-a, --archive:打包模式,复制文件会带有原始的 uid/gid 信息;
-L, --follow-link:跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容。

例:复制本地下app文件夹到容器的/tmp目录下

[root@localhost ~]# docker cp app f1:/tmp
[root@localhost ~]# docker attach f1
[root@f19e2a048673 /]# ls tmp/
app  ks-script-LRoSA2  yum.log
[root@f19e2a048673 /]#

*2.查看容器内变化diff
用于检查容器内的文件或目录的更改,格式为:

docker diff CONTAINER

例如查看下f1容器下的变化

[root@localhost ~]# docker diff f1
C /tmp
A /tmp/app

3.列出容器的端口映射或特定映射port
格式:

docker port CONTAINER [PRIVATE_PORT[/PROTO]]

官方解释道,docker port至少需要1个参数,最多2个参数。

4.更新容器配置update

格式:

docker update [OPTIONS] CONTAINER [CONTAINER...]

Options:
–blkio-weight uint16:更新块 IO 限制, 10~1000 ,默认值为0,代表着无限制;
–cpu-period int :限制 CPU 调度器 CFS (Completely Fair Scheduler )使用时间,
单位为微秒,最小 1000;
–cpu-quota int 限制CPU CFS(完全公平调度程序)配额
–cpu-rt-period int 以微秒为单位限制CPU的实时周期
–cpu-rt-runtime int 以微秒为单位限制CPU实时运行时间
-c, --cpu-shares int CPU份额(相对权重)
–cpus decimal CPU数量
–cpuset-cpus string -允许执行的CPU(0-3,0,1)
–cpuset-mems string 允许执行的MEMs(0-3,0,1)
–kernel-memory bytes 内核内存限制
-m, --memory bytes 内存限制
–memory-reservation bytes 内存软限制
–memory-swap bytes: 交换限制等于内存加交换:’-1’以启用无限制交换
–pids-limit int:调整容器pids限制(设置-1表示无限制)
–restart string:容器退出后的重启策略


总结

容器是直接提供应用服务的组件,也是 Docker 整个技术核中最为核心的概念 围绕容
器, Docker 提供了十分丰富的操作命令,允许用户高效地管理容器的整个生命周期 。大家可以使用 docker help 令查看 Docker 支持的容器操作子命令。

posted @ 2020-10-09 10:49  开心burukku  阅读(369)  评论(0编辑  收藏  举报