Docker 基础篇
时间:2022-10-18 01:00:00
1 Docker特点
-
Build, Ship and Run(施工、运输、运行)
-
Build?once,Run?anywhere(一次建造,到处运行)
-
解决了运行环境及配置问题的软件容器,容器虚拟化技术方便持续集成,有助于整体发布
2 容器部署发展简史
应用部署互联网企业生产环境的过程大致可分为三个阶段:
- 物理机部署
- 虚拟机部署
- 容器化部署
2.1 物理机部署
2.1.1 特点
部署多个应用程序的服务器。
2.1.2 痛点
资源共享问题:进程间资源抢占。如果一个过程消耗了100%CPU资源,其他流程无法提供服务。或者一个过程生成的日志填满磁盘,所有的过程都会挂断。
2.1.3 解决方式
硬件资源在进程间隔离。
2.2 虚拟机部署
2.2.1 特点
虚拟机通过硬件虚拟化,即每台虚拟机提前从物理机分配cpu核数,内存, 磁盘,每台虚拟机一般只部署一个应用程序。从而解决了过程中资源隔离的问题。
2.2.2 痛点
在集群部署的情况下,软件的版本和配置文件容易碎片化:第一次安装应用集群虚拟机时,由于操作系统的镜像相同,软件版本和库依赖性一开始是统一的。但随着时间的推移,开源软件(tomcat, jdk, nginx)需要逐步升级,运维学生开始批量升级集群的软件版本,可能会有遗漏或升级失败。同时,一些开发学生会登录机器修改软件的版本或配置,以满足自己的需要。长此以往,一个应用集群的虚拟机的软件版本和配置逐渐碎片化。当网上出现问题,需要查到基础软件层面时,由于软件版本的碎片化,会使调查变得非常困难。
2.2.3 解决方式
容器技术
2.3 容器化部署
2.3.1 特点
容器技术不限于docker,但是docker目前这里最受欢迎docker为例。docker镜像文件是容器技术的核心之一。
2.3.2 镜像文件
镜像文件:流行的理解是一个集装箱,在过程运行过程中依赖于软件文件。
使用镜像文件:每台机器在应用集群部署时,首先会拉取指定版本的镜像文件。镜像安装后产生docker容器。容器的软件版本与所有机器的镜像文件相同。即使容器的软件版本在开发或运维过程中被修改,软件的变化也会随着容器的销毁而消灭。当应用程序重新部署现有的镜像文件时,生成docker容器与修改前的容器完全相同。如果容器需要升级软件版本,请修改镜像文件。这样,集群中的所有机器在部署时都会重新拉出新的镜像,软件也会一起升级。软件版混乱的问题,到docker在这里,得到了完美的解决。
2.3.3 一个小问题
- 有了容器技术,为什么生产环境需要部署虚拟机?
由于虚拟功能实现了硬件资源的完全隔离,docker不行。
2.3.4 小总结
-
传统的虚拟机技术是在虚拟出一套硬件后,在其上运行完整的操作系统,然后在系统上运行所需的应用程序;
-
容器中的应用过程直接运行在宿主的核心,没有自己的核心或硬件虚拟。因此,它比传统的虚拟机更轻,启动更快;
-
每个容器之间相互隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
3 Docker官网
- Docker官网:https://www.docker.com
- Docker Hub官网(安装docker镜像仓库):https://hub.docker.com
4 Docker的基本组成
4.1 镜像(image)
-
docker镜像(image)只读模板,镜像可以用来创建docker一个镜像可以创建许多容器。
-
相当于容器的源代码,docker类似于镜像文件Java类模板,而docker类似于容器实例java中new出来的实例对象。
4.2 容器(container)
4.2.1 从面向对象的角度理解
docker利用容器(container)一个或一组独立运行的应用程序或服务在容器中运行,容器类似于虚拟运行环境,容器是由镜像创建的运行实例。
镜像是静态定义,容器是镜像运行时的实体。
该容器为镜像提供了一个标准和隔离的操作环境,可以启动、停止和删除。每个容器都是一个相互隔离的平台,以确保安全。
4.2.2 从镜像容器的角度理解
容器可以看作是一个简单的版本Linux环境(包括root用户权限、流程空间、用户空间、用户空间和网络空间等。
4.3 仓库(repository)
- 仓库是集中存储镜像文件的地方。类似于存储jar包的maven仓库、存放git项目的github等等。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库也是docker公司提供的官方仓库:Docker Hub,阿里云等国内公开仓库。
5 Docker安装
5.1 注意事项
- docker它不是一个通用的容器工具,它依赖于现有和运行Linux内核环境。
docker本质上,它已经运行了Linux它创造了一个隔离的文件环境,所以它的执行效率几乎相当于部署Linux主机。
因此,docker必须部署在Linux如果其他系统想部署内核系统,docker虚拟必须安装Linux环境。
注:docker在Windows上依赖WSL(可以理解为一个Windows专用的Linux虚拟机)
5.2 前提条件
- 目前,CentOS只支持发行版内核支持docker。
操作系统要求:
1、CentOS 7或更高版本(不支持存档或测试版本)
2、必须启用CentOS Extras存储库。默认情况下,此存储库已启用,但如果已禁用,则需要 重新启用它。
建议使用存储驱动程序:overlay2
5.3 安装步骤
- CentOS安装Docker官方文件:引擎:https://docs.docker.com/engine/install/centos
5.3.1 查看操作系统版本
- 查看操作系统版本,确定是CentOS 7或更高版本
# 查看CentOS的操作系统版本
# CentOS Linux release 7.9.2009 (Core)
cat /etc/redhat-release
5.3.2 卸载旧版本
- 如果安装了旧版本,先卸载它们以及关联的依赖项
旧版本的引擎包或依赖项:
docker
、docker-engine
新版本的引擎包:
docker-ce
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 上述操作只会删除docker本身,旧版本保存在
/var/lib/docker/
的内容,包括镜像、容器、卷和网络等会被保留。
5.3.3 安装GCC编译器相关
sudo yum -y install gcc
sudo yum -y install gcc-c++
5.3.4 设置stable镜像仓库
# 配置yum资源库
# 安装yum-config-manager
# yum-util提供yum-config-manager功能
sudo yum install -y yum-utils
# 在yum资源库中添加docker资源库
# 官方地址(镜像在国外,下载比较慢,不推荐)
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 阿里云镜像(推荐)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.3.5 更新yum软件包索引
# 重建软件包索引,建立缓存(可选操作,建议运行,据说后续安装会快一些)
yum makecache fast
5.3.6 安装Docker引擎
- 默认安装最新版本
# docker-ce是Docker引擎,docker-ce-cli是客户端
# 默认安装的docker引擎、客户端都是最新版本
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 安装指定版本
# 在存储库中列出可用版本,然后选择安装
yum list docker-ce --showduplicates | sort -r
# 如下图,安装指定版本3:20.10.7-3.el7
# sudo yum install docker-ce- docker-ce-cli- containerd.io docker-compose-plugin
# VERSION_STRING:版本号,可用版本列表的第二列
sudo yum install docker-ce-17.09.0.ce docker-ce-cli-17.09.0.ce containerd.io docker-compose-plugin
5.3.7 启动Docker引擎
sudo systemctl start docker
# 启动后查看docker版本,可以看到Server: Docker Engine - Community(Docker守护进程)的版本号
docker version
5.3.8 运行hello-world测试
# 下载镜像hello-world:容器运行时,它会打印Hello from Docker!并退出
sudo docker run hello-world
5.3.9 卸载Docker步骤
1、关闭服务
systemctl stop docker
2、使用yum删除docker引擎
# 卸载 Docker 引擎、CLI、Containerd 和 Docker Compose 包
sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
3、删除镜像、容器、卷、自定义配置等文件
# 手动删除删除镜像、容器、卷、自定义配置等文件
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
6 配置镜像加速器(以阿里云为例)
6.1 镜像加速器的概念
由于docker的镜像需要从仓库拉取,这个仓库(dockerHub)在国内下载很慢,所以阿里云做了一个镜像加速功能,相当于把dockerHub的仓库拷贝了一份到国内,让国内用户方便下载。
6.2 配置步骤
- 登录阿里云,进入
控制台
->容器镜像服务
->镜像工具
->镜像加速器
- 里面提供了一个加速器地址:
https://xxxxxxxx.mirror.aliyuncs.com
- 将该地址配置到docker中:
# 通过修改daemon配置文件 /etc/docker/daemon.json 来使用加速器(初次使用是没有该文件的,直接新建文件即可)
vi /etc/docker/daemon.json
# daemon.json 文件内容
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
- 重载 daemon 程序刷新配置,重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
7 docker run的过程
8 为什么Docker会比VM虚拟机快
8.1 docker有着比虚拟机更少的抽象层
由于docker不需要实现硬件资源虚拟化,运行在docker容器上的程序都是直接使用实际物理机的硬件资源。因此在CPU、内存利用率上docker的效率有明显优势。
8.2 docker利用的是宿主机的内核,而不需要加载操作系统内核
当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。避免了引导、寻址、加载操作系统等比较费时费资源的过程。
当新建一个虚拟机时,虚拟机软件需要加载OS,这个过程耗时是分钟级的;而docker由于直接利用宿主机的操作系统,新建一个docker容器耗时只需几秒钟。
8.3 虚拟机与Docker容器对比
Docker容器 | 虚拟机(VM) | |
---|---|---|
操作系统 | 与宿主机共享OS | 宿主机OS上运行虚拟机OS |
存储大小 | 镜像小,便于存储和传输 | 镜像庞大 |
运行性能 | 几乎无额外性能损失 | 操作系统额外的CPU、内存消耗 |
移植性 | 轻便、灵活,适应于Linux | 笨重,与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
部署速度 | 快速,秒级 | 较慢,10s以上 |
9 Docker常用命令
9.1 Docker命令图
9.2 帮助、启动类命令
# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 设置开机启动
systemctl enable docker
# 查看docker版本信息
docker version
# 查看docker概要信息
docker info
# 查看docker总体帮助文档
docker --help
# 查看docker命令帮助文档
# 例:docker run --help
docker [COMMAND] --help
9.3 镜像命令
9.3.1 查看本地镜像列表
# 查看本地镜像列表 docker images # 列出本地镜像中 REPOSITORY 为 ubuntu 的镜像列表 docker images ubuntu # 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层) docker images -a # 只显示镜像ID docker images -q # 显示完整的镜像描述 docker images --no-trunc # 同一仓库源可以有多个 TAG 版本,我们使用 REPOSITORY:TAG 来定义不同的镜像 # 如果不指定镜像的版本
标签,默认使用最新版本。例如使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像
- 列说明
列 | 列说明 |
---|---|
REPOSITORY | 镜像的仓库源 |
TAG | 镜像的版本标签 |
IMAGE ID | 镜像ID |
CREATED | 镜像创建时间 |
SIZE | 镜像大小 |
9.3.2 查找镜像
# 查找所有包含 ubuntu 的镜像
docker search ubuntu
# 查找所有包含 ubuntu,且 stars 大于10的镜像
docker search -f stars=10 ubuntu
# 只列出前5个镜像
docker search --limit 5 ubuntu
- 列说明
列 | 列说明 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 镜像描述 |
OFFICIAL | 是否 docker 官方发布 |
STARS | 点赞数 |
AUTOMATED | 是否是自动构建的 |
9.3.3 拉取镜像
# docker pull 镜像名称[:tag]
# 不加tag时,默认下载最新的镜像(即tag为latest)
docker pull ubuntu
9.3.4 删除镜像
# docker rmi 镜像名称
docker rmi ubuntu
# docker rmi (IMAGE ID)
docker rmi ba6acccedd29
# 删除多个镜像,使用空格分隔:docker rmi 镜像1 镜像2 镜像3
docker rmi ubuntu redis
# 强制删除镜像(如果没有删除对应的容器,删除镜像会报错,此时是可以使用-f强制删除的)
docker rmi -f ubuntu
# 删除全部镜像
docker rmi -f $(docker images -qa)
9.3.5 虚悬镜像
- 概念:仓库名、标签都是
的镜像,俗称虚悬镜像(dangling image) - 产生原因:这些镜像原本是有镜像名和标签的,随着镜像的维护,发布了新镜像后,由于新旧镜像同名(仓库名、标签均相同),旧镜像名称被取消,从而出现仓库名、标签均为的镜像。这类无标签镜像被称为虚悬镜像
# 查看所有的虚悬镜像
docker images -f dangling=true
# 一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的
# 删除虚悬镜像
docker rmi $(docker images -q -f dangling=true)
9.4 容器命令
9.4.1 新建启动容器
# 新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
启动交互式容器
# 前台交互式启动
# 使用 ubuntu 镜像以交互模式启动一个容器。在容器内执行 /bin/bash(或者bash) 命令
docker run --it ubuntu /bin/bash
docker run --it ubuntu bash
- 退出交互模式
方式一:在交互shell中输入 exit 即可退回宿主机(这种方式退出后,容器会停止运行)
方式二:使用快捷键 CTRL + P + Q (这种方式退出后容器仍然在运行)
启动守护式容器
# 后台守护式启动
# 大部分情况下,我们的docker服务是在后台运行的,可以通过 -d 指定容器的后台运行模式
# docker run -d 容器ID或容器名称
docker run -d redis
# docker容器后台运行,必须有一个前台进程,这个是docker的机制
# 容器运行的命令如果不是那些一直挂起的命令(如:top、tail等),这样的容器在后台启动后会立即自杀(因为它觉得没事可做了),例如:
docker run -d ubuntu
- OPTIONS说明
--name:为容器指定一个名称(不指定的话系统会随机生成一个名称)
-d:后台运行容器并返回容器ID,也即启动守护式容器
-i:以交互模式(interactive)运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端(tty),通常与-i同时使用。也即启动交互式容器(前台有伪终端,等待交互)
-e:为容器添加环境变量
-P:随机端口映射。将容器内暴露的所有端口映射到宿主机随机端口
-p:指定端口映射
-p
参数说明
参数 | 说明 | 举例 |
---|---|---|
-p hostPort:containerPort | 端口映射 | -p 8080:80 |
-p ip:hostPort:containerPort | 配置监听地址 | -p 192.0.0.1:8080:80 |
-p ip::containerPort | 随机分配端口 | -p 192.0.0.1::80 |
-p hostPort1:containerPort1 -p hostPort2:containerPort2 | 指定多个端口映射 | -p 6379:6379 -p 3306:3306 |
9.4.2 列出正在运行的容器
# docker ps [OPTIONS]
# 列出当前所有正在运行的容器
docker ps
# 列出当前所有正在运行的容器+历史上运行过的容器
docker ps -a
# 列出当前所有正在运行的容器+历史上运行过的容器的前2条记录
docker ps -n 2
# 列出当前所有正在运行的容器的容器编号
docker ps -q
- OPTIONS说明
-a:列出当前所有正在运行的容器+历史上运行过的容器
-l:显示最新创建的容器
-n (num):显示最近创建的前num个容器
-q:只显示容器编号
9.4.3 容器其他启动停止命令
# 启动已经停止的容器
# docker start 容器ID或容器名称
docker start 9e7190eae5bd
# 重启容器
# docker restart 容器ID或容器名称
docker restart redis
# 停止容器
# docker stop 容器ID或容器名称
docker stop 9e7190eae5bd
# 强制停止容器
# docker kill 容器ID或容器名称
docker kill 9e7190eae5bd
# 删除已停止的容器
# docker rm 容器ID或容器名称
docker rm 9e7190eae5bd
# 强制删除正在运行的容器
# docker rm -f 容器ID或容器名称
docker rm -f 9e7190eae5bd
# 一次删除所有容器实例(谨慎操作)
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm -f
9.4.4 查看容器日志
# docker logs [OPTIONS] 容器ID或容器名称
docker logs 9e7190eae5bd
# 跟踪日志输出
docker logs -f 9e7190eae5bd
# 跟踪日志输出(带时间戳)
docker logs -tf 9e7190eae5bd
# 显示最后5行日志
docker logs -n 5 9e7190eae5bd
docker logs --tail 5 9e7190eae5bd
# 例
# 新建容器并以后台方式启动,执行每5秒打印日志的命令
# 注:sh -c 命令,它可以让 bash 将一个字串作为完整的命令来执行
docker run -d ubuntu /bin/sh -c "while true;do echo hi;sleep 5;done"
# 跟踪日志输出(-f和-tf的区别)
docker logs -f --tail 5 cd0a7ba8d0b5
docker logs -tf --tail 5 cd0a7ba8d0b5
9.4.5 查看容器内运行的进程
# docker top 容器ID或容器名称
docker top 9e7190eae5bd
9.4.6 查看容器内部细节(元数据)
# docker inspect 容器ID或容器名称
docker inspect 9e7190eae5bd
9.4.7 进入正在运行的容器并以命令行交互
# 第一种方式
# docker exec -it 容器ID bashShell
docker exec -it e863a5ed312a /bin/bash
# 第二种方式
# docker attach 容器ID
# 如果有多个终端,都对同一个容器执行了 docker attach,就会出现类似投屏显示的效果。一个终端中输入输出的内容,在其他终端上也会同步的显示
docker attach e863a5ed312a
- 上述两种方式的区别
exec 是在容器中打开新的终端,并且可以启动新的进程,此时用 exit 退出,不会导致容器的停止。
attach 直接进入容器启动命令的终端,不会启动新的进程,此时用 exit 退出,会导致容器的停止。
- 推荐使用 docker exec 命令,因为退出容器终端,不会导致容器的停止
以redis为例(进入 redis 服务)
- 一般先用
-d
后台启动程序,再用exec
进入对应容器实例
# 方式一
# 先进入容器交互 shell
docker exec -it 7bba30997546 /bin/bash
# 再运行 redis-cli 进入 redis 服务
redis-cli
# 方式二
# 直接以命令 redis-cli 进入 redis 服务
docker exec -it 7bba30997546 redis-cli
9.4.8 容器与宿主机的文件拷贝
容器文件拷贝到宿主机
# docker cp 容器ID:容器内路径 宿主机路径
docker cp 7d13af0831da:/tmp/test.txt /root/test/
宿主机文件拷贝到容器
# docker cp 宿主机路径 容器ID:容器内路径
docker cp /root/test/test2.txt 7d13af0831da:/tmp/
9.4.9 导入和导出容器
export:导出容器的内容流作为一个tar归档文件(对应 import 命令)
import:从tar归档文件中创建一个新的文件系统再导入为镜像(对应 export 命令)
# 导出
# docker export 容器ID > 文件名.tar
docker export 7d13af0831da > test3.tar
# 导入
# cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
cat test3.tar | docker import - zhoulx/test3:1.0.1
9.5 Docker 磁盘空间相关命令
9.5.1 查看镜像、容器、数据卷所占空间
# 查看镜像(Images)、容器(Containers)、本地数据卷(Local Volumes)的空间占用情况
docker system df
# 通过-v参数进一步查看空间占用细节
docker system df -v
- 列说明
列 | 列说明 |
---|---|
TYPE | Images - 镜像 Containers - 容器 Local Volumes - 本地数据卷 |
TOTAL | 总数 |
ACTIVE | Images - 存在对应容器实例的镜像数量 Containers - 活跃的容器数量 Local Volumes - 被容器关联引用的卷的数量 |
SIZE | 占用空间大小 |
RECLAIMABLE | 可清理的空间 |
- Image space usage 列说明
列 | 列说明 |
---|---|
SHARED SIZE | 指的是当前镜像与另一个镜像的共享空间大小(例如图中的 myubuntu 是在 ubuntu 镜像基础上制作的,他们的共享数据就是 ubuntu 镜像的大小) |
UNIQUE SIZE | 仅由当前镜像使用的空间大小 |
CONTAINERS | 当前镜像对应容器实例的数量 |
- Local Volumes space usage 列说明
列 | 列说明 |
---|---|
LINKS | 关联引用该卷的容器数量 |
9.5.2 清理磁盘空间
自动清理
# 清理磁盘,删除关闭的容器、无用的网络,以及虚悬镜像
docker system prune
# 更彻底地清理磁盘,会将没有容器使用的Docker镜像也一起删掉
docker system prune -a
# 忽略告警询问,直接删除
docker system prune -f
手动清理
- 镜像清理
# 删除所有虚悬镜像,不会删除未使用的镜像
docker rmi $(docker images -q -f dangling=true)
# 删除所有未使用镜像
# 该命令轮询到在使用的镜像时,会有"container xxxx is using its referenced image xxxx"的报错信息,所以不会被删除
docker rmi $(docker images -q)
- 容器清理
# 对于已停止或其它异常状态的容器,可以结合 -f 或 --filter 筛选器来处理
# rm -v 删除与该容器关联的匿名卷
# 删除所有已退出的容器
docker rm -v $(docker ps -aq -f status=exited)
# 删除所有状态为 dead 的容器
docker rm -v $(docker ps -aq -f status=dead)
- 卷清理
# 删除所有未使用的本地卷 docker volume prune # 删除所有未被任何容器关联引用的卷 docker volume rm $(docker volume ls -qf 元器件数据手册
、IC替代型号,打造电子元器件IC百科大全!