Docker技术入门与实战(五)

操作 Docker 容器

如果认为虚拟机是模拟运行的一整套操作系统(包括内核、 应用运行态环境和其他系统 环境)和跑在上面的应用。 那么 Docker 容器就是独立运行的一个(或一组)应用,以及它们 必需的运行环境。

  • 创建容器

  1. 新建容器
    可以使用 docker create 命令新建一个容器,例如:
docker create -it ubuntu:18.04

使用 docker [container] create 命令新建的容器处于停止状态,可以使用 docker [container] start 命令来启动它。
选项主要包括如下几大类 : 与容器运行模式相关、与容器环境配置相关、与容器资源限 制和安全保护相关,参见表 4-1~表 4-3。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2. 启动容器
使用 docker [container] start 命令来启动一个已经创建的容器。 例如,启动刚 创建的 ubuntu 容器:

$ docker start af 
  1. 新建并启动容器
    除了创建容器后通过 start 命令来启动 也可以直接新建并启动容器。所需要的命令主要为 docker [container]run,等价于先执行 docker [container] create 命令,再执行 docker [container] start 命令。
    例如,下面的命令输出一个“Hello World“,之后容器自动终止:
$ docker run ubuntu:18.04 / bin/echo ’ Hello world' 

-t 选项让 Docker 分配一个伪终端( pseudo-即)并绑定到容器的标准输入上, - i 则让容器的标准输入保持打开。 更多的命令选项可以通过 man docker -run 命令来查看。
当利用 docker [container] run 来创建并启动容器时, Docker 在后台运行的标准 操作包括:
1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
2. 利用镜像创建一个容器,并启动该容器;
3. 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
5. 从网桥的地址池配置一个 IP 地址给容器;
6. 执行用户指定的应用程序;
7. 执行完毕后容器被自动终止。
对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的 必要了。 可以使用 docker container wait CONTAINER [CONTAINER . … ]子命令来等待 容器退出,并打印退出返回结果。
某些时候,执行 docker [container] run时候因为命令无法正常执行容器会出错 直接退出, 此时可以查看退出的错误代码。 默认情况下,常见错误代码包括:
125 : Docker daemon 执行出错,例如指定了不支持的 Docker 命令参数;
126:所指定命令无法执行,例如权限出错;
127: 容器内命令无法找到。 命令执行后出错,会默认返回命令的退出错误码。

  1. 守护态运行
    更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。 此时,可以 通过添加-d 参数来实现。
  2. 查看容器输出
    要获取容器的输出信息,可以通过 docker [container] logs 命令。 该命令支持的选项包括:
    -details : 打印详细信息;
    - f, -follow:持续保持输出;
    –since string:输出从某个时间开始的日志;
    -tail string : 输出最近的若干日志;
    -t, -timestamps : 显示时间戳信息;
    -until string : 输出某个时间之前的日 志。 例如,查看某容器的输出可以使用如下命令 :
$ docker logs ce554267d7a4 
  • 停止容器

  1. 暂停容器
    可以使用 docker [container] pause CONTAINER [CONTAINER … ]命令来暂 停一个运行中的容器。
    处于 paused 状态的容器,可以使用 docker [contai口er] u口pause CONTAINER
    [CONTAINER … ] 命令来恢复到运行状态。
  2. 终止容器
    可以使用 docker [container] stop 来终止一个运行中的容器。 该命令的格式为 docker [container] stop [-t I - -time [=10]] [CONTA工NER … ] 。 该命令会首先向容器发送 SIGTERM 信号,等待一段超时时间后(默认为 10 秒),再发 送 SIGK工LL 信号来终止容器
    此时,执行 docker container prune 命令,会自动清除掉所有处于停止状态的容器。 此外,还可以通过 docker [container] kill 直接发送 SIGKILL 信号来强行终止 容器。
  • 进入容器

  • attach 命令
    attach 是 Docker 自带的命令,命令格式为:
    docker [container] attach [–detach-keys[=[]]] [–no-stdin] [–sig-proxy[=true]] CONTAINER
    这个命令支持三个主要选项:
    --detach-keys [=[]]:指定退出 attach 模式的快捷键序列, 默认是 CTRL-p CTRL-q;
    --no-stdin=true|false :是否关闭标准输入,默认是保持打开;
    -- sig-proxy=truelfalse :是否代理收到的系统信号给应用进程,默认为 true。
