Docker篇之docker容器
前言:什么是容器¿
什么是容器¿
容器,是Docker的另一个核心概念,简单来说,容器是运行在镜像之上的,基于镜像而运行的。镜像是只读的,无法进行修改的,但是我们可以在容器中,基于镜像,来进行操作。
首先我们先来看一下命令格式:
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 与容器资源限制和安全保护相关的选项
命令格式:
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
创建容器除了可以用create命令外,还可以使用run命令,等同于先create然后在start。
命令格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
具体的OPTIONS选项可以用docker run --help来查看,这里先说下常用的,像端口映射之类的后期会有介绍,这里暂不赘述,一步一步来。
-i:让容器的标准输入保持打开
-t:让 Docker 分配一个伪终端并绑定到容器的标准输入上
-d: 让Docker 容器在后台以守护态形式运行。
命令格式:
docker logs [OPTIONS] CONTAINER
具体可以用docker logs --help查看,这里不做解释。
格式:
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...]
格式:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS选项:
-t:等待t秒后在关闭容器,默认10秒
此外,还可以用kill来强行终止容器,格式如下:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
处于终止状态下的容器,可以用docker start来开启;也可以使用docker restart来进行重启容器。
上面说过,创建启动容器时,如果用了-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 命令对容器执行操作是最为推荐的方式
格式:
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
(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 如果服务器支持多平台,则设置平台
(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 显示容器文件大小
(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 支持的容器操作子命令。