Docker分享

一、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)

  1. 更高效的利用系统资源
    由于容器不需要进行硬件虚拟以及运行完整操作系统等额外的开销,Docker 对系统资源的利用率比虚拟机更高。无论是应用执行速度、内存损耗或者文件存储,都要比传统虚拟机技术更高效。

  2. 更快速的启动时间
    传统的虚拟机技术启动应用服务往往需要好几分钟, Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,可以达到秒级、甚至毫秒级的启动时间。大大的节约了项目部署的时间。

  3. 保证一致的项目运行环境
    开发过程中一个非常常见的问题是本地环境、测试环境、生产环境不一致。经常能碰到开发、测试环境运行正常而到了生产环境出现莫名其秒的问题。而 Docker 的镜像提供了除内核外完整的项目运行环境,确保了应用运行环境一致性,从而避免了因为开发环境不一致造成的部署问题。

  4. 持续交付和部署
    对开发和运维(DevOps)人员来说,最理想的就是一次创建或配置,可以在任意服务器上正常运行。
    使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动化部署。
    而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的在生产环境中部署该镜像。

  5. 更轻松的服务迁移
    由于 Docker 确保了运行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易地将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

  6. 更轻松的维护和扩展
    Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大降低了应用服务的镜像制作成本。

3、如何使用Docker (how)

请参考 docker安装教程

二、Docker 基本命令

1、启动类

  1. 启动 docker
    systemctl start docker
  2. 关闭 docker
    systemctl stop docker
  3. 重新启动 docker
    systemctl restart docker
  4. docker 设置自启动
    systemctl enable docker
  5. 查看 docker 运行状态
    systemctl status docker
  6. 查看 docker 版本号等信息
    docker version
    docker info

2、镜像类

  1. 查看镜像
    docker images

  2. 搜索镜像
    docker search [OPTIONS] 镜像名字
    docker search mysql

  3. 拉取镜像
    docker pull
    docker pull mysql #没有制定版本则默认最新版

  4. 运行镜像
    docker run
    docker run mysql
    运行镜像后可以按 ctrl+c 退出

  5. 删除镜像
    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

  6. 加载镜像
    docker load -i 镜像保存文件位置
    docker load myimage.tar

  7. 保存镜像
    docker save 镜像名/镜像ID -o 镜像保存位置和名字
    docker save tomcat -o /myimage.tar

3、容器类

  1. 列出正在运行的容器。
docker ps
  1. 进入容器
docker exec -it mysql /bin/bash
  1. 将 MySQL 容器中 MySQL 配置文件复制到宿主机的/home目录下。
docker cp mysql:/etc/mysql/mysql.cnf /home/

示例:docker启动mysql并配置字符集

三、自定义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参数,可以实现磁盘映射。以下是两种常见的用法:

  1. 使用-v参数
docker run -d -v /path/on/host:/path/in/container image_name

这里,/path/on/host是宿主机的路径,/path/in/container是容器内部可访问的路径。

  1. 使用–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镜像包含了大量不必要的文件和依赖,导致镜像过大,影响了部署速度和存储效率。他们不得不投入额外的努力来优化镜像,去除不必要的组件。

进阶内容(努力学习中…)

1、Docker Compose(批量管理容器)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值