[root@localhost Documents]# docker run -itd ubuntu:18.04
94ba039bbe9859d7b92d499c2dbdcd79857128164d12acfb99d24e83964899cb
[root@localhost Documents]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
94ba039bbe98        ubuntu:18.04        "/bin/bash"         6 seconds ago       Up 4 seconds                            beautiful_turing
[root@localhost Documents]# docker attach beautiful_turing

然而使用 attach 命令有时候并不方便。 当多个窗口同时 attach 到同一个容器的时 候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

  • exec 命令
    Docker 提供了一个更加方便的工具 exec 命令,可以在运行 中容器内直接执行任意命令。 该命令的基本格式为:
    docker [container] exec [-di -detach] [ detach-keys[=[]]] [-il–interactive] [ - -piivileged][-t|–tty] [-u I --user [=USER]] CONTAINER COMMAND [ARG . . . ]
    比较重要的参数有:
    -d, --detach: 在容器中后台执行命令;
    --detach-keys="":指定将容器切回后台的按键; - e, - - env= []:指定环境变量列表;
    -i, --interactive=true I false :打开标准输入接受用户输入命令, 默认值为false;
    --privileged=true|false : 是否给执行命令以高权限,默认值为 false;
    -t, --tty=true|false : 分配伪终端,默认值为 false;
    -u, --user="":执行命令的用户名或 ID。
    例如,进入到刚创建的容器中,并启动一个 bash:
$ docker exec -it 243c32535da7 / bin/ bash 
root@243c32535da7 :/# 

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

  • 删除容器

可以使用 docker [container] rm 命令来删除处于终止或退出状态的容器,命令格式为
docker [container] rm [-f |--force] [-l |--link] [-v |--volumes] CONTAINER
[CONTAINER … ) 。
主要支持的选项包括:
- f, --force=false : 是否强行终止并删除一个运行中的容器;
- l, --link=false :删除容器的连接,但保留容器;
-v, --volumes=false :删除容器挂载的数据卷。
默认情况下, docker rm 命令只能删除已经处于终止或退出状态的容器,并不能删除 还处于运行状态的容器。 如果要直接删除一个运行中的容器,可以添加 - f 参数。 Docker 会先发送 SIGKILL 信 号给容器,终止其中的应用,之后强行删除:

  • 导入和导出容器

某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用 Docker 的导入和导出功能,这也是 Docker 自身提供的一个重要特性。
1 . 导出容器 导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行 状态。 可以使用 docker [container] export 命令,该命令格式为:
docker [container] export [-ol - -output [=””]] CONTAINER
其中,可以通过-0 选项来指定导出的 tar 文件名,也可以直接通过重定向来实现。

$ docker export -o test_for _run.tar ce5 
$ ls test for run.tar 
  1. 导入容器 导出的文件又可以使用 docker [container] import 命令导人变成镜像,该命令 格式为 :
    docker import [-cl–change[=[]]] [-ml --message[=MESSAGE]] filelURLI[REPOSITORY [:TAG]]
    用户可以通过 -c, -change=[]选项在导人的同时执行对容器进行修改的 Dockerfile 指令
    下面将导出的 test for run .tar 文件导人到系统中:
$ docker import test_for_run.tar  - test/ubuntu:v1.0
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171 3 MB 

实际上,既可以使用 docker load 命令来导入镜像存储文件到本地镜像库,也可以使 用 docker [container] import 命令来导入一个容器快照到本地镜像库。 这两者的区 别在于: 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态), 而镜像存储文件将保存完整记录,体积更大。 此外,从容器快照文件导人时可以重新指定标 签等元数据信息。

  • 查看容器。

