第一章:Docker快速入门
Docker介绍
Docker 是一个开源的容器运行时软件(容器运行时是负责运行容器的软件),基于 Go 语言编写,并遵从 Apache2.0 协议开源。
Docker可以让开发者打包自己的应用以及依赖到一个轻量的容器中,然后发布到任何流行的Linux系统上(docker主要理念:一次封装随处运行)
Docker的思想来源于集装箱,让容器与容器之间相互隔离,与系统相互隔离提高程序之间的安全,更重要的是容器性能开销极低。
docker官网:www.docker.com
Docker组成部分
镜像(images):用来创建容器的模板文件,一个镜像可以创建多个容器(容器动态)
容器(container): 程序的载体,程序运行在容器中,每个容器相互隔离,互不影响,但可以相互通讯
仓库(Repository):集中存放镜像的场所,仓库分为公开仓库(public)和私有仓库(private)两种
- 最大的公开仓库为docker hub:https://hub.docker.com
- 国内的公开仓库包括:阿里、网易、中科大等
容器应用场景
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
- 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
- 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
- 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
Docker资源汇总
- Docker 官方主页: https://www.docker.com
- Docker 官方博客: https://blog.docker.com/
- Docker 官方文档: https://docs.docker.com/
- Docker Store(镜像文件库): https://store.docker.com
- Docker Cloud(云平台文档): https://cloud.docker.com
- Docker Hub: https://hub.docker.com
- Docker 的源代码仓库: https://github.com/moby/moby
- Docker 发布版本历史: https://docs.docker.com/release-notes/
- Docker 常见问题: https://docs.docker.com/engine/faq/
- Docker 远端应用 API: https://docs.docker.com/develop/sdk/
Kubernetes为什么放弃Docker
Kubernetes 是今天容器编排领域的执行标准(我说的算),而 Docker 从诞生之日到今天都在容器中扮演着举足轻重的地位,也都是 Kubernetes 中的默认容器运行时(容器运行时是负责运行容器的软件)
而在 2020 年 12 月,Kubernetes 社区决定着手移除仓库中 Dockershim 相关代码,这对于 Kubernetes 和 Docker 两个社区来说都意义重大。
我们可以使用 Kubernetes 管理 Docker 容器,但是可能没有听说过 Dockershim,即 Docker 垫片。
如上图所示,Kubernetes 中的节点代理 Kubelet 为了访问 Docker 提供的服务需要先经过社区维护的 Dockershim,Dockershim 会将请求转发给管理容器的 Docker 服务。
容器运行时接口(Container Runtime Interface、CRI)是 Kubernetes 在 1.5 中引入的新接口,Kubelet 可以通过这个新接口使用各种各样的容器运行时。
Docker 没有支持也不打算支持 Kubernetes 的 CRI 接口,这样我们就能猜测出 Kubernetes 社区从代码仓库移除 Dockershim 的原因。
你Docker当初火的时候,我为了妥协你,我在自己官方代码里增加一个Dockershim(垫片)来支持你Docker,但是今天我已经是容器编排领域的执行标准,而你不支持我的CRI接口(不给我面子)那我就不在需要你了!!!
kubernetes在1.20版本以后真正移除的是Docker的容器运行时,但是并没有移除Dockershim(垫片),但是在Kubernetes 1.24版本中,连Dockershim也彻底移除了,这也就代表着kubernets版本1.24以后彻底与Docker进行了剥离。
Kubernetes 支持使用的几种通用容器运行时软件:
- Podman
- containerd
- CRI-O
- Docker
还有必要学习Docker嘛?
- 从目前市场分析来看,Docker的市场占有率还是非常的高。
Docker版本介绍
Docker 从 1.17.03 版本之后分为:
- CE(Community Edition: 社区版) 功能有限,没有官方技术支持服务。
- EE(Enterprise Edition: 企业版)功能全面,提供官方技术支持服务。
官方安装文档:https://docs.docker.com/engine/installation/linux/centos/
环境规划
主机名称 | IP地址 | 操作系统 | 硬件配置 |
docker01 | 自定义 | CentOS 7.6 | 2C/4G |
二、Docker 安装步骤
安装docker软件包
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,方便您可以从仓库安装和更新 Docker:
使用以下命令来设置稳定的仓库(阿里仓库):
卸载Docker方式:删除安装包, 删除镜像、容器、配置文件内容
配置镜像加速器
默认情况下镜像从docker hub下载,由于docker hub服务器在国外,由于网络原因镜像下载速度较慢,一般会配置镜像加速器进行下载
国内镜像加速器有阿里云、网易云、腾讯云、中科大等,本实验配置阿里云镜像加速器,速度较快
阿里云镜像加速器地址:https://www.aliyun.com/
Docker命令介绍
查看docker可用命令:
Docker命令根据Docker官方案例分为以下几种:
- Docker环境信息: docker [info|version]
- 容器生命周期管理:docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]
- 容器操作命令: docker [ps|inspect|top|attach|wait|export|port|rename|stat]
- 镜像仓库命令: docker [login|pull|push|search]
- 本地镜像管理: docker [build|images|rmi|tag|save|import|load]
- 容器资源管理: docker [volume|network]
- 系统日志信息: docker [events|history|logs]
镜像常用管理命令
命令 | 作用 |
docker images | 列出本地镜像 |
docker search 镜像名 | 搜索镜像 |
docker pull 镜像名:版本 | 拉取镜像 |
docker rmi 镜像名:版本 | 删除镜像 |
列出本地镜像:docker images
常用选项:-q 只显示镜像ID
输出详情介绍:
REPOSITORY 镜像仓库源 TAG 镜像的标签 IMAGE ID 镜像的ID CREATED 镜像更新时间 SIZE 镜像大小
搜索镜像:docker search
常用选项:
- **--no-trunc :**显示完整的镜像描述
输出详情介绍:
NAME 镜像仓库源的名称 DESCRIPTION 镜像的描述 STARS 点赞数量,表示喜欢的意思 OFFICIAL 是否 docker 官方发布 AUTOMATED 自动构建(表示个人发布)
下载镜像:docker pull
提示:下载镜像如果不指定镜像版本则是最新版本,如需指定版本可从docker hub查看对应版本信息在进行下载
查看镜像:docker images
容器常用管理命令
命令 | 作用 |
docker ps | 查看正在运行容器 |
docker ps -a | 查看所有容器 |
docker run 参数 | 创建容器 |
docker exec 容器ID/容器名 | 进入容器 |
docker stop 容器名/容器ID | 停止容器 |
docker rm 容器名/容器ID | 删除容器 |
docker start 容器名/容器ID | 启动被停止的容器 |
docker restart 容器名/容器ID | 重启容器 |
docker kill 容器名/容器ID | 强制停止正在运行的容器(一般不用,除非卡了) |
docker inspect 容器名称 | 查看容器元数据信息 |
--restart=always | 启动容器时设置容器随机自启 |
docker update --restart=always 容器名/容器ID | 容器启动后设置容器随机自启 |
docker logs 容器名/容器ID | 查看容器日志信息 |
创建容器:docker run 选项...
常用选项:
- -id :创建容器并指定容器在后台运行
- **--name="名称" :**为容器指定一个名称
- **-p :**指定端口映射,格式为:宿主机端口:容器端口
- **--dns 8.8.8.8 :**指定容器使用的DNS服务器,默认和宿主一致
- **-h "名称" :**指定容器的hostname
- **-e username="ritchie" :**设置环境变量
- **-m :**设置容器使用内存最大值
- **--net="bridge" :**指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
- **--link=[] :**添加链接到另一个容器
- --expose=[]: 开放一个端口或一组端口
- **--volume , -v :**绑定一个数据卷
创建容器:docker run 参数
查看容器信息:
查看容器元数据信息
进入容器:docker exec -it 容器ID/容器名
停止容器:docker stop 容器名/容器ID
启动被停止的容器:docker start 容器名/容器ID
启动被停止的所有容器:ps -aq 获取所有容器ID
删除容器:docker rm 容器名/容器ID
常用选项: -f 强制删除(无需停止容器)
删除所有容器:ps -aq 获取所有容器ID
练习:通过Docker部署Nginx的web应用并实现浏览器访问:
创建容器并实现端口映射(默认容器无法被外网访问)
**-p :**指定端口映射,格式为:宿主机端口:容器端口
--restart=always #容器退出后,自动启动容器(一直)
浏览器访问:http://server_ip:port
三、Docker容器数据卷
数据卷概述
容器数据卷可以是宿主机中的一个目录或文件,通过将目录或文件挂载到容器中,可解决容器中的数据与宿主机之间立刻同步
数据卷可以间接的将外部主机文件传输到宿主机数据卷目录,可解决容器与外部主机之间文件交换的问题
一个数据卷目录可以同时挂载多个容器,解决多容器之间文件交换的问题
数据卷可以解决容器删除后容器数据丢失的问题,实现数据持久化
配置容器数据卷
- 在创建启动容器时,使用-v参数设置数据卷
- docker run 参数 -v 宿主机目录/文件:容器内目录/文件...
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
Docker部署MySQL
案例:在Docker容器中部署MySQL数据库,并通过外部MySQL客户端管理MySQL数据库。
步骤:
- 下载MySQL5.7镜像文件
- 准备所需的数据卷目录
- 拷贝容器中数据到宿主机数据卷目录
- 创建MySQL并挂载数据卷
下载MySQL镜像文件
创建数据卷目录
创建容器拷贝配置文件目录到/docker_mysql目录
- 格式1:docker cp 容器名:目录/文件 宿主机目录 #将容器中文件或目录拷贝到宿主机
- 格式2:docker cp 宿主机目录/文件 容器名:目录 #将宿主机文件/目录拷贝到容器中
删除MySQL容器
创建MySQL容器并挂载数据卷
进入数据库授权远程连接用户访问
Docker部署Nginx
案例:在Docker容器中部署Nginx的web服务,并通过外部浏览器访问Nginx。
下载Nginx镜像
创建数据卷目录
创建容器拷贝配置文件目录到/docker_nginx目录
删除nginx容器
创建nginx容器并挂载数据卷
浏览器访问容器Nginx服务:http://server_ip
Docker部署tomcat
案例:在Docker容器中部署tomcat,并通过外部浏览器访问tomcat。
下载tomcat镜像文件
创建数据卷目录
拷贝容器数据
创建容器挂载数据卷
浏览器访问容器tomcat服务:http://server_ip:8080