Docker 学习笔记之Docker容器操作

in Linux with 0 comment

容器操作主要是Docker容器的create、start、run、wait、logs

创建容器

使用docker [container] create 命令新建一个容器,例如

docker create myubuntu:v1.0 //创建容器

docker ps -a //查看所有容器。包含已停止的容器

docker start NAME[ID]

我在测试时,发现无论怎么启动myubuntu容器,它都处于停滞的状态,目测这个命令在这个实例无效

可使用docker run -it --name wayne myubuntu:v1.0 bash

错误提示:这句话是在下面笔记中发现的,docker create 创建的容器是可以正常的启动的。我没有启动的原因是:未按照标准语法书写,取消 -it 命令,全命令:docker create -it myubuntu:v1.0

容器是整个docker技术栈的核心,create和run命令支持的选项都十分繁杂,需要认真体会练习

选项主要包括如下几大类: 与容器运行模式相关、与容器环境配置相关、与容器资源限制和安全保护相关

create命令与容器环境和配置相关的选项

选项说明
--add-host=[]在容器内添加一个主机名到IP地址的映射关系(通过/etc/hosts文件)
--device=[]映射物理机上的设备到容器
--dns-search=[]DNS搜索域
--dns-opt=[]自定义的DNS选项
--dns= []自定义的DNS 服务器
- e,--env= []指定容器内环境变量
--env-file=[]从文件中读取环境变量到容器内
-h,-- hostname=“ ”指定容器内的主机名
--ip=“”指定容器的IPv4地址
--ip6=“”指定容器的IPv6地址
--link=[:alias]链接到其他容器
--link-local-ip=[]:容器的本地链接地址列表
--mac-address=“”指定容器的Mac地址
--name=“ ”指定容器别名

create命令与容器运行模式相关的选项

选项说明
-a, --attach=[]是否绑定到标准输入、输出和错误
-d ,-- detach=true| false是否在后台运行容器,默认为否
-- detach-keys=””从attach 模式退出的快捷链’
-- entrypoint="”镜像存在人口命令时,覆盖为新的命令
-- expose=[]指定容器会暴露出来的端口或端口范围
--group-add=[]运行容器的用户组
-i, --interactive=true | false保持标准输入打开,默认为false
--ipc=“”容器lPC 命名空间,可以为其他容器或主机
-- isolation=”default ”容器使用的隔离机制
--log-driver="json-file”指定容器的日志驱动类型,可以为〕son-file 、syslog 、journald、
gelf 、fluentd , awslogs 、splunk , etwlogs 、
gcplogs 或none
--log-opt=[]传递给日志驱动的选项
--net=“bridge”指定容器网络模式,包括bridge、none、其他容器内网络、host的网络或某个现有网络等
--net-alias=[]容器在网络中的别名
-p,--publish-all=trueifalse通过NAT 机制将容器标记暴露的端口自动映射到本地主机的l临时端口
-p , - -publish=[ ]指定如何|决射到本地主机端口,例如- p l l 234- l2234: 1234-2234
--pid=host容器的PID 命名空间
--userns=“”启用userns-remap 时配置用户命名空间的模式
--uts=host容器的UTS 命名空间
-- restart =” no"容器的重启策略,包括no、on- failure [:max-retry ] 、always 、unless-stopped 等
- rm=true|false容器退出后是否自动删除,不能跟-d 同时使用
-t, --tty=true |false是否分配一个伪终端,默认为fa l se
--tmpfs=[]挂载临时文件系统到容器
-v|--volume[=[[HOST-D IR:]CONTAINER-DIR [:OPTIONS]]]挂载主机上的文件卷到容器内
--volume-driver=" ”挂载文件卷的驱动类型
- -volumes- from=[]从其他容器挂载卷
-w, --workdir= ""容器内的默认工作目录

create命令与容器资源限制和安全保护的相关配置