1 . 查看容器详情 查看容器详情可以使用 docker container inspect [OPTIONS] CONTAINER [CONTAINER . … ]子命令。
例如,查看某容器的具体信息,会以 json 格式返回包括容器 Id、 创建时间、路径、状 态、镜像、配置等在内的各项信息:

$ docker container inspect test 
[ 
	{
	”Id”:”2d4be6a584ec23e2aDb3eabb8909fd5196DcllD3ldfD9513c6ba863c919bf2eB”, 	”Created H :”2018-02-21TD5:04:17 089267701Z”, 
	"Path":”/portainer ”, 
	"Args”:[], 
	” State" : { 
			"Status”:"running”, 
			...
			}
	}
]
	
  1. 查看容器内进程 查看容器内进程可以使用 docker [container] top [OPTIONS] CONTAINER
    [CONTAINER . … ] 子命令。 这个子命令类似于 Linux 系统中的 top 命令,会打印出容器内的进程信息,包括 PID、 用户、时间、命令等。 例如,查看某容器内的进程信息,命令如下:
$ docker top test 
P工D USER  TIME COMMAND 
5730 0  0:00 /portatner
  1. 查看统计信息
    查看统计信息可以使用 docker [container] stats [OPTIONS] [CONTAINER … ] 子命令,会显示 CPU、内存、存储、网络等使用情况的统计信息。 支持选项包括:
    -a, -all :输出所有容器统计信息,默认仅在运行中;
    - format string:格式化输出信息;
    -no-stream:不持续输出,默认会自动更新持续实时结果; -no-trunc:不截断输出信息。
    例如,查看当前运行中容器的系统资源使用统计:
docker stats test
CONTAINER ID NAME CPU %MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 
2d4be6a584ec test 0.00% 3.164MiB /1 .952GiB 0.16% 2.37kB / 0B 0B / 65.SkB 4 
  • 其他容器命令

  1. 复制文件 container cp 命令支持在容器和主机之间复制文件。 命令格式为 docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH 卜。 支持的选项包括:
    -a, -archive:打包模式,复制文件会带有原始的 uid/gid 信息;
    -L, -follow-link :跟随软连接。当原路径为软连接时\默认只复制链接信息, 使用该选项会复制链接的目标内容。
    例如,将本地的路径 data 复制到 test 容器的/tmp 路径下 :
docker [container] cp data test :/ tmp/ 
  1. 查看变更 container diff 查看容器内文件系统的变更。 命令格式为 docker container diff CONTAINER.
 docker container diff test
  1. 查看端口映射 container port 命令可以查看容器的端口映射’情况。 命令格式为 docker container port CONTAINER [PRIVATE_PORT[/PROTO]] 。例如,查看 test 容器的端口映射’情况:
$ docker container port test 
9000/tcp- > o.o o 0:9000 
  1. 更新配置 container update 命令可以更新容器的一些运行时配置,主要是一些资源限制份额。 命令格式为 docker [container] update [OPTIONS] CONTAINER [CONTAINER … . ] 。 支持的选项包括:
    -blkio-weight uin16 :更新块 IO 限制, 10~1000,默认值为 0,代表着无限制;
    - cpu-period int :限制 CPU 调度器 CFS (Completely Fair Scheduler)使用时间, 单位为微秒,最小 1000;
    -cpu-quota int :限制 CPU 调度器 CFS 配额,单位为微秒,最小 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 :限制使用的内核内存;
    -m, -memory bytes : 限制使用的内存;
    -memory-reservation bytes :内存软限制;
    -memory-swap bytes :内存加上缓存区的限制, -1 表示为对缓冲区无限制;
    -restart string: 容器退出后的重启策略。
    例如,限制总配额为 1 秒,容器 test 所占用时间为 10%,代码如下所示:
$ docker update --cpu-quota 1000000 test test 
$ docker update --cpu-period 100000 test test 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值