容器是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
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 # 大小,显示文件的总大小
这三个命令使用的参数是一模一样的!
上面图中输出信息详情介绍:
- CONTAINER ID: 容器 ID。
- IMAGE: 使用的镜像。
- COMMAND: 启动容器时运行的命令。
- CREATED: 容器的创建时间。
- STATUS: 容器状态。
- PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
- NAMES: 自动分配的容器名称。
在状态字段status有7种状态:
- created(已创建)
- restarting(重启中)
- running(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
3. 修改容器名称
容器的名称自动生成的都比较难记,我们可以改成自己的名称
docker rename oldname newname
4. 启动容器
4.1 启动容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker container start [OPTIONS] CONTAINER [CONTAINER...]
在启动的时候选择容器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 # 绑定一个卷
我们来创建并启动一个容器:
启动使用了myubuntu:zabbx镜像。
其中,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。
这个需要在开启一个终端查看运行状态。
退出容器可以使用ctrl+D 或者exit。
4.3 守护容器
按照上面创建并且启动镜像,后会直接进入容器,一旦推出,容器也会终结。
因此,我们在启动的时候加上 -d 选项。Docker容器会在后台以守护态(Daemonized)形式运行。
5. 停止容器
5.1 暂停容器
在暂停容器,相当于挂起
docker pause [OPTIONS] CONTAINER [CONTAINER...]
恢复暂停状态到运行状态
docker unpause [OPTIONS] CONTAINER [CONTAINER...]
5.2 重启容器
重启容器使用docker restart命令
docker restart [OPTIONS] CONTAINER [CONTAINER...]
-t, --time int #多少秒后重启容器(默认10)
5.3 终止容器
终止容器使用 docker stop 命令
docker stop [OPTIONS] CONTAINER [CONTAINER...]
-t, --time int #多少秒后终止容器(默认10)
使容器终止还可以使用 docker kill命令
docker kill [OPTIONS] CONTAINER [CONTAINER...]
-s, --signal string # 向容器发送一个信号(默认kill)
还可以使用docker container prune 删除所有停止容器 (慎用!)
评论区