容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。

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

1.创建容器

1.1 docker create 命令

新建容器需要使用 docker create 命令,因为由于容器是整个Docker技术栈的核心,create命令和后续的run命令支持的选项都十分复杂。

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

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

   与容器环境和配置相关的选项
        --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=[<name or id>:alias]          # 链接到其他容器
        --1ink-local-ip=[]:            # 容器的本地链接地址列表
        --mac-address=""               # 指定容器的Mac地址
        --name=""                      # 指定容器的别名

   与容器资源限制和安全保护相关的选项
        --blkio-weight=10-1000         # 容器读写块设备的I/O性能权重,默认为0
        --blkio-weight-device=[DEVICE NAME:WEIGHT]          # 指定各个块设备的I/O性能权重
        --cpu-shares=0                 # 允许容器使用CPU资源的相对权重,默认一个容器能用满一个核的CPU
        --cap-add=[]                   # 增加容器的Linux指定安全能力
        --cap-drop=[]                  # 移除容器的Linux指定安全能力
        --cgroup-parent=""             # 容器cgroups限制的创建路径
        --cidfile=""                   # 指定容器的进程ID号写到文件
        --cpu-period=0                 # 限制容器在CFS调度器下的CPU占用时间片
        --cpuset-cpus=""               # 限制容器能使用哪些CPU核心
        --cpuset-mems=""               # NUMA架构下使用哪些核心的内存
        --cpu-quota=0                  # 限制容器在CFS调度器下的CPU配额
        --device-read-bps=[]           # 挂载设备的读吞吐率(以bps为单位)限制
        --device-write-bps=[]          # 挂载设备的写吞吐率(以bps为单位)限制
        --device-read-iops=[]          # 挂载设备的读速率(以每秒io次数为单位)限制
        --device-write-iops=[]         # 挂载设备的写速率(以每秒ivo次数为单位)限制
        --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-ki11-disable=true|false       # 内存耗尽时是否杀死容器
        --oom-score-adj=""             # 调整容器的内存耗尽参数
        --pids-1imit=""                # 限制容器的pid个数
        --privileged=true|false        # 是否给容器高权限,这意味着容器内应用将不受权限的限制,一般不推荐
        --read-only=true|false         # 是否让容器内的文件系统只读
        --security-opt=[]              # 指定一些安全参数,包括权限、安全能力、apparmor等
        --stop-signal=SIGTERM          # 指定停止容器的系统信号
        --shm-size=""                  # /dev/shm的大小
        --sig-proxy-true|fa1se         # 是否代理收到的信号给应用,默认为true,不能代理SIGCHLD、SIGSToP 和 SIGKILL信号
        --memory-swappiness="0~100"    # 调整容器的内存交换区参数
    -u,--user=""                      # 指定在容器内执行命令的用户信息
        --userns=""                    # 指定用户命名空间
        --ulimit=[]                    # 通过ulimit来限制最大文件数、最大进程数等
    -1,--1abe1=[]:                   # 以键值对方式指定容器的标签信息;
        --labe1-file=[]:               # 从文件中读取标签信息。

创建一个容器,这样创建的容器是没有启动的。

docker create -it zabbx/centos:v1

image.png

2. 查看容器

查看容器会常用到以下命令:

docker ps                # 查看运行的容器

docker ps -a             # 查看所有容器包含没有运行的

docker ps -n 5           # 查看最近创建的5个容器

docker container ls      # 查看所有运行容器   

docker container ls -a   # 查看所有容器包含没有运行的    

查看容器命令有三个,

docker ps 
docker container ls
docker container list

       -a --all               # 全部显示所有容器(默认显示刚刚运行)
       -f --filter filter     # 根据提供的条件过滤过滤器输出
          --format string     # 使用Go模板格式化字符串打印容器
       -n --last int          # 显示n个最后创建的容器(包括所有状态)(默认值-1)
       -l --latest            # 最新显示最新创建的容器(包括所有状态)
          --no-trunc          # 不截断输出
       -q --quiet             # 静默模式,只显示容器编号
       -s --size              # 大小,显示文件的总大小

