运维docker06-docker容器

1、docker容器

1、docker容器简介

  • 容器是镜像的运行时实例。
  • 可以从单个镜像,上启动一个或多个容器。容器会共享其所在主机的操作系统内核。
  • 容器随着其中运行应用的退出而终止
  • Linux中大部分的容器都只运行一个进程
  • 使用单个 Docker 镜像启动多个容器

2、docker镜像启动为容器的原理

  • 镜像的每一个镜像层都是只读的,容器在启动的时候创建一层可写层作为最上层。修改镜像层中的内容,是将要修改的内容写在可写层,读取时可写层会覆盖镜像层中的内容;删除镜像层中的内容,只是在可写层将镜像层中的内容标记为不可见。
  • 将容器的数据放在共享存储中,方便容器的迁移和重建。
  • docker容器是分层构建联合挂载的。

3、容器的生命周期

  • 容器可以做到持久化数据。
    • 停止容器运行并不会损毁容器或者其中的数据。
    • 卷(volume )才是在容器中存储持久化数据的首选方式。
  • 删除容器最好分两步,先停止(stop)容器然后删除(rm)。这样可以给容器中运行的应用/进程一个停止运行并清理残留数据的机会。
    • docker container stop命令向容器内的PID 1进程发送SIGTERM信号,给进程预留一个清理并优雅停止的机会。如果10s内进程没有终止,那么就会收到SIGKILL信号,这是致命一击。
    • docker container rm <container> -f命令不会先友好地发送SIGTERM,这条命令会直接发出SIGKILL。
  • 多次停止、启动、暂停以及重启容器,并且这些操作执行得很快。但是容器及其数据是安全的。直至明确删除容器前,容器都不会丢弃其中的数据。就算容器被删除了,如果将容器数据存储在卷中,数据也会被保存下来。

2、docker容器管理

Usage: 
docker container COMMAND


Commands:
  ls          列出容器
  inspect     显示一个或多个容器的详细信息
  top         显示容器正在运行的进程,资源消耗排序
  stats       显示容器资源使用统计信息的实时流
  port        列出容器的端口映射或特定映射
  logs        获取一个容器的日志

  create      创建一个新容器
  run         创建一个新容器,并指定要在容器中运行的命令

  stop        停止一个或多个正在运行的容器,停止前默认等待10s
  kill        杀死一个或多个正在运行的容器(强制停止容器)传递给容器的信号默认是“kill”
  start       启动一个或多个停止的容器
  pause       暂停一个或多个容器中的所有进程
  unpause     取消一个或多个容器内的所有进程的暂停(配合pause使用)
  restart     重新启动一个或多个容器。先杀死容器(杀死容器前默认等待10s),在启动容器

  prune       移走所有停止的容器
  rm          移除一个或多个容器

  exec        在正在运行的容器中运行命令

  attach      将本地标准输入、输出和错误流附加到正在运行的容器
  commit      根据容器的更改创建一个新镜像
  cp          在容器和本地文件系统之间复制文件或目录
  diff        检查容器文件系统上文件或目录的更改
  export      将容器的文件系统导出为tar归档文件
  rename      重命名一个容器
  update      更新一个或多个容器的配置
  wait        阻塞,直到一个或多个容器停止,然后打印它们的退出代码

1、查看容器相关信息

  • 基本语法格式如下
docker container ls [OPTIONS]                                  #列出容器
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]    #显示一个或多个容器的详细信息
docker container top CONTAINER [ps OPTIONS]                    #显示容器正在运行的进程,资源消耗排序
docker container stats [OPTIONS] [CONTAINER...]                #显示容器资源使用统计信息的实时流
docker container port CONTAINER [PRIVATE_PORT[/PROTO]]         #列出容器的端口映射或特定映射
docker container logs [OPTIONS] CONTAINER                      #获取一个容器的日志

示例:

]# docker container ls       #列出存活的容器
]# docker container ls -a    #列出所有容器

2、创建容器

  • 基本语法格式如下
