一、Docker 简介
1、Docker是什么(what)
Docker是一个开源的应用容器引擎,它基于go语言开发,并遵从Apache2.0开源协议。使用Docker可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意的 Linux 机器上运行。Docker 的核心思想打包装箱,每个箱子是互相隔离的,互不影响。
Docker 镜像和容器是 Docker 技术的两个核心概念。
(1)镜像(Image):
Docker 镜像是一个只读的模板,用来创建 Docker 容器。它包括运行应用程序所需的所有文件和配置。你可以把它想象成一个类(Class),而容器则是基于这个类实例化出来的对象(Object)。
(2)容器(Container):
Docker 容器是镜像的运行实例,可以启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
2、为什么使用Docker(why)
-
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外的开销,Docker 对系统资源的利用率比虚拟机更高。无论是应用执行速度、内存损耗或者文件存储,都要比传统虚拟机技术更高效。 -
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要好几分钟, Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,可以达到秒级、甚至毫秒级的启动时间。大大的节约了项目部署的时间。 -
保证一致的项目运行环境
开发过程中一个非常常见的问题是本地环境、测试环境、生产环境不一致。经常能碰到开发、测试环境运行正常而到了生产环境出现莫名其秒的问题。而 Docker 的镜像提供了除内核外完整的项目运行环境,确保了应用运行环境一致性,从而避免了因为开发环境不一致造成的部署问题。 -
持续交付和部署
对开发和运维(DevOps)人员来说,最理想的就是一次创建或配置,可以在任意服务器上正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动化部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的在生产环境中部署该镜像。 -
更轻松的服务迁移
由于 Docker 确保了运行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易地将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。 -
更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大降低了应用服务的镜像制作成本。
3、如何使用Docker (how)
请参考 docker安装教程
二、Docker 基本命令
1、启动类
- 启动 docker
systemctl start docker
- 关闭 docker
systemctl stop docker
- 重新启动 docker
systemctl restart docker
- docker 设置自启动
systemctl enable docker
- 查看 docker 运行状态
systemctl status docker
- 查看 docker 版本号等信息
docker version
docker info
2、镜像类
-
查看镜像
docker images
-
搜索镜像
docker search [OPTIONS] 镜像名字
docker search mysql
-
拉取镜像
docker pull
docker pull mysql #没有制定版本则默认最新版
-
运行镜像
docker run
docker run mysql
运行镜像后可以按 ctrl+c 退出 -
删除镜像
docker rmi 镜像名/镜像ID #若镜像在运行则会报错
docker rmi -f 镜像名/镜像ID #强制删除一个
docker rmi -f mysql
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID #删除多个 其镜像ID或镜像用用空格隔开即可
docker rmi -f mysql redis
docker rmi -f $(docker images -aq) #删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
-
加载镜像
docker load -i 镜像保存文件位置
docker load myimage.tar
-
保存镜像
docker save 镜像名/镜像ID -o 镜像保存位置和名字
docker save tomcat -o /myimage.tar
3、容器类
- 列出正在运行的容器。
docker ps
- 进入容器
docker exec -it mysql /bin/bash
- 将 MySQL 容器中 MySQL 配置文件复制到宿主机的/home目录下。
docker cp mysql:/etc/mysql/mysql.cnf /home/
三、自定义docker镜像
参考 : Docker自定义java镜像
四、docker分组(仅了解)
Docker 组织通常涉及创建多个容器,这些容器作为一个单一的单元进行管理。这可以通过以下方式实现:
使用Docker Compose:Docker Compose 是一个用于定义和运行多容器Docker应用程序的工具。使用 docker-compose.yml 文件,您可以配置服务,网络和卷。
使用Docker Swarm:Docker Swarm 是 Docker 的本机群集提供程序,允许您将一个或多个 Docker 主机转变为虚拟机集群,并使用标准的 Docker API 命令管理应用程序。
使用Kubernetes:Kubernetes (k8s) 是一个开源的容器编排系统,用于自动化应用程序的部署,扩展和管理。
五、docker卷的使用(docker怎么磁盘映射)
挂载(bind mounts)和卷(volumes)
绑定挂载(bind mounts)和卷(volumes)是两个不同的名词。
二者本质上,并没有太多区别,都是将容器外的文件,挂载到容器内部。
卷的特殊之处在于,它受到 docker 的管理,可以把卷理解成:有文件管理系统的文件夹。
日常交流过程中,不必深究细节,确实非常混乱:有时候会把绑定挂载,叫做卷;也有可能会把卷称作挂载;甚至直接称之为映射……强调区别的时候,可以说 “挂载普通文件夹” 和 “挂载卷”。
映射
很多人会把 “挂载” 解释为 “映射”,这种说法不大对,在官网文档中,你甚至看不到 “映射” 这个词。
使用 “映射” 这个词,容易联想到数据备份,让人产生一个错觉:认为数据是从容器内部映射出来的,容器内部一份,卷里一份。
实际情况,数据就是直接存放在挂载的文件目录中,将宿主机的文件夹,挂载到容器内部,不会产生复数的文件。
容器产生 10G 的文件,占用的磁盘就是 10G,不存在映射这个过程,不会变成 20G。
“映射” 估计是日常交流产生的,是想表达的 “路径映射”: 就像是文件上传到服务器,会给你一个虚拟路径,虚拟路径不是磁盘路径,但是也能指向同一个文件。
1、什么是Docker容器映射
Docker容器的磁盘映射是指将宿主机(local machine)上的文件或目录与容器内部的文件或目录进行关联。这种关联可以让容器访问本地文件,或者在容器中写入数据时直接影响宿主机的文件,便于数据共享与持久化。
2、磁盘映射的基本命令
使用Docker的-v或–mount参数,可以实现磁盘映射。以下是两种常见的用法:
- 使用-v参数
docker run -d -v /path/on/host:/path/in/container image_name
这里,/path/on/host是宿主机的路径,/path/in/container是容器内部可访问的路径。
- 使用–mount参数
docker run -d --mount type=bind,source=/path/on/host,target=/path/in/container image_name
–mount的语法更加灵活,支持更多选项,但使用起来相对复杂。
示例:创建一个简单的Web服务器,将宿主机上的一个目录映射到Docker容器内。
步骤 1: 创建本地目录
mkdir /home/test_nginx_html/
echo "Hello, Docker" > /home/test_nginx_html/index.html
步骤 2: 创建Docker容器并映射目录
docker run -d -p 8080:80 -v /home/test_nginx_html:/usr/share/nginx/html nginx
在上面的命令中,我们使用Nginx作为Web服务器,并将宿主机的my_website目录映射到Nginx的默认网页目录。
http://47.93.156.25:8080/
六、底层
七、Docker 的弊端
1、安全性问题
尽管Docker提供了隔离环境,但它并不是完全安全的。容器与宿主机共享相同的内核,如果容器配置不当,可能会存在安全漏洞。
案例:在某互联网公司,由于Docker容器的权限配置过高,攻击者利用了容器逃逸的漏洞,访问了宿主机的文件系统,导致数据泄露。
2、性能开销
虽然Docker相比虚拟机更轻量,但运行大量容器时仍会产生一定的性能开销,尤其是在网络和存储IO方面。
案例:一家使用微服务架构的电商平台,在高峰期通过Docker运行数百个微服务实例,发现网络IO成为性能瓶颈,导致响应延迟增加。
3、管理复杂性
管理和维护大规模的Docker环境可能非常复杂,特别是涉及到网络配置、数据持久化和服务间依赖管理等方面。
案例:一个大型在线视频服务提供商,在将传统应用迁移到Docker时,面临了容器编排和服务发现的挑战,导致初始迁移过程复杂且耗时。
4、存储和数据持久化
Docker容器的无状态特性使得数据持久化成为一个挑战,尤其是对于数据库等需要持久存储的应用。
案例:一个金融科技公司在Docker容器中部署了数据库服务,由于未妥善处理数据卷的备份和恢复策略,导致重要数据在容器重启后丢失。
(虽使用了docker卷,但是)
5、容器镜像大小和优化
场景描述:容器镜像的大小直接影响部署的速度和效率。
案例:一家大型互联网公司发现,由于Docker镜像包含了大量不必要的文件和依赖,导致镜像过大,影响了部署速度和存储效率。他们不得不投入额外的努力来优化镜像,去除不必要的组件。