目录
一.Docker容器简要介绍
Docker 是一个开源项目,旨在提供轻量级的应用容器化解决方案。它允许开发者打包应用及其所有依赖项到一个标准化的单元中,称为容器。这些容器可以在开发人员的工作环境中构建,然后轻松地在不同的计算机、服务器或云平台上运行,而无需担心环境差异或依赖问题。
1.操作系统的组成
Bootloader (引导加载程序):
引导加载程序是启动计算机时加载操作系统的程序。它位于计算机的固件或引导设备的特定分区中,并负责引导操作系统的加载过程。
Shell (命令行解释器):
Shell 是用户与操作系统交互的主要界面,它可以理解和执行用户输入的命令。Shell 提供了命令行界面(CLI),允许用户通过输入命令来操作文件、进程以及运行其他程序。
Kernel (内核):
内核是操作系统的核心部分,负责管理计算机的硬件资源和提供基本的服务给其他软件。它管理内存、处理器、设备驱动程序和系统调度,确保软件和硬件资源的有效利用和安全运行。
Desktop Environment (桌面环境):
桌面环境是操作系统中提供给用户的图形用户界面(GUI),它包括窗口管理器、面板、图标、工具栏等,使得用户可以通过鼠标点击和图形化方式来操作和管理计算机系统。
Graphical Server (图形服务器):
图形服务器是操作系统的一个子系统,负责管理和渲染图形输出到显示器上。它接收来自应用程序的图形指令,并将它们转换为适合显示器显示的像素信息。
Applications (应用程序):
应用程序是用户直接使用的软件,用于执行特定的任务和操作。这些可以是办公软件如 Word、Excel,也可以是浏览器、媒体播放器等等。
Daemons (守护进程):
守护进程是在后台运行的服务程序,通常在系统启动时启动,并持续运行以提供某种服务或支持功能。它们通常不与用户交互,而是在系统运行时处理特定的任务或服务,例如网络服务、打印服务等。
2.什么是内核kernel
内核(Kernel)是操作系统的核心组件,它在计算机系统中扮演着至关重要的角色。下面是内核的主要任务和功能:
进程管理:
内核负责管理系统中的进程(也称为任务或线程),包括进程的创建、调度、终止和进程间通信。
内存管理:
内核管理系统的物理内存和虚拟内存,包括内存的分配、释放、虚拟内存到物理内存的映射等。
I/O管理:
内核管理输入输出操作,包括对设备(如硬盘、网络接口、显示器等)的访问和控制。
系统调用:
内核提供系统调用接口,允许用户程序请求操作系统提供的服务,如文件操作、网络通信等。
设备驱动程序:
内核通过设备驱动程序与硬件设备交互,驱动程序允许内核控制和管理各种硬件设备的操作。
安全性和权限管理:
内核确保系统的安全性,包括权限管理、用户身份验证、访问控制等。
系统调度:
内核根据预定的调度策略和优先级,决定哪个进程在何时运行,以优化系统资源的利用。
错误处理和容错:
内核负责处理系统的错误和异常情况,以保证系统的稳定性和可靠性。
3.什么是内核空间和用户空间
内核空间
内核处于提升的系统状态,其中包括受保护的内存空间以及对设备硬件的完全访问权限。 此系统状态和内存空间统称为内核空间。 在内核空间内,对硬件和系统服务的核心访问进行管理,并作为服务提供给系统的其余部分。
用户空间
用户空间或用户域是在操作系统内核环境之外运行的代码,用户空间定义为操作系统用来与内核连接的各种应用程序或程序或库。
用户的应用程序是在用户空间中执行的,它们可以通过内核系统调用访问计算机可用资源的一部分。 通过使用内核提供的核心服务,可以创建用户级别的应用程序,例如游戏或办公软件。
4.容器和虚拟机表现比较
资源利用率更高:
容器确实比传统的虚拟机利用资源更高效。这是因为容器直接运行在宿主操作系统的内核上,无需额外的操作系统层,减少了资源消耗。虚拟机则需要独立的操作系统镜像和虚拟化管理层,因此通常会有更大的资源开销。启动速度更快:
容器启动速度通常比虚拟机快得多。容器之间可以共享宿主操作系统的内核,因此它们可以在几秒钟内启动,而虚拟机需要启动完整的操作系统,通常需要数十秒到数分钟的时间。占用空间更小:
容器通常占用的磁盘空间比虚拟机小得多。容器镜像一般以MB为单位,因为它们共享宿主操作系统的文件系统和资源。虚拟机则需要完整的独立操作系统镜像,因此通常以GB为单位。集成性更好:
容器由于其轻量级和快速启动的特性,更适合与持续集成和持续部署(CI/CD)工具集成。开发团队可以更容易地将应用程序打包为容器镜像,并在不同环境中快速部署和运行,实现自动化和高效的开发生命周期管理。
5.Docker的组成
docker 官网: http://www.docker.com
帮助文档链接: https://docs.docker.com/
docker 镜像: https://hub.docker.com/
docker 中文网站:http://www.docker.org.cn/
Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机,node节点
Docker 服务端(Server): Docker守护进程,运行docker容器
Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API
Docker 镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库harbor
Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程
6.验证系统cgroups
Cgroups在内核层默认已经开启,从CentOS 和 Ubuntu 不同版本对比,显然内核较新的支持的功能更多。
grep CGROUP /boot/config-3.10.0-693.el7.x86_64
cgroups具体实现
blkio: 块设备IO限制
cpu: 使用调度程序为 cgroup 任务提供 cpu 的访问
cpuacct: 产生 cgroup 任务的 cpu 资源报告
cpuset: 如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存
devices: 允许或拒绝 cgroup 任务对设备的访问
freezer: 暂停和恢复 cgroup 任务
memory: 设置每个 cgroup 的内存限制以及产生内存资源报告
net_cls: 标记每个网络包以供 cgroup 方便使用
ns: 命名空间子系统
perf_event: 增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定CPU上的线程
7.Docker的缺点
多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底
由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和繁琐
如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重复浪费
二.安装Docker
官方网址: https://www.docker.com/
OS系统版本选择:
Docker 目前已经支持多种操作系统的安装运行,比如Ubuntu、CentOS、Redhat、Debian、Fedora,甚至是还支持了Mac和Windows,在linux系统上需要内核版本在3.10或以上
Docker版本选择:
docker版本号之前一直是0.X版本或1.X版本,但是从2017年3月1号开始改为每个季度发布一次稳定版,其版本号规则也统一变更为YY.MM,例如17.09表示是2017年9月份发布的Docker之前没有区分版本,但是2017年推出(将docker更名为)新的项目Moby,github地址: https://github.com/moby/moby,Moby项目属于Docker项目的全新上游,Docker将是一个隶属于的Moby的子产品,而且之后的版本之后开始区分为 CE(Docker Community Edition,社区版本)和EE(Docker Enterprise Edition,企业收费版),CE社区版本和EE企业版本都是每个季度发布一个新版本,但是EE版本提供后期安全维护1年,而CE版本是4个月,以下为官方原文:
https://blog.docker.com/2017/03/docker-enterprise-edition/
如果要布署到kubernets上,需要查看相关kubernets对docker版本要求的说明,比如:
https://github.com/kubernetes/kubernetes/blob/v1.17.2/CHANGELOG-1.17.md
安装可以参考以下文档
阿里云文档: https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11guHCWE
1.yum安装
CentOS 6 因内核太旧,即使支持安装docker,但会有各种问题,不建议安装
CentOS 7 的 extras 源虽然可以安装docker,但包比较旧,建议从官方源或镜像源站点下载安装docker
CentOS 8 有新技术 podman 代替 docker
因此建议在CentOS 7 上安装 docker
#extras 源中包名为docker
yum list docker
官方地址下载 rpm包
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
阿里云地址下载
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
cd /etc/yum.repos.d/
#CentOS 7 安装docker依赖三个yum源:Base,Extras,docker-ce
yum install -y yum-utils device-mapper-persistent-data lvm2
#安装 依赖工具
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#添加源信息
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#修改配置文件
yum makecache fast
yum list docker-ce
#查看最新版本
yum list --showduplicates docker-ce
#查看所有的可用版本
yum list --help
#可以使用帮助查看
yum list docker-ce.x86_64 --showduplicates
#显示可安装版本
yum -y install docker-ce-19.03.15-3.el7 docker-ce-cli-19.03.15-3.el7 containerd.io
# 安装指定版本的Docker-CE和客户端,注意客户端也要指定,否则或造成不一致
#yum -y install docker-ce-[VERSION]
#如不指定版本默认最新
[root@localhost yum.repos.d]# mkdir -p /etc/docker
[root@localhost yum.repos.d]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://ifxbyp3x.mirror.aliyuncs.com"]
> }
> EOF
{
"registry-mirrors": ["https://ifxbyp3x.mirror.aliyuncs.com"]
}
验证运行
[root@localhost yum.repos.d]# systemctl daemon-reload
[root@localhost yum.repos.d]# systemctl restart docker
[root@localhost yum.repos.d]# docker run hello-world
软件 | 作用 |
---|---|
docker-ce(Docker Community Edition) | 这是 Docker 的社区版。Docker 社区版是免费的, 面向开发者、小型团队和个人使用。它包含了 Docker Engine, 这是一个用于构建和运行容器的开源容器运行时。 |
docker-ce-cli(Docker Command Line Interface) | 这是 Docker 的命令行工具, 它允许用户与 Docker Engine 交互,执行容器相关的操作。 通过 Docker CLI,用户可以构建、运行、管理和发布容器。 |
containerd.io | 它负责管理容器的生命周期,包括容器的创建、运行、暂停、继续和销毁等 |
三.基础操作
1.docker程序环境
1.1 环境配置文件
/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/sysconfig/docker
1.2 Unit File
/usr/lib/systemd/system/docker.service
1.3 docker-ce 配置文件
/etc/docker/daemon.json
1.4 Docker Registry 配置文件
/etc/containers/registries.conf
2. 基础操作
2.1 查看docker 版本
docker version
2.2 docker 信息查看
[root@localhost data]#docker info
Client: Docker Engine - Community
Version: 26.1.4
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.14.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.27.1
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 2 # 容器数量
Running: 0
Paused: 0
Stopped: 2
Images: 4 # 镜像数量
Server Version: 26.1.4 # server 版本
Storage Driver: overlay2 #docker 使用的是 overlay2 文件驱动
Backing Filesystem: xfs ## 宿主机上的底层文件系统
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs # Cgroups 驱动
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957
runc version: v1.1.12-0-g51d5e94
init version: de40ad0
Security Options:
seccomp
Profile: builtin
Kernel Version: 3.10.0-693.el7.x86_64 # 宿主机的相关信息
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 1.781GiB
Name: localhost.localdomain
ID: 39eee203-7863-4c80-a955-9aef575138c1
Docker Root Dir: /var/lib/docker # docker 数据存储目录
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://6ijb8ubo.mirror.aliyuncs.com/ # registry 地址
Live Restore Enabled: false
2.3 镜像仓库加速
#镜像加速下载
浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ifxbyp3x.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
四.镜像管理
制作镜像 上传镜像 下载镜像 查找镜像 导出镜像 导入镜像 删除镜像 查询镜像
命令 | 含义 | 例子 |
---|---|---|
docker --help | 查看帮助 | |
docker image --help | 查看镜像帮助 | docker image --help |
docker search 镜像名称 | 搜索相关镜像 | docker search nginx |
docker pull 镜像名称:标签 | 下载镜像(不加标签默认使用latest) | docker pull nginx |
docker images | 查看所有已有镜像 | docker images |
docker images 镜像名称 | 查看单个镜像 | docker images nginx |
docker inspect 镜像ID | 查看镜像的详细信息 | docker inspect 56b21e040954 |
docker tag 旧名称 新名称 | 修改镜像的 标签 | docker tag nginx:latest lucky/nginx:1.25 |
1.搜索镜像
官方网站进行镜像的搜索
#格式
docker search 关键字
#NAME: 列出了搜索结果中各个镜像的名称。
#DESCRIPTION: 描述了每个镜像的简要说明或介绍。
#STARS: 显示了每个镜像的星级评分或受欢迎程度。星级数量越高表示该镜像的受欢迎程度越高。
#OFFICIAL: 表示是否是官方构建的镜像,OK表示是官方构建的。
#AUTOMATED: 表示是否是自动构建的镜像,这个字段没有值表示不是自动构建的。
2.下载镜像
从 docker 仓库将镜像下载到本地,命令格式如下
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output
#NAME: 是镜像名,一般的形式 仓库服务器:端口/项目名称/镜像名称
#:TAG: 即版本号,如果不指定:TAG,则下载最新版镜像 工作中指定版本号
docker pull nginx
3.查看镜像的信息
docker images
docker image inspect nginx #可以指定名字
docker image inspect 605c77e624dd #指定id
du /var/lib/docker/overlay2/
#此目录下有镜像文件了
4.镜像导出
利用docker save命令可以将从本地镜像导出为一个打包 tar文件,然后复制到其他服务器进行导入使用
格式:
docker save [OPTIONS] IMAGE [IMAGE...]
选项:
-o, --output string Write to a file, instead of STDOUT
常见用法:
docker save -o /path/file.tar IMAGE1 IMAGE2 ...
docker save IMAGE1 IMAGE2 ... > /path/file.tar
示例:
docker save alpine >/data/alpine.tar
docker save -o /data/alpine.tar #-o指定导出目录
5.删除镜像
格式:
docker rmi 镜像名称
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker image rm [OPTIONS] IMAGE [IMAGE...]
#选项:
-f, --force Force removal of the image
--no-prune Do not delete untagged p
docker images -q
列出系统中所有 Docker 镜像的 ID
docker rmi -f `docker images -q`
#删除所有镜像
示例:
docker rmi apline
6.恢复镜像
格式:
docker load -i 镜像源路径
示例:
docker load -i /data/alpine.tar
查看运行中的容器
docker ps -a
#查看运行中的容器
docker run -d httpd
#运行容器 如果没有会去官网下载后运行
#镜像相当于模板 容器相对于虚拟机
7.镜像打标签
docker tag
docker tag busybox 192.168.240.11/data/buysbox:v1.0
docker images
docker rmi 192.168.240.11/data/buysbox:v1.0
8.上传镜像
默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号,注册地址https://hub.docker.com。
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传
docker tag nginx:latest zxy/nginx:latest
docker images
docker login
#登录公共仓库
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/zxyjing/zxy:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/zxyjing/zxy:[镜像版本号]
#上传镜像
五.容器操作基础命令
1.启动容器
帮助:man docker-run
格式:
docker run [选项] [镜像名] [shell命令] [参数]
#选项:
-i, --interactive: 即使未连接到容器,也保持标准输入 (STDIN) 打开。通常与 -t 一起使用,以便进入容器的交互式会话。
-t, --tty: 分配一个伪终端 (pseudo-TTY),通常与 -i 一起使用,使得容器能够支持交互式 shell。
-d, --detach: 在后台运行容器,并打印容器的 ID。默认情况下,docker run 命令在前台运行。
--name string: 为容器指定一个名称,便于后续引用。
--hostname string: 设置容器的主机名。
--rm: 容器退出时自动删除容器。这在测试和一次性任务中非常有用。
-p, --publish list: 将容器的端口映射到主机上的指定端口。
-P, --publish-all: 将容器中所有暴露的端口映射到主机上的随机端口。
--dns list: 设置自定义的 DNS 服务器。
--entrypoint string: 覆盖镜像中的默认 ENTRYPOINT。
--restart policy: 设置容器的重启策略。
--privileged: 给予容器扩展的特权。
-e, --env=[]: 设置容器运行时的环境变量。
--env-file=[]: 从一个以行分隔的文件中读取环境变量。
1.1 后台启动容器
docker run -d httpd
直接运行会在后台执行
1.2 设置容器退出后启动规则
policy | 说明 |
---|---|
no | 默认选项,容器退出时不会自动重启 |
on-failure[:max-retries] | 只有在容器以非零退出状态退出时才重启。可选地,可以限制 Docker 守护进程尝试重新启动的次数。 |
always | 无论退出状态如何,都始终重新启动容器。当指定为 always 时,Docker 守护进程会尝试无限次重启容器。容器还会始终在守护进程启动时启动,无论容器当前状态如何。 |
unless-stopped | 无论退出状态如何,都始终重新启动容器,但如果容器在之前被停止过,则在守护进程启动时不会启动它。 |
示例:
docker run -d --restart always httpd
docker ps -a
docker stop 镜像版本号
停止命令 ,不会停止容器
docker rm -f 镜像版本号
会停止命令
1.3 启动容器执行一次性的命令
系统类的容器,启动后没有执行任何操作,不像 httpd nginx需要持续向外提供服务, 所以系统类的默认是一次性的容器启动就退出
docker run busybox echo "hello world"
docker ps -a
1.4 使用命令将系统类容器持续运行
-i 表示要和容器进行交换
-t 分配一个运行终端
[root@localhost ~]#docker run -it centos:7 bash
# 开启容器 并进入容器
[root@c90f690bd502 /]#
[root@c90f690bd502 /]# uname -r
3.10.0-693.el7.x86_64
[root@c90f690bd502 /]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@c90f690bd502 /]# touch a.txt
# 在容器中新建的文件, 存放在 宿主机中
#去宿主机上查找文件
cd /var/lib/docker
[root@localhost docker]#find -name a.txt
1.5 启动容器时指定名称
容器在启动的时候都会被分配到一个随机id和一个随机名字,也可以自定义设置名字
注意每个容器的名称要唯一
docker run --name a1 alpine
#指定容器的名字
1.6 设置容器内的名称
选项 :-h
docker run -it -h cxk centos:7 bash
1.7 测试容器,退出容器删除容器
选项: --rm
docker run --rm -it centos:7 bash
2.查看容器的状态
命令 | 作用 |
---|---|
docker ps | 查看容器的状态(看不到退出的,可以看到运行的) |
docker ps -a | 查看容器的状态 包括退出的 , 和运行的 |
docker ps -a -s | 查看容器的状态 -s 查看容器的大小 |
docker ps -l | 查看最近的一个容器状态 |
2.1 显示当前存在的容器
格式:
docker ps [OPTIONS]
docker container ls [OPTIONS]
选项:
-a, --all: 显示所有的容器,包括运行中的和已停止的。默认情况下,该命令只显示正在运行的容器。
-q, --quiet: 仅显示容器的数字 ID,而不显示完整的信息。
-s, --size: 显示每个容器的总文件大小。这会显示容器所占用的磁盘空间。
-f, --filter filter: 根据提供的条件对输出进行过滤。可以根据多个条件过滤容器,比如状态、标签、名称等。
-l, --latest: 显示最新创建的容器,包括所有状态的容器。
-n, --last int: 显示最近创建的 n 个容器,包括所有状态的容器。默认值是 -1,表示显示所有最近创建的容器。
(default -1)
示例:
显示容器
docker ps
显示容器包括退出状态的容器
docker ps -a
只显示退出状态
2.2 查看容器内的进程
语法:
docker top CONTAINER [ps OPTIONS]
示例:
[root@ubuntu2204 ~]#docker run -d --name h1 httpd
#启动一个容器, 取别名为 h1
[root@ubuntu2204 ~]#docker top h1
#查看 h1 容器中的进程状态
2.3 查看容器资源使用情况
格式:
docker stats [OPTIONS] [CONTAINER...]
Display a live stream of container(s) resource usage statistics
Options:
-a, --all: 默认情况下,docker stats 命令仅显示正在运行的容器的资源使用情况。使用 -a 或 --all 选项可以显示所有容器的资源使用情况,包括正在运行的和已停止的。
--format string: 使用指定的 Go 模板格式来美化输出。你可以定义自定义的输出格式,以满足特定需求。
--no-stream: 禁用实时流式输出(streaming stats),仅获取第一次的统计结果后停止。默认情况下,docker stats 命令会持续输出实时的容器资源使用情况。使用该选项可以在获取一次数据后停止实时输出。
--no-trunc: 禁止输出截断(truncation),即不缩短容器名称,而是显示完整的容器名称。默认情况下,docker stats 命令会缩短容器名称,以便在输出中节省空间。
示例:
docker ps -q
#查看 容器id
docker stats 镜像版本号
#动态查看容器中的状态
查看所有,并且只运行一次
docker stats --no-stream
2.4 查看容器的详细信息
docker inspect 可以查看docker各种对象的详细信息,包括:镜像,容器,网络等
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
-f, --format string
这个选项允许你指定一个格式化字符串模板(使用Go语言模板语法),用于定制输出的格式。通过这种方式,你可以选择性地获取你感兴趣的特定字段或属性,而不是默认的完整输出。例如,你可以只获取容器的名称、镜像名称、网络设置等特定信息,而不包括其他不必要的信息。
示例:
docker inspect -f '{{.Name}} - {{.State.Status}}' container_id
这个命令将输出指定容器的名称和状态,例如 "/mycontainer - running"。
-s, --size
当指定了 -s 选项时,在输出中会显示出容器或镜像所占用的总文件大小。这对于了解容器或镜像所占用的磁盘空间很有用。输出的大小单位为字节(bytes)。
示例:
docker inspect -s container_id
输出中会包含类似以下的信息:
"SizeRootFs": 12288,
"SizeRw": 4096
SizeRootFs 表示容器使用的根文件系统的大小,SizeRw 表示容器写入的文件系统的大小。
示例:查看容器
docker ps -q
docker inspect 镜像id
docker images
#查看镜像
docker inspect web1
#web1 为nginx标签
docker inspect -f "{{.NetworkSettings.IPAddress}}" web1
过滤出ipaddress
2.5 查看容器的资源情况
docker stats [OPTIONS] [CONTAINER...]
docker stats 选项 容器id,容器名字
Display a live stream of container(s) resource usage statistics
-a, --all: 默认情况下,docker stats 命令仅显示正在运行的容器的资源使用情况。通过使用 -a 或 --all 选项,可以显示所有容器的资源使用情况,包括正在运行的和已停止的容器。
--format string: 使用指定的 Go 模板格式来美化输出。你可以定义一个自定义的输出格式,以满足特定的显示需求。这使得你可以根据需要精确地控制输出的内容和格式。
--no-stream: 当使用该选项时,docker stats 命令将禁用实时流式输出。相反,它仅获取一次容器的统计数据并显示,然后立即停止。默认情况下,docker stats 会持续输出实时的容器资源使用情况。
--no-trunc: 默认情况下,docker stats 命令会缩短容器的名称,以便在输出中节省空间。使用 --no-trunc 选项可以禁止输出截断,这样会显示完整的容器名称,使得输出更加详细和全面。
示例:
--no-stream 一次性的不加该选项类似 top 会一直刷新
docker stats --no-stream web1
2.6 查看容器的日志
docker logs [OPTIONS] CONTAINER
选项:
--details:显示额外的日志细节信息,这些信息可能包括容器的元数据或其他相关信息。
-f, --follow:跟随日志输出,即实时查看容器的日志输出,类似于 tail -f 命令的功能。
--since string:显示自指定时间戳(例如 2013-01-02T13:23:37)或相对时间(例如 42m 表示42分钟前)之后的日志。
--tail string:从日志末尾显示指定行数的日志。默认是显示所有日志,但可以用此选项限制显示的行数。例如,--tail 100 表示显示最后的100行日志。
-t, --timestamps:显示日志条目的时间戳。这在需要查看每条日志的时间信息时很有用。
--until string:显示自指定时间戳(例如 2013-01-02T13:23:37)或相对时间(例如 42m 表示42分钟前)之前的日志。
docker logs -f 容器id
#实时追踪
3.删除容器
-f, --force: 强制删除正在运行的容器。默认情况下,如果尝试删除一个正在运行的容器,Docker 将会返回一个错误并拒绝删除。使用 -f 或 --force 选项会强制终止容器(使用 SIGKILL 信号)然后立即删除它。这种操作是不可逆的,可能会导致数据丢失或其他未预期的后果,因此在使用时需谨慎。
-v, --volumes: 删除与容器关联的挂载的数据卷(volumes)。默认情况下,docker rm 命令仅删除容器本身,而保留挂载的数据卷。使用 -v 或 --volumes 选项将一并删除与容器关联的所有数据卷。这对于确保清理整个容器及其关联资源非常有用。
--filter filter: 这个选项允许你提供过滤条件来限制命令的操作对象。例如,你可以使用 --filter 选项指定过滤条件来筛选出符合特定条件的容器或其他 Docker 对象。语法上,过滤条件通常是键值对的形式,比如 until=<timestamp> 表示筛选出在指定时间之前创建的对象。
4.进入容器
4.1attach
docker attach 容器名,attach 类似于vnc,操作会在同一个容器的多个会话界面同步显示,所有使用此方式进入容器的操作都是同步显示的,且使用exit退出后容器自动关闭,不推荐使用,需要进入到有shell环境的容器
#docker run -it centos
ctrl+p+q 退出
docker ps -q
docker attach 01873f53f5f7
exit
docker ps -q
4.2
在运行中的容器启动新进程,可以执行单次命令,以及进入容器测试环境使用此方式,使用exit退出,但容器还在运行,此为推荐方式
格式:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
常用选项:
-d, --detach 在后台模式下运行命令。
-e, --env list 设置环境变量。
-i, --interactive 即使未附加,也保持标准输入 (STDIN) 打开。
-t, --tty 分配一个伪终端 (pseudo-TTY),通常与 -i 一起使用,以支持交互式 shell。
#常见用法
docker exec -it 容器ID sh|bash
5.暴露容器的端口
5.1 暴露容器随机端口
容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从32768开始使用随机端口 时,当停止容器后再启动可能会导致端口发生变化
-P , --publish-all= true | false默认为false
#示例:
docker run -P nginx #映射容器所有暴露端口至随机本地端口
docker port 可以查看容器的端口映射关系
格式:
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
5.2 指定端口映射
docker run -p 可以将容器的预定义的指定端口映射到宿主机的相应端口
注意: 多个容器映射到宿主机的端口不能冲突,但容器内使用的端口可以相同
方式1: 容器80端口映射宿主机本地随机端口
docker run -p 80 --name web1 nginx
将容器的80 映射成随机端口
#docker port web1
#查看容器暴露的端口
容器80端口映射到宿主机本地端口8000
docker run -p 8000:80 --name web2 nginx
宿主机本地IP:宿主机本地端口:容器端口
docker run -p 10.0.0.100:82:80 --name web3 nginx
一次性映射多个端口+协议
docker run -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name web4 nginx
实战案例:
[root@ubuntu2204 ~]#docker run -d --name web1 -p 80:80 nginx
a28dca68a99de20aabc6a1df46e76127961894f288c1f2612d51532ee1e145ad
#将容器的80 和宿主机之间的80 做上对应关系
[root@ubuntu2204 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a28dca68a99d nginx "/docker-entrypoint.…" 29 seconds ago Up 28 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web1
停止docker程序
### 找到文件的容器的位置
[root@ubuntu2204 ~]#ls /var/lib/docker/containers/a28dca68a99de20aabc6a1df46e76127961894f288c1f2612d51532ee1e145ad
a28dca68a99de20aabc6a1df46e76127961894f288c1f2612d51532ee1e145ad-json.log config.v2.json hostname mounts resolv.conf.hash
checkpoints hostconfig.json hosts resolv.conf
[root@ubuntu2204 ~]#vim /var/lib/docker/containers/a28dca68a99de20aabc6a1df46e76127961894f288c1f2612d51532ee1e145ad/hostconfig.json
PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"80"}]}
#PortBindings后80/tcp对应的是容器内部的80端口,HostPort对应的是映射到宿主机的端口80 修改此处为8000
"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"8000"}]}
[root@ubuntu2204 ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a28dca68a99d nginx "/docker-entrypoint.…" 6 minutes ago Exited (0) 3 minutes ago web1
[root@ubuntu2204 ~]#docker start web1
web1
[root@ubuntu2204 ~]#docker port web1
80/tcp -> 0.0.0.0:8000
80/tcp -> [::]:8000
6.传递运行命令
容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构
建镜像的时候指定容器启动时运行的前台命令
容器里的PID为1的守护进程的实现方式
-
服务类: 如: Nginx,Tomcat,Apache ,但服务不能停
-
命令类: 如: tail -f /etc/hosts ,主要用于测试环境,注意: 不要tail -f <服务访问日志> 会产生不必要的磁盘IO
例子:运行系统类的容器时不可以持久, 会自动退出 如下
docker run -d alpine
docker ps -a
可以在运行时加入一些前台执行的命令,那么就可以持久执行
docker run -d alpine tail -f /etc/hosts
7. 容器内部的hosts文件
容器会自动将容器的ID加入自已的/etc/hosts文件中,并解析成容器的IP
例子: 一次性查看主机名
docker run --rm alpine cat /etc/hosts
进入到容器中 查看主机名
docker run -d alpine tail -f /etc/hosts
docker exec -it b7d459 sh
8.指定DNS
容器的dns服务器,默认采用宿主机的dns 地址,可以用下面方式指定其它的DNS地址
将dns地址配置在宿主机
-
在容器启动时加选项 --dns=x.x.x.x
-
在/etc/docker/daemon.json 文件中指定
示例:人为的修改 hosts 文件 --add-host 添加指定信息
docker run -it --rm --name a1 --add-host www.kgc.com:6.6.6.6 --add-host www.accp.com:9.9.9.9 alpine
例子: 容器的DNS默认从宿主机的DNS获取
docker exec web1 cat /etc/resolv.conf
docker run -it --rm --dns 1.1.1.1 --dns 2.2.2.2 centos bash
指定容器的dns
9.容器内和宿主机之间复制文件
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Options:
-a, --archive:
这个参数用于启用归档模式,它会将文件从源路径(SRC_PATH)复制到目标路径时尽可能地保持原有的所有属性信息。具体来说,它会递归地复制子目录和文件,并保持每个文件的权限、所有者、组和时间戳等信息。如果不使用 -a 参数,rsync 可能会只复制文件的内容,而不复制这些附加的元数据。
-L, --follow-link:
这个参数告诉 rsync 在遇到符号链接(symbolic link)时,总是跟随链接进行操作,即复制链接指向的目标文件或目录,而不是仅复制链接本身。默认情况下,rsync 可能会仅复制符号链接本身,而不跟随它们指向的实际文件或目录。
示例:
将容器中的文件拷贝到主机
docker run -itd centos:7 bash
docker ps -a
docker cp 1d6f8206baee:/etc/hosts /data/
将主机中的文件拷贝到容器
docker cp -a /etc/passwd 1d6f8206baee:/
docker exec -it 1d6f8206baee bash
10. 使用systemd 控制容器运行
cat /lib/systemd/system/hello.service
[Unit]
Description=Hello World
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox-hello
ExecStartPre=-/usr/bin/docker rm busybox-hello
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox-hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/docker kill busybox-hello
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now hello.service
11.容器传递参数
有些容器运行时,需要传递变量,可以使用 -e <参数> 或 --env-file <参数文件> 实现
范例: 传递变量创建MySQL
变量参考链接: https://hub.docker.com/_/mysql
[root@ubuntu2204 ~]#docker run -d --name m1 mysql:5.7.29
[root@ubuntu2204 ~]#docker run --name m2 mysql:5.7.29
docker run --name m1 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.29
# 运行容器, 添加属性
yum install mysql-client -y
#安装客户端工具
mysql -uroot -p123456 -h127.0.0.1
mysql> select user,host from mysql.user;
准备变量文件
[root@ubuntu2204 ~]#cat mysql/mysql-test.cnf
[mysqld]
server-id=100
log-bin=mysql-bin
[root@ubuntu1804 ~]#cat env.list
MYSQL_ROOT_PASSWORD=123123
MYSQL_DATABASE=wordpress
MYSQL_USER=wpuser
MYSQL_PASSWORD=wppass
docker run --name m2 --env-file=env.list -d -p 3307:3306 mysql:5.7.29
[root@ubuntu2204 ~]#mysql -uroot -p -h127.0.0.1 -P3307
[root@ubuntu2204 ~]#docker port m2
3306/tcp -> 0.0.0.0:3307
3306/tcp -> [::]:3307