选项说明
--blkio -weight=10~1000容器读写块设备的1/0 性能权重,默认为0
- - blkio-weight-device=[DEVICE_NAME: WEIGHT]指定各个块设备的IIO 性能权重
--cpu-shares=0允许容器使用CPU 资源的相对权重,默认一个容器能用满一个核的CPU
--cap-add=[]增加容榕的Linux 指定安全能力
--cap-drop=[]移除容器的Li nux 指定安全能力
--cgroup-parent=” ”容器cgroups 限制的创建路径
--cidfile=” ”指定容器的进程ID 号写到文件
--cpu-period=0限制j容器在CFS 调度器下的CPU 占用时间片
--cpuset-cpus=” ”限制容器能使用哪些CPU 核心
--cpuset-mems=""NUMA 架构下使用哪些核心的内存
-- cpu-quota=0限制容器在CFS调度下的CPU 配额
--device-read-bps=[]挂载设备的读吞吐率(以bps 为单位)限制
--device-write-bps=[]挂载设备的写吞吐率(以bps 为单位)限制
--device-read- iops=[]挂载设备的读速率(以每秒i/o 次数为单位)限制
--device-write -iops=[]挂载设备的写速率(以每秒i/o 次数为单位)限制
--health-cmd=””指定检查容器健康状态的命令
--health-interval=0s执行健康检查的间隔时间,单位可以为ms 、s、m 或h
--health-retries=int健康检查失败重试次数,超过则认为不健康
--health-start-period=0s容器启动后进行健康检查的等待时间, 单位可以为ms 、s、m 或h
--health-timeout=0s健康检查的执行超时,单位可以为ms 、s 、m 或h
- -no-healthcheck=true|false是否禁用健康检查
-- init在容器中执行一个init进程,来负责响应信号和处理僵尸状态子进程
--kernel memory=""限制容器使用内核的内存大小, 单位可以是b 、k、m 或g
-m, - -memory =“”限制容器内应用使用的内存,单位可以是b 、k、m 或g
--memory-reservation=” ”当系统中内存过低时, 容器会被强制限制内存到给定值,默认情况下等于内存限制值
--memory-swap =” LIMIT"限制容器使用内存和交换区的总大小
--oom-kill-disable=true|false内存耗尽时是否杀死容器
--oom- score-adj =“”调整容器的内存耗尽参数
- -pids- limit=” ”限制容器的pid 个数
--privileged=true|false是否给容器高权限, 这意味着容器内应用将不受权限的限制, 一般不推荐
-- read-only =true|false是否让容器内的文件系统只读
- -security- opt = []指定一些安全参数, 包括权限、安全能力、apparmor 等
- -stop-signal=SIGTERM指定停止容器的系统信号
- -shm- size =””/dev/shm的大小
-- sig-proxy =true|false是否代理收到的信号给应用,默认为时true , 不能代理SIGCHLD 、SIGSTOP 和SIGKILL 信号
- - memory-swappiness=" 0~100”调整容器的内存交换区参数
- u , --user =“”指定在容器内执行命令的用户信息
--userns= " "指定用户命名空间
- -ulimit = []通过ulimit 来限制最大文件数、最大进程数等

其他选项还包括:
-l, --label =[]: 以键值对方式指定容器的标签信息;
--label-file=[]: 从文件中读取标签信息。

启动容器

使用docker [container] start 命令来启动一个已创建的容器,例如,启动刚创建的myubuntu:v1.0容器

image20200327154924933.png

新建并启动容器

创建容器后通过start命令来启动,也可以直接新建并启动,需要的命令主要为 docker [container] run 等价于先执行docker [container] create 命令,再执行docker [container] start 命令。

例如:输出“hello world”,之后容器自动停止

$ docker run ubuntu /bin/echo ‘hello world’
hello world

这跟本地直接执行 /bin/echo ’hello world‘ 相比几乎不出任何区别。

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

1、检查本地是否存在指定镜像,不存在就从公共镜像仓库下载

2、利用镜像创建一个容器,并启动该容器

3、分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层

4、从宿主机配置的网桥接口中桥接以个虚拟接口道容器中去

5、从网桥的地址池胚子一个IP地址给容器

6、执行用户指定的应用程序

7、执行完毕后容器被自动终止

下面的命令启动一个bash终端,允许用户进行交互

$ docker run -it myubuntu:v1.0 /bin/bash
[email protected] /#
[email protected] /# ls
bin boot dev etc home lib lib64 media mnt opt proc root ru卫sbin srv sys tmp usr var
[email protected]:/# pwd
/
[email protected]:/# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   11 pts/0    00:00:00 ps
[email protected] /# exit
exit

-t 让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上

-i 让容器的标准输入保持打开

更多命令可以用过man docker-run命令来查看

image20200327161231041.png

可以使用docker container wait CONTAINER [CONTAINER…]子命令来等待容器的退出,并打印退出返回的结果

某些时候,执行docker [ container] run时候因为命令无法正常执行容器会出错直接退出, 此时可以查看退出的错误代码。
默认情况下,常见错误代码包括:
125 : Docker da emon 执行出错,例如指定了不支持的Docker 命令参数;
126 :所指定命令无法执行,例如权限出错;
127 : 容器内命令无法找到。
命令执行后出错,会默认返回命令的退出错误码。

守护态运行

更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。例如:下面命令会在后台运行容器

$ docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"  //注意双引号中英文

image20200327165814745.png

查看容器输出

要获取容器的输出信息,可以通过docker [container] logs 命令。
该命令支持的选项包括:

