Docker入门知识
一、Docker基础概念
1. 使用容器的原因
-
上线流程繁琐,环节过多。
-
资源利用率低,服务器利用率低,浪费核资源。
-
扩容/缩容不及时,业务高峰期扩容流程繁琐。
-
服务器环境臃肿,维护、迁移困难。
-
环境不一致。
ps: 1. 服务器的使用率一般要高于实际业务占用率的30%。 2. 服务器需要一个弹性伸缩空间。
2. Docker是什么
-
Docker是当前使用最广泛的开源容器引擎,是一种操作系统级的虚拟化技术,依赖于Linux内核的特性,资源隔离(Nmaespace)和资源限制(Cgroups)。
-
是一个简单的应用程序打包工具。
-
可以使多个环境保持一致性。
-
使开发人员和运维人员各司其职。
ps: 1. 开发人员,开发项目、打包项目环境、代码成镜像、部署到容器平台。 2. 运维人员,高效管理容器群。
3. Docker的应用场景.
- 应用程序打包和发布
- 应用程序的隔离
- 持续继承(Docker和K8s实现DevOps)
- 部署微服务
- 快速搭建测试环境
- 提供PaaS产品(平台即服务)
4. Docker的基本组成
Docker有三部分组成:客户端、守护进程、镜像仓库
5. 容器Container和虚拟机VM的区别
虚拟机里面运行的应用程序,每一个都依赖于一个单独建立的子操作系统,具有良好的操作化界面,提供一个完全隔离的环境,提升服务器资源利用率。
容器并不单独建立子操作系统,无操作化界面,仅提供一个基本的独立环境,实现容器隔离、资源限制。主要解决应用层面问题,应用快速部署、高效管理
分类 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生 | 5%左右损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级 | 系统级(更彻底) |
操作系统 | 主要支持Linux | 几乎所有类型的操作系统 |
封装程度 | 只打包 项目代码和依赖关系,共享 | 完整的操作系统 |
5. ubuntu安装Docker
安装依赖包: yum install -y yum-utils
安装DockerCE: yum install -y docker-ce
启动Docker服务: systemctl start docker
重启Docker服务: systemctl restart docker
查看安装的Docker信息: docker info
开机自动启动Docker: systemctl enable docker
二、Docker的镜像管理
1. 镜像的定义
镜像是一个分层存储的文件,是一个软件的环境;一个镜像可以创建N个容器;是一种标准化的交付物;是一个不包含Linux内核而又精简的操作系统。
样例: docker run -d -p 8080:80 nginx
:1.17
- “nginx”即指定的镜像,如果没有输入版本Tag则默认latest版本
- 拉取镜像时,会分层下载
- 完成后可以使用
docker ps
查看下载并运行的容器。docker ps -l
命令可以查看最新的运行的容器。
- 完成后可以使用
docker images
查看下载的镜像。 - 访问 http://localhost:8080查看安装的nginx
- 使用
docker logs 71f4031aea56
查看日志信息(71f4031aea56为ps里面的容器ID)
Docker官方自带的仓库http://hub.docker.com
2. 镜像的与容器的联系
镜像是一个只读模板容器,容器是通过下载镜像创建运行的实例
拉取镜像: docker pull nginx
查看本地镜像仓库: docker images
以testNginx为容器名调用本地Nginx镜像运行容器: docker run -d --name testNginx nginx
查看运行的实例列表: docker ps
查看某一实例的详细信息: docker ps
docker inspect 71f4031aea56
3. Docker常用镜像命令
管理镜像常用命令: docker image --help
管理容器常用命令: docker container --help
镜像打包命令: docker build -t name:tag .
.代表当前目录,该字段是DockerFile的路径
指令 | 描述 | 样例 |
---|---|---|
ls | 列出镜像 | docker image ls |
build | 构建来自DockerFile或者远程的镜像 | docker build github.com/creack/docker-firefox |
history | 查看历史镜像 | docker history nginx |
inspect | 显示一个或者多个镜像详细信息 | docker inspect nginx |
pull | 从镜像仓库拉取镜像 | docker pull nginx:1.17 |
push | 推送一个镜像到镜像仓库 (先登录镜像仓库) | docker pull nginx:v1 |
rm | 移除一个或多个镜像 -f 强制删除 | docker image rm -f nginx:1.17 |
prune | 移除没有被标记或者没有被任何容器引用的镜像 | docker image prune |
tag | 创建一个引用源镜像标记目的镜像 | docker tag nginx nginx:v1 |
export | 导出容器文件系统tar归档文件创建镜像 | docker container export nginx > nginx.tar |
import | 导入容器文件系统tar归档文件创建镜像 | docker import nginx.tar |
save | 保存一个或者多个镜像到一个tar归档文件 | docker save nginx > nginx.tar |
load | 加载来自tar归档或标准输入的镜像 | docker load < nginx.tar |
4. 镜像存储核心技术:联合文件系统 UnionFs
镜像能够高效存储的原因是,联合文件系统(Union file system),将镜像多层文件联合挂载到文件系统
联合文件系统给容器层提供一个沙盒的环境,容器层的独立的运行的同时,不会占用更多的磁盘空间,
5. 镜像存储核心技术:写时复制 COW
镜像是只读的,共享给多个容器。如果容器里修改文件,镜像会如何进行修改呢。
写时复制(Copy-on-write)机制会在修改文件操作时,先从镜像里把要写的文件复制到自己的文件系统中进行修改。
第一层: 联合文件系统挂载层,也叫统一视图层,
第二层: 联合文件系统容器层
第三层: 联合文件系统镜像层,其中的init层会挂宿主机hostname(主机名)、hosts(添加hosts)、resolv.config(设置DNS)三个文件。
读取和修改文件时,首先在容器层进行搜索,如果没有就会向镜像层进行搜索,所以读写速度是影响其性能的关键。可以通过使用固态、使用卷作为频繁读写文件的工作目录,绕过存储驱动,减少抽象的开销。
三、Docker容器管理
1. 创建容器常用选项
选项 | 描述 | 样例 |
---|---|---|
-i,-interactive | 交互式 | docker run -i centos |
-t,-tty | 分配一个为终端 | docker run -t centos |
-d, -detach | 运行容器到后台 | docker run -d nginx |
-e, -env | 设置环境变量 | docker run -d -e ABC=123 -e CED=456 nginx |
-p, -publish list | 发布容器端口到主机 | docker run -p 8888:80 nginx |
–name | 设置容器名 | docker run --name myNginx nginx |
-h,-hostname | 设置容器主机名 | docker run -h host nginx |
-ip | 指定容器IP,只能用于自定义网络 | `` |
-network | 连接容器到一个网络 | `` |
-mount mount | 将文件系统附加到容器 | `` |
-v,-volume list | 绑定挂载一个卷 | `` |
–restart | 容器退出时重启策略,默认no,可选值有 | docker run --restart=always nginx |
值得一提的是,可以使用docker run -idt centos
同时使用几个常用选项.
进入容器内部 docker container exec -it 容器号 bash
2. 容器资源限制
默认创建的容器会使用宿主机所有资源
选项 | 描述 |
---|---|
-m, -memory | 容器可以使用的最大内存量 |
-memory -swap | 容器允许交换到磁盘的内存量 |
-memory-swappiness=<0-100> | 容器使用SWAP分区交换的百分比 |
-oom-kill-dosan;e | 禁用OOM Killer |
–cpus | 容器可以使用的cpu数量 |
-cpuset-cpus | 限制容器使用特定的CPU核心 |
-cpu-shares | cpu共享(相对权重) |
例如:``