docker container create [OPTIONS] IMAGE [COMMAND] [ARG...]     #创建一个新容器
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]        #创建一个新容器,并指定要在容器中运行的命令
    -t, --tty            分配一个pseudo-TTY(伪终端)。例如,打开一个shell终端
    -i, --interactive    即使没有连接,也保持STDIN打开。即可以交互式访问
    -d, --detach         在后台运行容器并打印容器ID
    --name string        为容器指定一个名称
    --network network    将容器连接到一个网络(bridge|host|none),默认加入bridge网络
    --rm                 当容器退出时自动删除容器
  • 使用docker container create命令新建的容器处于停止状态,可以使用docker container start命令来启动它。
  • 使用docker container run命令新建的容器处于运行状态,等价于先执行docker container create命令,再执行docker container start命令。
  • 当利用docker container run来创建并启动容器时, Docker在后台运行的标准操作包括:
    • 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
    • 利用镜像创建一个容器,并启动该容器。
    • 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层。
    • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
    • 从网桥的地址池配置一个IP 地址给容器。
    • 执行用户指定的应用程序。
    • 执行完毕后容器被自动终止。

示例1:

docker container run --name b1 -it busybox:latest    #交互式启动,容器名为b1
docker container run --name web1 -d nginx            #守护进程模式启动,容器名为web1

示例2:

]# docker container run --name b1 -it busybox:latest
/ # ls bin					     #bin下有许多命令,其实都是busybox的别名
/ # mkdir -p /data/html			             #创建目录
/ # vi /data/html/index.html	                     #创建默认网页
/ # httpd –h					     #httpd的帮助
/ # httpd -f -h /data/html		             #启动httpd,-f运行在前台,-h默认家目录
ctrl+c						     #退出httpd
/ # exit                                             #退出容器

另起一个终端:
]# docker container ls –a
]# docker inspect b1
]# curl 172.17.0.2

3、停止和启动容器

  • 基本语法格式如下
docker container stop [OPTIONS] CONTAINER [CONTAINER...]       #停止一个或多个正在运行的容器,停止前默认等待10s
docker container kill [OPTIONS] CONTAINER [CONTAINER...]       #杀死一个或多个正在运行的容器(强制停止容器),传递给容器的信号默认是“kill”
docker container start [OPTIONS] CONTAINER [CONTAINER...       #启动一个或多个停止的容器

docker container pause CONTAINER [CONTAINER...]                #暂停一个或多个容器中的所有进程
docker container unpause CONTAINER [CONTAINER...]              #取消一个或多个容器内的所有进程的暂停(配合pause使用)

docker container restart [OPTIONS] CONTAINER [CONTAINER...]    #重新启动一个或多个容器。先杀死容器(杀死容器前默认等待10s),在启动容器

示例:

]# docker container run --name web1 -d nginx

]# docker container stop web1
]# docker container kill web2
]# docker container start web1
]# docker container start web2

]# docker container pause web3
]# docker container unpause web3

]# docker container restart web4

4、删除容器

  • 基本语法格式如下
docker container rm [OPTIONS] CONTAINER [CONTAINER...]         #移除一个或多个容器
  -f, --force     强制删除正在运行的容器(使用SIGKILL)
  -l, --link      删除指定的链接
  -v, --volumes   删除与容器关联的匿名卷
docker container prune [OPTIONS]                               #移走所有停止的容器
  -f, --force     不提示确认

示例:

]# docker container rm -f web1                          #强制删除正在运行的容器

]# docker container kill web2
]# docker container stop web3
]# docker container pause web4
]# docker container prune -f                            #删除了已停止的容器web2和web3,暂停的容器web4没有被删除

]# docker container rm -f $(docker container ls -aq)    #删除所有的容器

5、进入容器

  • 基本语法格式如下
docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]     #在正在运行的容器中运行命令
  -d, --detach               分离模式:在后台执行命令
      --detach-keys string   重写分离容器的键序列
  -e, --env list             设置环境变量
      --env-file list        读入包含环境变量的文件
  -i, --interactive          即使没有连接,也保持STDIN打开
      --privileged           将扩展权限授予该命令
  -t, --tty                  分配一个pseudo-TTY
  -u, --user string          用户名或UID (format: <name|uid>[:<group|gid>])
  -w, --workdir string       容器内的工作目录

示例:

]# docker container exec -ti web4 /bin/sh
]# docker container exec -ti web4 /bin/bash

6、导出和导入容器

  • 基本语法格式如下
docker container export [OPTIONS] CONTAINER
    -o, --output string     指定导出的tar文件名,也可以直接通过重定向来实现
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
    -c, --change list       在导入的同时执行对容器进行修改的Dockerfile指令
  • 导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。
  • 使用docker import命令导入,将变成镜像。
  • 使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker import命令来导入一个容器快照到本地镜像库。
  • 这两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导人时可以重新指定标签等元数据信息。