这三个命令使用的参数是一模一样的!

image.png

上面图中输出信息详情介绍:

  • CONTAINER ID: 容器 ID。
  • IMAGE: 使用的镜像。
  • COMMAND: 启动容器时运行的命令。
  • CREATED: 容器的创建时间。
  • STATUS: 容器状态。
  • PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
  • NAMES: 自动分配的容器名称。

在状态字段status有7种状态:

  1. created(已创建)
  2. restarting(重启中)
  3. running(运行中)
  4. removing(迁移中)
  5. paused(暂停)
  6. exited(停止)
  7. dead(死亡)

3. 修改容器名称

容器的名称自动生成的都比较难记,我们可以改成自己的名称

docker rename oldname newname

image.png

4. 启动容器

4.1 启动容器

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

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

image.png

在启动的时候选择容器ID和容器NAMES都可以。

4.2 创建并启动容器

创建并启动使用命令docker run 等于直接创建并且启动。

docker run = docker create + docker start

使用docker run 有以下后台操作:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
  • 利用镜像创建一个容器,并启动该容器;
  • 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
  • 从网桥的地址池配置一个IP地址给容器;
  • 执行用户指定的应用程序;
  • 执行完毕后容器被自动终止。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

       -a stdin      # 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
       -d            # 后台运行容器,并返回容器ID;
       -i            # 以交互模式运行容器,通常与 -t 同时使用;
       -P            # 随机端口映射,容器内部端口随机映射到主机的高端口
       -p            # 指定端口映射,格式为:主机(宿主)端口:容器端口
       -t            # 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
       --name="nginx-lb"           # 为容器指定一个名称;
       --dns 8.8.8.8               # 指定容器使用的DNS服务器,默认和宿主一致;
       --dns-search example.com    # 指定容器DNS搜索域名,默认和宿主一致;
       -h "mars"                   # 指定容器的hostname;
       -e username="ritchie"       # 设置环境变量;
       --env-file=[]               # 从指定文件读入环境变量;
       --cpuset="0-2" or --cpuset="0,1,2"        # 绑定容器到指定CPU运行;
       -m                          # 设置容器使用内存最大值;
       --net="bridge"              # 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
       --link=[]                   # 添加链接到另一个容器;
       --expose=[]                 # 开放一个端口或一组端口;
       --volume , -v               # 绑定一个卷

我们来创建并启动一个容器:

image.png

启动使用了myubuntu:zabbx镜像。
其中,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。

这个需要在开启一个终端查看运行状态。

image.png

退出容器可以使用ctrl+D 或者exit。

4.3 守护容器

按照上面创建并且启动镜像,后会直接进入容器,一旦推出,容器也会终结。

image.png

因此,我们在启动的时候加上 -d 选项。Docker容器会在后台以守护态(Daemonized)形式运行。

image.png

5. 停止容器

5.1 暂停容器

在暂停容器,相当于挂起

docker pause [OPTIONS] CONTAINER [CONTAINER...]

恢复暂停状态到运行状态

docker unpause [OPTIONS] CONTAINER [CONTAINER...]

image.png

5.2 重启容器

重启容器使用docker restart命令

docker restart [OPTIONS] CONTAINER [CONTAINER...]

       -t, --time int      #多少秒后重启容器(默认10)

image.png

5.3 终止容器

终止容器使用 docker stop 命令

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

       -t, --time int      #多少秒后终止容器(默认10)

image.png

使容器终止还可以使用 docker kill命令

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

       -s, --signal string      # 向容器发送一个信号(默认kill)

还可以使用docker container prune 删除所有停止容器 (慎用!)

image.png

70304092_p0_master1200.jpg

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

只有把抱怨环境的情绪,化为上进的力量,才是成功的保证!