为什么要使用容器
扩容/缩容不及时
- 对于可提前预知的业务高峰,传统的扩容手段很繁琐。
- 对于不可预知的突发流量,传统手段无法及时动态扩容。
服务器环境臃肿
- 某些服务器上可能跑多个应用,对维护、迁移带来困难。
新项目上线资源分配痛点
- 现在很多项目都是基于分布式架构的,一上来就需要几十台服务器。
- 开发人员开发项目,打包项目环境代码成镜像部署到容器平台。
- 好处: 1、运维人员节省人工成本 2、持续发布有问题更快解决。
资源利用率低
- 容器也是一种虚拟化技术,可以提高服务器的资源使用率。
环境不一致性
- 测试环境和生产环境都是使用窗口技术,更好的避免了传统架构测试环境和生产环境不致产生的问题。
容器 vs 虚拟机
容器:
1、容器提供一个基本的独立环境,实现容器隔离、资源限制。
2、主要解决应用层面问题,应用快速部署、高效管理。
虚拟机:
1、提升服务器资源利用率。
2、提供一个完全隔离的环境。
docker 概述
- 使用最广泛的开源容器引擎
- 一种操作系统级的虚拟化技术
- 依赖于Linux内核特性: Namespace(资源隔离)和Cgroups(资源限制)
- 提供简单的应用程序打包工具
- 多环境保持一致性
- 开发人员和运维人员职责逻辑分离
对于传统部署,如果分工比较明确,通常做法是:
- 由开发人员开发代码,经测试人员测试,最后由开发人员将最终的代码上传至代码仓库。
- 运维人员直接通过代码仓库进行在线打包或者从代码库下载下来后进行打包,再进行生产发布。
- 如果有代码上的问题,原则上是由开发人员进行修改,然后由运维人员进行发布。
引入容器后:
- 由开发人员开发代码,经测试后,由开发人员打包成镜像,部署到容器平台。
- 业务运维人员不再负责版本发布等工作,主要专注于处理系统业务上的问题。
- 平台运维人员则关注于怎么高效去管理这些容器。如此可以节省运维成本,问题也能得到更快解决。
Docker应用场景
- 应用程序打包和发布
- 应用程序隔离
- 持续集成
- 部署微服务
- 快速搭建测试环境
- 提供PaaS产品(平台即服务)
docker的组成
客户端即在linux命令行执行的docker命令。
容器需要镜像才能拉起来。
docker 安装
官方网址:https://docs.docker.com/engine/install/
官网上提供了多个Linux发行版本的安装方法以及二进制包的安装方法。
安装前先关闭 SELinux 和防火墙。
此外,旧版本包名曾为 docker 或者 docker-engine,这些都太老了,先卸载它们。
这儿以 CentOS 上安装 docker 为例。
官方源:https://download.docker.com/linux/centos/docker-ce.repo
阿里源: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker:
# yum install docker-ce [docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin]
# systemctl enable docker
# systemctl start docker
检查 docker deamon 是否运行:
# ps aux | grep docker
root 1259 0.2 5.2 1038584 52448 ? Ssl 00:54 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
查看 docker 版本:
[root@demo1 ~]# docker info
Client: Docker Engine - Community
Version: 24.0.2
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.10.5
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.18.1
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 24.0.2
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 3dce8eb055cbb6872793272b4f20ed16117344f8
runc version: v1.1.7-0-g860f061
init version: de40ad0
Security Options:
seccomp
Profile: builtin
Kernel Version: 3.10.0-1062.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 972.4MiB
Name: demo1
ID: e7c53d86-7253-4660-b1cc-dbf486e6ccf8
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false