-details : 打印详细信息;

-f, - follow :持续保持输出;

-since string :输出从某个时间开始的日志;

-tail string : 输出最近的若干日志;

-t, - timestamps : 显示时间戳信息;

-until string : 输出某个时间之前的日志。

例如,查看某容器的输出可以使用如下命令:

image20200327170203843.png

停止容器

主要是Docker容器的pause/unpause、stop和prune子命令

暂停容器

暂停容器可以使用docker [container] pause CONTAINER [CONTAINER…]命令来暂停一个运行中的容器

例如,启动一个容器,并将其暂停:

$ docker run --name test --rm -it -d ubuntu bash
$ docker pause test 
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
893c8llcf845 ubuntu "bash” 2 seconds ago Up 12 seconds (Paused) test

处于paused 状态的容器,可以使用docker [container ] unpause CONTAINER
[CONTAINER ... ] 命令来恢复到运行状态。

image20200327185103365.png

处于paused 状态的容器,可以使用docker [container ] unpause CONTAINER
[CONTAINER ... ] 命令来恢复到运行状态。

image-20200327185429106

可以使用docker [container] stop 来终止一个运行中的容器。该命令的格式为:

docker [container] stop [-t|--time [=10]] [CONTAINER ... ]

该命令会首先向容器发送SIGTERM 信号,等待一段超时时间后(默认为10 秒),再发送SIGK工LL 信号来终止容器:

$ docker stop test
test

image20200327185715878.png

此时,执行docker container prune 命令,会自动清除掉所有处于停止状态的容器。此外,还可以通过docker [container] kill 直接发送SIGKILL 信号来强行终止容器。

此处图示略;

当Docker容器中指定的应用终结时,容器也会自动终止。例如,启用一个终端的容器,通过exit或者Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。

可以使用docker ps -a 命令查看所有容器的iD

image20200327190222712.png

处于终止状态的容器使用docker [container] start 命令来重新启动:

处于运行状态的容器可以使用docker [container] restart 命令来重新启动:

docker [container] restart 命令会将一个运行态的容器先终止,然后再重新启动

进入容器

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

这时候就需要使用官方推荐的attach或exec (个人喜欢exec)命令

docker exec: 在已运行的容器中,执行命令,操作对象是容器,如果你要进入已运行的容器,并且执行命令,用exec;

docker attach: 同样操作的是已运行的容器,可以将本机标准输入(键盘输入)输到容器中,也可以将容器的输出显示在本机的屏幕上,如果你想查看容器运行过程中产生的标准输入输出,用attach;

attach 命令

attach 是Docker 自带的命令,命令格式为:

docker [container] attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]]CONTAINER

这个命令支持三个主要选项:

--detach-keys [=[]]:指定退出attach 模式的快捷键序列, 默认是CTRL-pCTRL-q;

--no-stdin=true|false :是否关闭标准输入,默认是保持打开;

--sig-proxy=true|false :是否代理收到的系统信号给应用进程,默认为true 。

示例:

image20200327192435491.png
image20200327192503804.png

看到上面的图例,我想应该明白点什么,为什么我比较喜欢docker exec 而不是很喜欢docker attach,主要是多窗口同时使用docker attach到同一个容器时,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

exec命令

Docker 1.3版本起。Docker提供了一个更加方便的工具exec命令。可以在运行中容器内直接执行任何命令

该命令的基本格式为:

docker [container] exec [-d|-detach] [ --detach-keys[=[]]] [-i|--interactive][--pri vileged][-t|--tty] [ -u|--user[=USER]] CONTAINER COMMAND [ARG...]

比较重要的参数有:

-d, --detach : 在容器中后台执行命令;

--detach-keys ="":指定将容器切回后台的按键;

--e, - - env= [):指定环境变量列表;

--i, --interactive=true|false :打开标准输入接受用户输入命令, 默认值为false;

--privileged=true|false : 是否给执行命令以高权限,默认值为false;

-t, --tty=true|false : 分配伪终端,默认值为false;

-u, --user ="":执行命令的用户名或ID 。

示例:

image20200327194529609.png

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

image20200327194732261.png

删除容器

docker [container) rm 命令来删除处于终止或退出状态的容器,命令格式为docker [container) rm [-f |--force] [-l|--link] [-v|-- volumes ] CONTAINER [CONTAINER ... ]

主要支持的选项包括:

-f, --force=false : 是否强行终止并删除一个运行中的容器;

-1, --link=false :删除容器的连接,但保留容器;

-v, --volumes=false :删除容器挂载的数据卷。

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

image20200327195436482.png

导入和导出容器(import And export)

