docker——容器(container)
容器相关命令一览表:
- docker create
- docker run
- docker start/stop/restart
- docker attach/exec
- docker rm
- docker export/import
- docker ps
1.创建容器
(1)docker create
Usage: docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
使用docker create创建的容器处于停止状态,可以使用docker start来启动它。
没有指定执行程序的时候,默认是打开BASH终端。
如果这里没有给它分配一个伪终端,那么启动这个程序也会瞬间就被关闭。
(2)docker start
查看状态:
确定已经运行
(3)docker run(=docker create + docker start) 新建并启动容器
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-t:分配一个为终端并绑定到容器的标准输入上,
-i:让容器的标准输入保持打开
从另一个控制台查看容器状态:
可以看出正在运行。
当利用docker run来创建并启动容器的时候,Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
- 利用镜像创建一个容器,并启动该容器;
- 分配一个文件系统给容器,并在只读的镜像层外边挂载一层可读写曾;
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
- 从网桥的地址池配置一个IP地址给容器;
- 执行用户执行的应用程序;
- 执行完毕之后容器自动终止;
使用Ctrl+d或输入exit命令来退出容器。这里的退出时容器已经被关闭。
在许多时候,需要docker容器在后台以守护态运行,需要指定-d参数。
使用ctrl+p+q退出容器但不关闭。
某些时候,执行docker run会出错,因为命令无法正常执行容器会直接退出,此时可以查看退出的错误代码。
常见的错误代码包括:
- 125:Docker daemon执行错误;
- 126:所指定命令无法执行,例如权限出错;
- 127:容器内命令无法找到;
2.终止容器
docker stop:终止一个正在运行的容器
docker stop [--help] [-t|--time[=10]] CONTAINER [CONTAINER...]
参数解释:
-t, --time=10:在杀死容器之前等待容器停止的秒数。 默认值为10秒。
docker restart:重启一个正在运行的容器
3.进入容器
使用-d参数,容器会以守护态运行,用户无法看到容器中的信息,业务发进行操作。
下面介绍两种基础方法进入容器:
(1)attach
docker attach [--detach-keys[=[]]] [--help] [--no-stdin] [--sig-proxy[=true]] CONTAINER
参数解释:
--detach-keys="":指定退出attach模式的快捷键序列,默认是crtl+p crtl+q
--no-stdin=true|false:是否关闭标准输入,默认是打开状态
--sig-proxy=true|false:是否代理收到的系统信号给应用程序,默认为true
使用attach有时候并不是非常方便。当多个窗口同时attach到一个容器的时候,所有的窗口都会同步显示,也就是操作一个窗口,其它的所有窗口都会出现结果。
当某个窗口因命令阻塞时,其它窗口也无法执行操作了。
(2)exec
docker exec [-d|--detach] [--detach-keys[=[]]] [-e|--env[=[]]] [--help] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]
参数解释:
-d, --detach=true|false:分离模式:后台运行命令,默认是false
--detach-keys="":重写用于拆卸容器的键序列
-e, --env=[]:设置环境变量
-i, --interactive=true|false:打开标准输入接受用户输入指令,默认false
--privileged=true|false::是否给执行命令以高权限,默认false
-t, --tty=true|false:分配为终端,默认为false
-u, --user="":执行命令的用户名或ID
使用exec就不会出现attach的问题。
4.删除容器
docker rm:删除处于终止或退出状态的容器。
docker rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]
参数解释:
-f, --force=true|false:是否强制终止并删除一个处于运行状态的容器
-l, --link=true|false:删除容器的连接,但保留容器
-v, --volumes=true|false:删除容器挂载的数据卷
删除:
再次查看已经被删除:
如果所删除的容器正处于运行状态,就会报错。
52a正在运行
报错了,如果要强制删除必须添加-f操作。
5.查看容器
docker ps:列出本地存储库中的容器
docker ps [-a|--all] [-f|--filter[=[]]] [--format="TEMPLATE"] [--help] [-l|--lat‐est] [-n[=-1]] [--no-trunc] [-q|--quiet] [-s|--size]
参数说明:
-a, --all=true|false: 展示所有容器,默认情况下只会展示正在运行的容器
-f, --filter=[]:过滤
--format="TEMPLATE":格式化输出
-l, --latest=true|false:仅展示最新创建的容器
-n=-1:显示最后创建的容器(包括所有状态)。
--no-trunc=true|false: 不要截断输出,默认是false
-q, --quiet=true|false:仅显示ID,默认为false
-s, --size=true|false:显示总文件大小
--filter实例:
- exited=<int> an exit code of <int> 退出代码
- label=<key> or label=<key>=<value>
- status=(created|restarting|running|paused|exited|dead),通过状态过滤(已创建/正在重启/正在运行/暂停/离开/死亡)
- name=<string> a container's name 通过容器名
- id=<ID> a container's ID 通过容器id
- is-task=(true|false) - containers that are a task (part of a service managed by swarm)
- before=(<container-name>|<container-id>) 在哪个容器之前创建
- since=(<container-name>|<container-id>) 从那个容器开始到现在创建的
- ancestor=(<image-name>[:tag]|<image-id>| ⟨image@digest⟩) - containers created from an image or a descendant.从那个镜像创建
- volume=(<volume-name>|<mount-point-destination>)
- network=(<network-name>|<network-id>) - containers connected to the provided network 通过容器的IP地址
- health=(starting|healthy|unhealthy|none) - filters containers based on healthcheck status
例子:
docker ps -qa --filter=ancestor=docker.io/centos
docker ps -a --filter=before=2d412139865b
docker ps -q --filter=name=con_test
docker ps -qa --filter=status=exited
6.导入和导出容器
某些时候需要将容器从一个系统导入到另一个系统,这个时候不论是直接导出容器还是说先将容器制作成镜像都是可行的。
docker export:导出一个容器到一个文件,不管此时的容器是否处于运行状态。
docker export [--help] [-o|--output[=""]] CONTAINER
参数解释:
-o: 指定导出的tar文件名
docker import:将导出的文件导入变成镜像。
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] [--help] file|URL|-[REPOSITORY[:TAG]]
参数解释:
-c, --change=[]:在导入时应用指定的dockfile指令
-m, --message="":为导入的镜像设置提交信息。
导出文件:
导入文件:
查看:
我们发现dockers load和docker import十分类似。都可以将一个文件导入到镜像库中。
docker export类似快照,只会保存容器的快照状态,容器快照文件将丢弃所有历史记录和元数据信息(即仅保存容器当时的快照状态)
而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签元数据信息。
6.docker create和docker run的参数说明
docker create和docker run都可以创建容器,二者的参数完全相同。
與容器運行模式相關的選項: -a, --attach=[]:是否綁定到標準輸入、輸出和錯誤。 --add-host=[]:在容器内添加一个主机名到IP地址的映射关系(通过/etc/hosts文件) --blkio-weight=0:容器读写块设备的IO性能权重,默认为0; --blkio-weight-device=[DEVICE_NAME:WEIGHT]:指定各个块设备的IO性能权重; --cpu-shares=0:允许容器使用CPU资源的相对权重,默认一个容器能用满一个核的CPU。 --cap-add=[]:增加容器的LINUX指定安全能力 --cap-drop=[]:移除容器的LINUX指定安全能力 --cgroup-parent="":容器cgoups限制的创建路径 --cidfile="":指定容器的进程ID号写道文件 --cpu-count=0:限制容器可执行的CPU数量 --cpu-percent=0:限制在Windows守护程序上运行的容器可执行的CPU百分比 --cpu-period=0:限制容器在CFS调度器下的CPU占用时间片 --cpuset-cpus="":限制容器能使用那些CPU核心 --cpuset-mems="":NUMA架构下使用那些核心的内存 --cpu-quota=0:限制CPU在CFS调度器下的CPU配额 --cpu-rt-period=0:限制容器的实时CPU使用率。 --cpu-rt-runtime=0:以微秒为单位限制CPU实时运行时间 --cpus=0.0:CPU的数量 --device=[]:将主机设备添加到容器中 --device-read-bps=[]:挂载设备的读吞吐率(以bps为单位)限制 --device-read-iops=[]:挂载设备的读吞吐率(以每秒i/o次数为单位)限制 --device-write-bps=[]:挂载设备的写吞吐率(以bps为单位)限制 --device-write-iops=[]:挂载设备的写吞吐率(以每秒i/o次数为单位)限制 --dns=[]:自定义的DNS服务器 --dns-option=[]:自定义的DNS选项 --dns-search=[]:DNS搜索域 -e, --env=[]:指定容器内环境变量 --entrypoint="":镜像存在入口命令时,覆盖为新的命令 --env-file=[]:从文件中读取环境变量到容器 --expose=[]:指定容器会暴露出来的端口或端口范围 --group-add=[]:运行容器的用户组 -h, --hostname="":指定容器内的主机名 -i, --interactive=true|false --ip="":指定容器内的IPV4地址 --ip6="":指定容器内的IPV6地址 --ipc="":容器IPC命名空间,可以为其它容器或主机 --isolation="default":容器使用的隔离机制 --kernel-memory="":限制容器使用内核的内存大小,单位可以是b、k、m或g -l, --label=[]:将元数据添加到容器 --label-file=[]:从文件中读取标签。 用EOL分隔每个标签。 --link=[]:以<name或id>的形式添加指向另一个容器的链接:alias或just --link-local-ip=[]:将一个或多个链接本地IPv4 / IPv6地址添加到容器的接口 --log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none":指定容器的日志驱动类型 --log-opt=[]:传递给日志驱动的选项 -m, --memory="":限制容器内应用使用的内存,单位可以是b、k、m或g --mac-address="":指定容器的MAC地址。 --memory-reservation="":当系统内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值。 --memory-swap="LIMIT":限制容器使用内存和交换区的总大小 --memory-swappiness="":调整容器的内存swappiness行为。 接受0到10之间的整数 --name="":指定容器的别名 --network="bridge|none|container|host":指定容器网络模式 --network-alias=[]:容器在网络中的别名 --oom-kill-disable=true|false:内存耗尽时是否杀死容器 --oom-score-adj="":调整容器的内存耗尽参数 -P, --publish-all=true|false:通过NAT机制将容器标记暴露的端口自动映射到本地主机的临时端口 -p, --publish=[]:指定如何映射到本地主机端口 --pid="":为容器设置PID --userns="":启用userns-remap选项时,为容器设置usernamespace模式。 --pids-limit="":限制容器的PID个数 --privileged=true|false:是否给容器以高权限 --read-only=true|false:是否让容器内的文件系统只读 --restart="no":容器的重启策略,包括no, on-failure[:max-retry], always, unless-stopped --rm=true|false:容器退出后是否自动删除,不能跟-d同时使用 --shm-size="":/dev/shm的大小 --security-opt=[]:指定一些安全参数,包括权限、安全能力等 --storage-opt=[]:每个容器的存储驱动程序选 --stop-signal=SIGTERM:指定停止容器的系统信息 --stop-timeout=10:停止容器的超时(以秒为单位)。 默认值为10。 --sysctl=SYSCTL:在运行时配置命名空间的内核参数 -t, --tty=true|false:是否分配一个伪终端,默认为false --tmpfs=[]:将临时文件系统(tmpfs)mount挂载到容器中 -u, --user="":指定在容器内执行命令的用户信息 --ulimit=[]:通过ulimit来限制最大文件数、最大进程数 --uts=host:设置容器的UTS模式 -v|--volume[=[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]]:挂载主机上的文件到容器内
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2017-12-20 装饰器实例
2017-12-20 生成器、迭代器脚本实例
2017-12-20 魔法方法和属性
2017-12-20 将socket通信实现多进程
2017-12-20 认证客户端的链接合法性
2017-12-20 随机生成验证码
2017-12-20 ntp时间服务器