文章目录
- 前言
- 容器是什么
- 虚拟化技术的四个特点
- 容器也是一种虚拟化技术
- 容器是怎么实现虚拟化的?
- 容器对比虚拟机有哪些优势?
- 容器对比虚拟机有哪些不足?
- 容器不仅是一种虚拟化技术,更重要的是一种应用打包机制
- 容器提供的是PaaS服务
- 常见容器引擎
- Docker简介
- Docker的技术架构
- Containerd简介
- iSula简介
- 容器生态相关术语说明
- 容器和虚拟机的融合 - 安全容器
- 总结:容器是什么
- 容器使用场景
- 容器是怎么工作的
- 容器工作机制 - 以Docker为例
- 容器的关键技术 - Namespace
- Namespace隔离说明
- 容器的关键技术 - Cgroup
- 容器管理
- 容器生命周期
- 创建容器
- 启动容器
- 创建和启动容器等常用的命令选项
- 创建、指定端口、进入容器、指定变量
- 指定容器内工作目录、指定容器名称、指定DNS
- 限制容器cpu资源
- 限制容器内存资源
- 在容器中执行命令
- 进入容器方式1:attach直接进入
- 进入容器方式2:exec创建终端【不进入容器执命令】
- 暂停和恢复容器
- 列出容器概要信息
- 查看容器详细信息
- 查看容器日志
- 重启容器
- 删除容器
- 删除所有容器
- 容器网络说明、容器存储说明、容器镜像说明、dockerfile详述、缩略词
前言
- 注:关于容器,其实我有docker和k8s的分栏,里面的介绍更为详细,有需要的可以去前面博客中了解。这里单独放是因为hcie课程里面有。 所以这就跟着课程简单做了笔记。
- 容器作为云原生的关键技术之一,是云原生应用实现的主要基石,本章将从容器的定义开始,并以Docker为例,介绍容器的基本操作及容器镜像的制作方法。
- 学完本课程后,您将能够:
- 了解容器是什么
- 掌握容器的基本操作
- 掌握容器镜像的制作
容器是什么
虚拟化技术的四个特点
- 分区:每个运行在容器内的应用都有自己的硬件资源
- 隔离:通过分区所建立的多个容器之间采用逻辑隔离措施,防止相互影响
- 封装:封装意味着将整个容器储存在独立于物理硬件的一小组文件中
- 独立:容器可以被运行在相同linux内核的linux发行版内,和硬件无关
容器也是一种虚拟化技术
- 虚拟化的四个特点,容器都可以实现
- 使用命令
docker run -d nginx
创建了三个容器,每个容器都独立运行,拥有着自己的硬件资源 - 同时,这三个容器既可以运行在本机,也可以运行在其他主机上
- 使用命令
[root@localhost docker]# docker run -d nginx
ec5306ec7efec2ddbdd4e538721e3bbdc8ce29b48e6a82383f002547739421e7
[root@localhost docker]# docker run -d nginx
58065b181111e9db49f421893d028d89244764f07ce791639b14d7b0ae05f072
[root@localhost docker]# docker run -d nginx
2a9769bc8ed99191b81a2478853d9f4603b9c6305004ba970bd3bfade1c4bdfc
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a9769bc8ed9 nginx "/docker-entrypoint.…" 14 seconds ago Up 13 seconds 80/tcp affectionate_cerf
58065b181111 nginx "/docker-entrypoint.…" 15 seconds ago Up 15 seconds 80/tcp bold_solomon
ec5306ec7efe nginx "/docker-entrypoint.…" 18 seconds ago Up 17 seconds 80/tcp xenodochial_satoshi
e72612d340ec nginx "/docker-entrypoint.…" About a minute ago Exited (0) About a minute ago silly_herschel
- 虚拟化的四个特点,容器都可以实现
- 使用命令
docker stop ec
停止其中一个容器,其他容器仍能正常运行 - 命令
docker run -d nginx
中的nginx是创建容器的镜像,相当于是应用被打包后的一个文件
- 使用命令
[root@localhost docker]# docker stop ec
ec
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a9769bc8ed9 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp affectionate_cerf
58065b181111 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp bold_solomon
ec5306ec7efe nginx "/docker-entrypoint.…" About a minute ago Exited (0) 1 second ago xenodochial_satoshi
e72612d340ec nginx "/docker-entrypoint.…" 2 minutes ago Exited (0) 2 minutes ago silly_herschel
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 298ec0e28760 14 months ago 133MB
容器是怎么实现虚拟化的?
- 容器是怎么实现虚拟化的?
- 虚拟化是通过hypervisor进行硬件的模拟,从而实现虚拟化的
- 容器是容器引擎通过namespace和Cgroup对应用进行欺骗,从而实现虚拟化的
- 虚拟化是通过hypervisor进行硬件的模拟,来实现虚拟化的
- 容器是容器引擎通过namespace和Cgroup对应用进行欺骗,来实现虚拟化的
容器对比虚拟机有哪些优势?
容器 | 虚拟机 | |
---|---|---|
启动速度 | 秒甚至毫秒启动 | 数秒至数十秒 |
系统内核 | 共享内核 | 不共享内核 |
实现技术 | 利用Linux内核技术Namespace/Cgroup等实现。 | 依赖虚拟化技术实现,由Hypervisor层实现对资源的隔离 |
隔离效果 | 进程级别的隔离 | 系统资源级别的隔离 |
资源消耗(性能) | 容器中的应用只是宿主机上的一个普通进程 | 使用虚拟化技术,就会有额外的资源消耗和占用 |
资源调用(敏捷性) | 应用进程直接由宿主机OS管理 | 应用进程需经过Hypervisor的拦截和处理,才能调用系统资源 |
运行数量 | 一台服务器上能启动1000+容器 | 一台服务器上一般不超过100台虚拟机 |
应用 | DevOps、微服务等 | 用于硬件资源划分 |
镜像 | 分层镜像 | 非分层镜像 |
容器对比虚拟机有哪些不足?
- 容器的实现方式注定了容器无法彻底的隔离,因此带来了一些不如虚拟机的地方
- 安全性
- 隔离性
- 资源限制
容器不仅是一种虚拟化技术,更重要的是一种应用打包机制
- 应用运行需要依赖包括操作系统在内的库,容器镜像可以将应用及其所有依赖进行打包,使应用在不同平台(开发、测试或者生产)上拥有相同的运行环境
容器提供的是PaaS服务
有了容器后,传统的应用部署方式发生了变化。以前用户需要先申请一个虚拟机或者安装一台物理机,然后使用脚本或者手动的方式部署应用。由于容器镜像将应用及其依赖进行了打包,部署时,仅需要将镜像解压即可
常见容器引擎
- Docker
- 其他
- Containerd
- Podman
- iSula
- Rocket
Docker简介
- 容器的精髓在于镜像,而docker是容器镜像标准的制定者,因此,学习容器是绕不开docker的
- 2013年,dotCloud公司将docker项目开源
- Docker项目:
- GitHub上开发的Moby开源项目的一部分
- 遵循Apache License 2.0许可证协议
- Go语言编写
- Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器
- Docker公司目前推出两个版本:
-Docker CE(社区版)- Docker EE(企业版)
Docker的技术架构
Containerd简介
- Containerd是Docker公司于2017年捐赠给CNCF社区的一个项目
- 2019年2月28日,Containerd从CNCF毕业,是一个符合行业标准的运行时
- Containerd支持Linux系统和Windows系统
iSula简介
- 在居住中南美洲亚马逊丛林的巴西原住民眼里,iSula是一种非常强大的蚂蚁,学术上称为“子弹蚁”,因为被它咬一口,犹如被子弹打到那般疼痛,它是世界上最强大的昆虫之一
- iSula为全量的容器软件栈,包括引擎、网络、存储、工具集与容器OS
- iSulad作为其中轻量化的容器引擎与子弹蚂蚁“小个头、大能量”的形象不谋而合
容器生态相关术语说明
- OCI和CNCF
- OCI是由多家公司共同成立的基金会,以RunC为依据制定的一套容器和镜像的标准和规范
- CNCF是一个以kubernetes为核心的容器编排开源基金会
- RunC和Runtime
- Runtime是对容器运行时的相关状态和操作进行管理的工具,所有的runtime共同遵守的OCI的标准和规范
- RunC是runtime的一种,由docker公司2015年发布的符合OCI规范的runtime工具
名称 | 内容 |
---|---|
bundle.md(Filesystem Bundle ) | bundle中包含了运行容器所需要的所有信息,主要是config.json文件和rootfs。Runtime根据bundle启动容器 |
config.md | 包含对容器实施标准操作所必需的元数据,存放于config.json文件中。如oci版本、rootfs路径、mount目录、process、platform、容器hostname等 |
config-linux.md | Linux平台上对config.md的扩展,内容也包含在config.json文件中。如namespace、devices、CgroupPath、resources、sysctl、readonlyPaths等 |
runtime.md | 定义了3部分内容:容器状态(如status、pid等)、容器相关操作(如create、kill等)、容器生命周期 |
runtime-linux.md | 是Linux平台上对runtime.md的补充 |
容器和虚拟机的融合 - 安全容器
- 安全容器
- 安全容器融合了容器和虚拟机的特性
- 容器之间使用hypervisor隔离,可以达到虚拟机的安全性
- 轻量级的hypervisor可以使安全容器的启动达到容器级别
- 和普通容器相比,安全容器最主要的区别是每个容器(准确地说是pod)都运行在一个单独的微型虚拟机中,拥有独立的操作系统内核,以及虚拟化层的安全隔离。因为云容器实例采用的是共享多租集群,因此容器的安全隔离比用户独立拥有私有Kubernetes集群有更严格的要求。通过安全容器,不同租户之间的容器之间,内核、计算资源、存储和网络都是隔离开的。保护了用户的资源和数据不被其他用户抢占和窃取
总结:容器是什么
容器可以被看成是一种轻量级虚拟化技术,利用namespace和Cgroup等隔离技术,将一个或者一组进程运行在一个相对独立的资源空间内
容器使用场景
- 部署无状态服务
- CI/CD、DevOps及微服务的场景
- 跨Region、跨数据中心的混合云场景
- 版本变更比较频繁的业务
容器是怎么工作的
容器工作机制 - 以Docker为例
容器的关键技术 - Namespace
- Namespace是Linux内核对系统资源进行隔离和虚拟化的特性,这些系统资源包括:
- PID
- User
- UTS
- IPC
- Net
- Mnt
Namespace隔离说明
- 以交互模式启动一个centos容器,并在其中运行/bin/bash程序。执行ps命令查看到“/bin/bash”是PID=1的进程,即docker将其隔离于宿主机中的其他进程
[root@localhost ~]# docker run -it centos /bin/bash
[root@24b87937f13d /]# ps axf
PID TTY STAT TIME COMMAND
1 pts/0 Ss 0:00 /bin/bash
14 pts/0 R+ 0:00 ps axf
- 打开另一个终端,使用docker inspect查看容器进程在宿主机上的真实PID。实际上,该容器上运行的”/bin/bash”在宿主机上是PID=96745的进程
[root@localhost ~]# docker inspect 24b87937f13d | grep Pid
"Pid": 96745,
"PidMode": "",
"PidsLimit": 0,
容器的关键技术 - Cgroup
- Cgroups:Linux Control Group
- 作用:限制一个进程组对系统资源的使用上限,包括CPU、内存、Block I/O等
- Cgroups还能设置进程优先级,对进程进行挂起和恢复等操作
- 原理:将一组进程放在一个Cgroup中,通过给这个Cgroup分配指定的可用资源,达到控制这一组进程可用资源的目的
- 实现:在Linux中,Cgroups以文件和目录的方式组织在操作系统的/sys/fs/Cgroup路径下。该路径中所有的资源种类均可被Cgroup限制
容器管理
容器生命周期
容器是为任务而生的,容器中的任务终止了,容器也就终止了
创建容器
- 创建容器命令格式为:
docker create 容器镜像
- 例如:
docker create nginx
- 使用镜像nginx创建一个容器
- 创建完成后系统会为容器分配一个容器ID,在查看容器时,仅显示前12位,后续对容器操作时,容器ID在不冲突的情况下可简写
- 创建后的容器状态为
Created
[root@localhost ~]# docker create nginx
ad33d31adf5279d49ae6d0a9466a00965790c59067d06d16e5bcce15960baeb6
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad33d31adf52 nginx "/docker-entrypoint.…" 10 seconds ago Created sweet_hoover
启动容器
- 启动容器命令格式为:
docker start 容器ID
- 例如:
docker start a
- a为简写后的容器ID,如果还有其他的容器ID也是以a开头,就会发生冲突
- 启动后的容器状态变为
Up
[root@localhost ~]# docker start a
a
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad33d31adf52 nginx "/docker-entrypoint.…" 18 minutes ago Up 4 minutes 80/tcp sweet_hoover
- 也可以使用命令run将容器创建和容器启动合并完成,命令格式为:
docker run 容器镜像
例如:docker run nginx
[root@localhost ~]# docker run nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
创建和启动容器等常用的命令选项
创建、指定端口、进入容器、指定变量
-d
容器启动时放入后台运行,例如:docker run -d nginx
[root@localhost ~]# docker run -d nginx
86b0789d0a3b7b240e5a8f7ddfd477c9560f252e5330bc6edd61bb63167c9f3f
-i
交互式执行-t
为容器分配一个终端,在使用该参数时需要为容器分配一个shell,但不是所有的镜像中安装了shell-i
和-t
一般配合使用,可以写作-it
- 例如:docker run -d -it nginx /bin/bash
[root@localhost ~]# docker run -d -it nginx /bin/bash
f01db67272d10a433f1e0df46fb5d1a6a693f6ea6403cd2e1a20a01d0b8a0380
- 使用了-it参数并分配了shell后,使用
docker attach
命令,可以进入容器
[root@localhost ~]# docker attach f0
root@f01db67272d1:/#
-p
配置宿主机和容器的端口映射,例如:docker run -d -p 8081:80 nginx
,其中8081为宿主机的端口,80为容器的端口
[root@localhost ~]# docker run -d -p 8081:80 nginx
53a133352e4b9f08f0425e9c217cd2824f6dac7cdf36dd29c0c5fdb41802c372
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
53a133352e4b nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:8081->80/tcp, :::8081->80/tcp quizzical_roentgen
- 在指定端口时,可以指定端口所使用的协议,例如:
docker run -d -p 8081:80/udp nginx
[root@localhost ~]# docker run -d -p 8081:80/udp nginx
cc12f8ccabb74d115f69b723e133b168d342fec0f8aba36bfbcce1353c50890a
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc12f8ccabb7 nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 80/tcp, 0.0.0.0:8081->80/udp, :::8081->80/udp competent_napier
- 在启动容器时,可以一次性指定多个端口映射,例如:
docker run -d -p 8081:80 -p 5000:5000 nginx
[root@localhost ~]# docker run -d -p 8081:80 -p 5000:5000 nginx
321f2a5e7e76298575d7a3f7c10e73820920c7bf001007b461bbac3ff9efb864
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
321f2a5e7e76 nginx "/docker-entrypoint.…" 9 seconds ago Up 8 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp, 0.0.0.0:8081->80/tcp, :::8081>80/tcp
-e
在容器启动时为其配置环境变量,例如:docker run -d -it -e A=100 nginx /bin/bash
,在启动容器时,将A设置为100
[root@localhost ~]# docker run -d -it -e A=100 nginx /bin/bash
7ed7285fa56dec468e1db2cf3c20ed410a5878b45d9b27bf878b24580cd09e7e
[root@localhost ~]# docker attach 7e
root@7ed7285fa56d:/# echo $A
100
- 在创建和启动容器时,可多次使用-e选项来指定多个变量,例如:
docker run -d -it -e A=100 -e B=200 nginx /bin/bash
[root@localhost ~]# docker run -d -it -e A=100 -e B=200 nginx /bin/bash
d1a3b533380181168ab9642d5479da2671ed8af45bae925ca67eeea2b3ec4213
[root@localhost ~]# docker attach d1
root@d1a3b5333801:/# echo $A
100
root@d1a3b5333801:/# echo $B
200
指定容器内工作目录、指定容器名称、指定DNS
--workdir
指定容器内部的工作目录,例如:docker run -d -it --workdir /tmp nginx /bin/bash
,将工作目录修改为/tmp
[root@localhost ~]# docker run -d -it --workdir /tmp nginx /bin/bash
c7d7afdc2d0b9c52c988079c9ccb88cf9637ca32c731bf93448b5e39c38e2a62
[root@localhost ~]# docker attach c7
root@c7d7afdc2d0b:/tmp# pwd
/tmp
--name
用于创建和启动容器时,为容器指定一个名称,例如:docker run -d --name test nginx
,将容器名称指定为test
[root@localhost ~]# docker run -d --name test nginx
4f830a51df2c72ec342610ca621d609cbe65103c0cd815cd4e6d87ff7a620cbe
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f830a51df2c nginx "/docker-entrypoint.…" 12 seconds ago Up 12 seconds 80/tcp test
--dns
为容器指定DNS,例如:docker run -d -it --dns 192.168.38.2 busybox /bin/sh
,将容器DNS指定为192.168.38.2
[root@localhost ~]# docker run -d -it --dns 192.168.38.2 busybox /bin/sh
F2d1bf4537520808c5d1cc183e933176f28a87f945924307843a8bd80f936bc2
[root@localhost ~]# docker attach f2
/ # nslookup www.baidu.com
Server: 192.168.38.2
Address: 192.168.38.2:53
限制容器cpu资源
-c
可以用来限制容器cpu资源,例如:docker run -d --cpus 0.2 progrium/stress --cpu 1
中的“–cpus 0.2”表示占用了宿主机20%的cpu资源
[root@localhost Dockerfile]# docker run -d --cpus 0.2 progrium/stress --cpu 1
A7a28c2e3954728fcbe94a68d6f74fd25a982818ff5d5b59805082d269a134f5
[root@localhost Dockerfile]# top
top - 06:56:30 up 2:55, 2 users, load average: 0.87, 0.57, 0.28
Tasks: 119 total, 2 running, 117 sleeping, 0 stopped, 0 zombie
%Cpu(s): 9.7 us, 0.2 sy, 0.0 ni, 90.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861300 total, 2343544 free, 445236 used, 1072520 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 3168692 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5351 root 20 0 7304 96 0 R 19.9 0.0 0:20.84 stress
662 root 20 0 273008 4752 3656 S 0.3 0.1 0:25.42 vmtoolsd
1071 root 20 0 1089408 45668 14616 S 0.3 1.2 0:07.91 containerd
progrium/stress
是一个用来进行压力测试的容器镜像- 命令中
--cpu 1
表示在容器中产生1个进程,用来不停的计算随机数的平方,这样认为把容器所有的计算资源全部占用掉了 --cpu-period
和--cpu-quota
配合使用也可以用来限制容器cpu资源,例如:docker run -d --cpu-period 10000 --cpu-quota 3000 progrium/stress --cpu 1
中的“–cpu-period 10000 --cpu-quota 3000”相当于“–cpus 0.3”
[root@localhost Dockerfile]# docker run -d --cpu-period 10000 --cpu-quota 3000 progrium/stress --cpu 1
Fc060bff9b4502021cbb01f262cff05861c0a129eaa04d2d5170c673791ea2c9
[root@localhost Dockerfile]# top
top - 07:11:57 up 3:11, 2 users, load average: 0.00, 0.04, 0.14
Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie
%Cpu(s): 16.0 us, 0.0 sy, 0.0 ni, 84.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861300 total, 2341900 free, 446876 used, 1072524 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 3167064 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5747 root 20 0 7304 96 0 R 29.7 0.0 0:04.10 stress
662 root 20 0 273008 4752 3656 S 0.8 0.1 0:27.20 vmtoolsd
1 root 20 0 125504 3936 2572 S 0.0 0.1 0:02.49 systemd
--cpu-period
和--cpu-quota
分别指在10000个总时间单位中,分配给该容器3000个时间单位
限制容器内存资源
--memory
或-m
可以用来限制容器的内存资源,例如:docker run -d -m 2000M progrium/stress --vm 1 --vm-bytes 2000M
中的“-m”表示为该容器分配了2000 M内存资源
[root@localhost Dockerfile]# free -m
total used free shared buff/cache available
Mem: 3770 424 2299 11 1047 1480
Swap: 0 0 0
[root@localhost Dockerfile]# docker run -d -m 2000M progrium/stress --vm 1 --vm-bytes 2000M
Ad4647f1657f6ac382d400e12e66aaa23b0ecb428001dbc389078e7bcd8b312f
[root@localhost Dockerfile]# top
top - 07:25:24 up 3:24, 2 users, load average: 1.14, 0.55, 0.28
Tasks: 123 total, 2 running, 121 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 19.2 sy, 0.0 ni, 80.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861300 total, 327704 free, 2461040 used, 1072556 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1152924 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6073 root 20 0 2055308 1.9g 244 R 100.0 52.1 1:03.88 stress
- 命令中的–vm 1 --vm-bytes 2000M表示耗尽所有内存资源
- 当前宿主机共4G内存,为容器分配了2000M,占用全部内存的进50%
在容器中执行命令
进入容器方式1:attach直接进入
attach
:进入容器,然后执行命令,因此需要在运行时容器为其提前创建好终端。执行完命令使用exit
可退出容器
[root@localhost ~]# docker run -d -it nginx /bin/bash
792497bf8801f008fd9372ca8d44680192447148951f2fcb85bde4a8fd158dfd
[root@localhost ~]# docker attach 79
root@792497bf8801:/# echo "this is a test"
this is a test
root@792497bf8801:/# exit
exit
[root@localhost ~]#
进入容器方式2:exec创建终端【不进入容器执命令】
- exec:会自动创建新的终端,因此,不进入容器也可以执行命令
[root@localhost ~]# docker run -d nginx
995989fa9dd51d7587a82fa7085059eec78858a7afa0cdcfd5cca2b9f5789533
[root@localhost ~]# docker exec 99 echo "this is a test"
this is a test
- 在exec后添加-it选项后,也可以进入容器
[root@localhost ~]# docker exec -it 79 /bin/bash
root@792497bf8801:/#
暂停和恢复容器
- 使用命令
docker pause
可暂停一个运行中的容器
[root@localhost ~]# docker pause 79
79
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
792497bf8801 nginx "/docker-entrypoint.…" 26 minutes ago Up 23 minutes (Paused) 80/tcp dazzling_keller
- 使用命令
docker unpause
可将暂停的容器恢复到运行中
[root@localhost ~]# docker unpause 79
79
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
792497bf8801 nginx "/docker-entrypoint.…" 28 minutes ago Up 25 minutes 80/tcp dazzling_keller
列出容器概要信息
- 使用
docker ps
可以列出当前容器的概要信息- 使用docker ps可以列出当前状态为运行中的容器
-a
可列出所有的容器-q
列出容器室时仅显示容器ID-n
列出最近创建的n个容器(包括所有状态)
- 例如:
docker ps -aq
,可列出所有的容器
[root@localhost ~]# docker ps -aq
5ed66058457a
634f4c4e9b45
4e0f8a174dad
c545b3d90797
792497bf8801
- 例如:
docker ps -n 2
,可列出最近创建的两个容器
[root@localhost ~]# docker ps -n 2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ed66058457a nginx "/docker-entrypoint.…" 3 minutes ago Exited (0) 4 seconds ago elated_neumann
634f4c4e9b45 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp tender_shtern
查看容器详细信息
- 使用命令
docker inspect
可查看容器的详细信息,默认情况下,该命令的输出是以go语言的语法显示,如果需要使用其他格式输出,可添--format
选项 - 例如使用命令
docker inspect --format=”{{json .NetworkSettings}}“ pedantic_burnell | python -m json.tool
可以以json格式输出容器的网络信息
查看容器日志
使用命令docker logs 容器ID
可查看容器的日志,例如docker logs 06
即可查看到该容器的日志
[root@localhost ~]# docker logs 06
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
重启容器
- 使用
docker restart 容器ID
可以重启容器
[root@localhost ~]# docker restart 06
06
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0634a706db21 nginx "/docker-entrypoint.…" 5 hours ago Up 39 seconds 80/tcp pedantic_burnell
- 在创建容器时,使用
--restart
可以设置容器的自动重启策略【如:--restart=always
】no
在容器退出时不重启容器,默认使用该策略on-failure
在容器非正常退出时重启容器,后面可以添加尝试重启的次数always
容器退出时总是重启容器unless-stopped
在容器退出时总是重启容器,但是不考虑在docker守护进程启动时就已经停止了的容器
删除容器
- 使用命令
docker rm 容器ID
删除容器,该命令只能删除非运行状态的容器,使用-f
选项可以强制删除所有状态的容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0634a706db21 nginx "/docker-entrypoint.…" 5 hours ago Up 7 minutes 80/tcp pedantic_burnell
[root@localhost ~]# docker rm 06
Error response from daemon: You cannot remove a running container 0634a706db21f8f5637143b770554c595709a17553677e62a5fe8cdb27dffafc. Stop the container before attempting removal or force remove
[root@localhost ~]# docker rm -f 06
06
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 在创建容器时,使
--rm
选项可以在容器停止后自动删除
删除所有容器
谨慎操作。
docker ps -aq | xargs docker rm -f
容器网络说明、容器存储说明、容器镜像说明、dockerfile详述、缩略词
看这篇文章