前面在使用docker镜像中提到的存出(save)和载入(load),这两个命令是针对镜像[image]去操作的。

导出容器(export)

导出容器是导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用 :docker [container] export 命令

docker [container) export [-o| - -output [=””] ]CONTAINER

其中,可以通过-o选项来指导的tar文件名,也可以直接通过重定向来实现

image20200327200516379.png

导入容器(import)

导出的文件又可以使用docker [container] import 命令导入变成镜像,该命令格式为:

docker import [-c|--change[=[]]] [-m| -- message[=MESSAGE]] file|URL|[REPOSITORY [:TAG]]

可以通过- c, -change =[]选项在导人的同时执行对容器进行修改的Dockerfile指令

下面将导出的wayne.tar 文件导人到系统中:

image20200327201909125.png
***尝试使用docker load 命令导入容器文件到本地镜像库“失败”!不信邪的可以尝试!

docker import 只能把容器文件导入本地镜像库

docker load是将镜像文件导入本地镜像库

以上二者不能交叉使用

image20200327203529027.png

这两者的区别在于: 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),
而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导人时可以重新指定标签等元数据信息。

查看容器

主要是Docker容器的inspect、top、stats子命令

查看容器详情

查看容器详情可以使用docker container inspect [OPTIONS] CONTAINER [CONTAINER…]子命令

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

$ docket container inspect tom2

image20200329133639921.png

查看容器内进程

可以使用 docker [container] top [OPTION] CONTAINER [CONTAINER…]子命令

这个命令类似于linux中的top命令,会打印出容器内的进程信息,包括PID、用户、时间、命令等。

$ docker top tom2

image20200329134105171.png

linux top命令

image20200329134130263.png

查看统计信息

使用docker [container] stats [OPTIONS] [CONTAINER…]子命令。会显示CPU、内存、储存、网络等使用情况的统计信息

-a,-all:统计所有容器统计信息,默认仅在运行中

--format string:格式化输出信息

--no-stream:不持续输出,默认会自动更新持续实时结果

-no-trunc:不截断输出信息

实例:查看当前运行中容器的系统资源使用统计

image20200329134632254.png

**不停止退出,会一直实时打印

其他容器命令

主要是Docker的 cp 、diff、port和update子命令

1、复制文件

container cp命令支持在容器和主机之间复制文件。命令格式为docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-。支持的选项包括:

-a ,-archive :打包模式,复制文件会带有原始的uid/gid信息;

-L,-follow-link:跟随软连接,当原路径为软连接时,默认只复制链接信息,使用该选项会复制列链接的目标内容。

实例:将本地的路径data复制到Tom2容器的/tmp路径下:

docker [container] cp wayne_x1.03.tar tom2:/user/local/

image20200329135649531.png

2、查看变更

container diff查看容器内文件系统的变更。命令格式为docker [container] diff CONTAINER

实例:查看tom2容器内数据修改:

$ docker container diff tom2

image20200329141305461.png

3、查看端口映射

container port 命令可以查看容器的端口映射情况。docker container port CONTAINER [PRIVATE_PORT[/PROTO]] 。

实例:查看test容器的端口映射情况:

image20200329141629352.png

4、更新配置

更新配置使用的是docker container update命令,可以更新容器的一些运行时配置,主要是一些资源限制份额。命令格式为 docker [container] update [OPTIONS] CONTAINER [CONTAINER…]

支持选项:

-blkio-weight uint16:更新块IO限制,10~1000,默认值为0,代表着无限制;

-cpu-period int :限制CPU调度CFS(Completely Fair Scheduler:完全公平调度器)使用时间,单位为微秒,最小1000

-cpu-quota int:限制CPU调度器CFS (Completely Fair Schdeular: 完全公平调度器)配额,单位为微秒,最小1000

-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:允许使用的内存块,如0-3,0,1

-kernel-memory bytes:限制使用的内存

-memory-reservation bytes:内存软限制

-memory-swap bytes:内存加上缓存区限制,-1表示为对缓存区无限制

-restart string :容器退出后的重启策略

实例:

限制总配额为1秒,容器tom2所占用时间10%

$ docker update --cpu-period 1000000 tom2

$ docker update --cpu-quota 1000000 tom2

image20200329145446904.png

小结

container 是直接提供应用服务的组件,也是docker整个技术栈最为核心的概念。围绕container,Docker 提供了很多操作命令,可使用Docker container help命令来查看Docker支持的container操作子命令

在生产环境中,为了提高容器的高可用和安全性,一方面要合理使用资源限制参数来管理容器的资源消耗;另一方面要指定合适的容器重启策略,来自动重启退出的容器,另外还可以使用HAproxy等辅助工作来处理负载均衡,自动切换故障的应用容器