Docker是什么?
我们先给出Docker官网给出的定义来看下Docker是什么?
Docker加速你应用的构建,共享和运行。
怎么来加速的那?
- without tedious envionment configuration or management
不用进行哪些乏味的环境配置和管理。
怎么来理解?我觉得我们可以回想以下在没有Docker之前我们要部署我们自己的应用或者是在本地开发我们的应用是怎么来做的。
我们以本地开发为例来说明:比如你要开发一个订单服务,订单服务连接数据库MySQL8,Redis,ElasticSearch等等服务,你需要在你本地本地安装并启动这些服务,但是复杂的是你在本地搭建这些环境的时候可能会遇到各种问题并且你可能一点也不关注整个搭建过程,而只是想把它们启动起来而已。
那就用Docker呗,本地安装一个Docker引擎,然后安装一个Docker-compose,然后找根据项目的要求写一个Docker-comopose的yaml文件,使用docker-compose命令一键启动:
docker-compose.yaml
version: '3.8'
services:
# MySQL 服务定义
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 12345678
MYSQL_DATABASE: test
MYSQL_USER: myuser # 可选:创建一个用户
MYSQL_PASSWORD: mypassword # 可选:为新用户设置密码
ports:
- '3306:3306'
volumes:
- mysql_data:/var/lib/mysql
restart: always
command: --default-authentication-plugin=mysql_native_password
# Redis 服务定义
redis:
image: redis:latest
ports:
- '6379:6379'
volumes:
- redis_data:/data
restart: always
# Elasticsearch 服务定义
elasticsearch:
image: elasticsearch:7.10.0
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
ports:
- '9200:9200'
- '9300:9300'
volumes:
- es_data:/usr/share/elasticsearch/data
restart: always
volumes:
mysql_data:
redis_data:
es_data:
Docker-compose 一键启动所有依赖的服务:
docker-compose -f docker-compose.yaml up -d
这样还是挺香的。
构建(Build)
根据Docker官网对构建维度的解释,构建提供的加速主要由以下三个方面组成:
- 快速创建和启动新的环境
- 与现有开发的工具的集成
- 应用在各种环境中都是保持一致的
我们分别来解析一下这三个方面。
快速创建和启动新的环境
我们先来看在实际业务开发中我们应用对各种环境的需求。
第一个需求就是我们依赖的环境,各种数据库,缓存,搜索,其他业务服务和三方服务。
第二个需求就是我们应用自身需要提供多个环境来满足不同用户的需求,比如:你的应用可能有七八个环境:local(本地开发),dev(开发环境),sit(集成环境),uat(验收环境),staging(测试环境),perf(性能测试环境),pre-prod(准生产环境),prod(生产环境)。每个环境都有需要启动我们的依赖服务软件和自身。
那么使用docker可以很快的来搭建这些环境并且很快的启动这些环境的实例。
与现有开发的工具的集成
我觉得这个可以从以下几个方面来说:
- Docker本身: Docker适配了主流的操作系统:Windows,Linux和Unix(MacOS),这样你在哪个环境上都可以用
- 开发生态: 各种开发工具,版本控制工具等都集成了Docker。比如:IDEA,VSCode,Github等等。
应用在各种环境中都是保持一致的
这个维度Docker官网给出的说明是不管你是自建的机房还是使用云上的K8S,Docker提供的应用运行环境都是一致的。
这样你可以将自建的K8S迁移云上,或者把云上的K8S迁移到自建。
共享(Share)
共享也是见名知意,就是分享我们的应用。Docker以Docker 镜像(Image)的进行存储,并可以通过一些Docker Registry来分享Docker镜像。 比较常见的比如:DockerHub, Nexus,Artifactory等等。
接下来我们也根据官网提供的三个维度来阐述Docker的共享:
- 使用经过验证和值得信赖的内容
- 团队协作更方便
- 私有仓库提供了更好的安全性
安全的镜像
-
DockerHub提供了很多官方的镜像,这些镜像经过了大量的验证并且Docker团队会长期维护这些镜像,这样就确保了镜像的安全和可靠性,尤其是我们常用的哪些基础镜像
-
对于非官方镜像,Docker也会扫描和验证其他组织机构或者个人的镜像来保证镜像的安全。我们也不系统我们用一个带漏洞或者后门的镜像
团队协作
- DockerHub提供了一个镜像共享平台,我们可以很轻松的使用这些共享的镜像
- 我们可以直接拉去DockerHub的镜像来启动我们的环境和应用
- 我们也可以在DockerHub上发布自己的镜像供其他人下载和使用
私有仓库
我们自己业务系统的镜像由于公司策略和安全性合规等要求我们是不能发布我们自己的镜像到DockerHub的,所以我们需要搭建自己的私有仓库,这样我们自己的镜像就不会被公开而且更容易进行权限控制,确保了我们私有镜像的安全性。
运行(Run)
我个人觉得部署更轻松,DevOps或者运维人员感觉很快乐是Docker最重要的一个点。
- 不管你以前用的是CentOS,现在要切换到Ubuntu,你Docker run或者docker-compose up -d都可以一键启动
- 不管你是go,java,rust,python,php和你的代码工程有什么依赖,Dockerfile的FROM都可以解决
- CI/CD更加流畅
验证(Verify)
Docker团队会在软件安全性方面帮我们把一道关,当然我们公司也会进行二次安全检查。但是这点对于小公司或者没有能力进行二次检查的公司或者个人来讲就会特别重要,因为Docker团队已经进行了安全性把关。