示例:

]# docker container run -d --name web1 nginx:latest         #启动一个nginx容器
]# docker container export -o nginx.container.tar web1      #导出容器
]# docker import nginx.container.tar centoshh/nginx:v1.0    #导入导出的容器文件

]# docker image ls
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
centoshh/nginx       v1.0      37194910416e   2 minutes ago   132MB
nginx                latest    ad4c705f24d3   5 days ago      133MB

7、复制文件

  • 在容器和本地文件系统之间复制文件/文件夹
  • 基本语法格式如下
docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
    -a, --archive       打包模式,复制文件会带有原始的uid/gid 信息;
    -L, --follow-link   跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容。

示例:

]# docker container run --name web1 -d nginx:latest

]# docker container cp /etc/passwd web1:/tmp/     #将本地文件复制到容器中

]# docker container exec -ti web1 sh
# echo 'container nginx' > /tmp/ng.txt
# cat /tmp/ng.txt
container ngin
# ls -l /tmp
-rw-r--r--. 1 root root   16 Sep 15 03:22 ng.txt
-rw-r--r--. 1 root root 2271 Nov  9  2020 passwd

]# docker container cp web1:/tmp/ng.txt /root/    #将容器中的文件复制到本地

8、查看变更

  • 查看容器内文件系统的变更。
  • 基本语法格式如下
docker container diff CONTAINER

示例:

]# docker container diff web4
C /etc
C /root
C /run
A /run/nginx.pid
C /tmp
A /tmp/ng.txt
A /tmp/passwd
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp

9、更新配置

  • 可以更新容器的一些运行时配置,主要是一些资源限制份额。
  • 基本语法格式如下
docker container update [OPTIONS] CONTAINER [CONTAINER...]
    -m, --memory bytes           限制使用的内存
    -c, --cpu-shares int         限制CPU 使用份额(相对权重)
    --blkio-weight uint16        更新块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调度器的实时运行时,单位为微秒
    --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表示为对缓冲区无限制
    --pids-limit int             调整容器pid限制(设置-1为无限)
    --restart string             容器退出后的重启策略

示例:

]# docker container update --cpu-quota 1000000 web1
]# docker container update --cpu-period 100000 web1

3、容器的重启策略

  • 通常建议在运行容器时配置好重启策略。这是容器的一种自我修复能力,可以在指定事件或者错误后重启来完成自我修复。
  • 容器支持的重启策略包括always, unless-stopped和on-failed
    • always策略会一直尝试重启处于停止状态的容器。除非容器被明确停止,比如通过docker container stop命令。但当docker daemon重启的时候,停止的容器也会被重启。
    • unless-stopped和always的最大区别,就是处于stopped (Exited)状态的容器,不会在Docker daemon重启的时候被重启。
    • on-failure策略会在退出容器并且返回值不是0的时候,重启容器。就算容器处于stopped状态,在Docker daemon重启的时候,容器也会被重启。

示例:

]# docker container run --name web1 -d --restart always nginx
]# docker container run --name web2 -d --restart unless-stopped nginx
]# docker container run --name web3 -d --restart on-failure nginx

]# docker container stop web1
]# docker container stop web2
]# docker container stop web3

]# systemctl restart docker.service

[root@localhost ~]# docker container ls -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                     PORTS     NAMES
b380a277ca80   nginx     "/docker-entrypoint.…"   4 minutes ago   Exited (0) 3 minutes ago             web3
2b545b85f1e1   nginx     "/docker-entrypoint.…"   4 minutes ago   Exited (0) 3 minutes ago             web2
fcc4c0d56243   nginx     "/docker-entrypoint.…"   4 minutes ago   Up About a minute          80/tcp    web1

4、run和create的选项

  • create命令和run命令支持的选项几乎一样。选项主要包括如下几大类:
    • 与容器运行模式相关
    • 与容器环境配置相关
    • 与容器资源限制
    • 安全保护相关

1、与容器运行模式相关

2、与容器环境配置相关

3、与容器资源限制和安全保护相关

#已使用内存:
/sys/fs/cgroup/memory/docker/应用ID/memory.usage_in_bytes
#分配的总内存:
/sys/fs/cgroup/memory/docker/应用ID/memory.limit_in_bytes

#已使用的cpu:单位纳秒
/sys/fs/cgroup/cpuacct/docker/应用ID/cpuacct.usage
posted @ 2021-09-08 14:40  麦恒  阅读(48)  评论(0编辑  收藏  举报