Docker

为什么使用容器

1.上线流程繁琐
2.资源利用率底
3.扩容、缩容不及时(已知,未知)
业务机器增加承载量,可以应对一些突发状况,30%
弹性伸缩
4.服务器环境臃肿 5.环境不一致


docker介绍

官网:https://docs.docker.com/

安装centOS  https://docs.docker.com/engine/install/centos/

# 广泛介绍
1,使用最广泛的开源容器引擎
2.一种操作系统级别的虚拟化技术
3.依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)
4.一个简单的应用程序打包工具

# 设计目标
1.提供简单的应用程序打包工具  (项目环境+代码成镜像)
2.开发人员和运维人员责任逻辑分离
3.多环境保持一致性

# 基本组成
* Docker Client:    客户端
* Docker Daemon:   守护进程
* Docker Images:    镜像
* Docker Container:  容器
* Docker Registry:  镜像仓库

容器与虚拟机的区别

                        Container                       VM
启动速度                    秒级                         分钟级别
运行性能                   接近原生                      5%左右损失
磁盘占用                     MB                           GB
数量                        成百上千                    一般几十台
隔离性                     进程级别                    系统级别(更彻底)
操作系统                   只支持linux                   几乎所有
封装程度        只打包项目代码和依赖关系(共享宿主内存)      整个操作系统


容器:
容器提供了一个独立的环境,实现容器隔离、资源限制
主要解决应用层面问题,应用快速部署、高效管理

虚拟机:
提升服务器资源利用率
提供一个隔离环境

Docker应用场景

应用程序打包和发布
应用程序隔离
持续集成(解决产品依赖服务,快速部署)
部署微服务
快速搭建测试环境
提供PaaS(平台及服务)

安装docker

# CentOS安装 Docker(官网)
  https://docs.docker.com/engine/install/centos/
# CentOS安装 Docker(菜鸟)
  https://www.runoob.com/docker/centos-docker-install.html
# yum依赖包
  yum  install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

# 在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker
  $ yum install -y yum-utils

  $ yum-config-manager 
    --add-repo 
    https://download.docker.com/linux/centos/docker-ce.repo
# 安装最新版本(ce:社区版 ee:企业版)
  yum install docker-ce

# 设置docker服务开机启动
  $ systemctl start docker
  $ systemctl enable docker

# 查看是否启动
  docker info

# 在虚拟机安装完docker 分配一个伪终端


# docker run 命令:https://www.runoob.com/docker/docker-run-command.html
docker run -i -t centos /bin/bash # 若果不存在镜像,默认官方自动安装
# 创建容器 -d
docker run -d nginx # 查看伪终端安装的CentOS版本 cat /etc/redhat-release

Docker镜像

镜像是什么

# 一个分层储存的文件,不是一个单一的文件
# 一个软件的环境
# 一个镜像可以创建N个容器
# 一种标准的交付方式
# 一个不包换linux1内核而又精简的Linux操作系统

Docker命令最后一个指定镜像

# Docker run 
1. docker命令最后一个指定镜像  (仓库:https://hub.docker.com/)
2. 默认镜像版本 latest
3. 分层下载

# Docker查看安装
    docker ps     # 列出容器
docker ps -a # 显示所有容器(包括未运行)
docker images # 列出本地镜像
# 配置镜像加速器: vi /etc/docker/daemon.json { "registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com"] }

# 启动容器
docker start 进程号 # 进程号获取方式 docker ps -a 第一列

镜像与容器的联系

# 当启动一个新的容器时,Docker会加载只读镜像,并在其之上添加一个读写层,即容器层  

容器目录:ls /var/lib/docker/containers/ 镜像储存目录(分层):ls /var/lib/docker/overlay2/

容器没有自己的内核

rootfs 根文件系统
bootfs 引导文件系统,引导程序和内核

镜像管理常见命令

# export
# 备份
  docker container export 82ded77e5342 > nginx.tar 
# 查看备份出的大小
  du -sh nginx.tar
# 解压
  tar xvf nginx.tar

# save导出
  docker save nginx > nginx.tar 
# 删除镜像
  docker image rm -f nginx   # 无法删除占用文件
# 批量删除容器
  docker rm -f $(docker ps -aq)
# load导入
  docker load < nginx.tar

镜像存储核心技术,容器读写

 存储驱动为:overlay2()

镜像层只读,容器层读写      # 容器之间隔离
docker exec -it ID bash # ID 需要docker ps 查询
# 退出容器id
ctrl+d
# 镜像高效存储
  答:引用联合文件系统,将镜像多层文件联合挂载到容器文件系统
  将多个目录记录到,一个单独目录中记录 将信息综合起来方便调用,节省空间
# 写时复制(cow)

联合文件系统后,镜像是只读,类似共享形式让多个容器使用,如果在容器离修改文件,及镜像里的文件,该怎么办呢? 答:引入写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写的文件复制到自己的文件系统中进行修改


# 容器层创建文件里面存在挂载宿主机三个文件
hostname
hosta
resolv.conf
# 查看三个文件
ls /var/lib/docker/overlay2/容器id/diff
例子:  ls /var/lib/docker/overlay2/1432ab6979524f2c6f8ff3ff6c44e334baab4a3f866f0afcbf706535251d251f/diff

# 读文件: 容器层-》镜像层
# 修改文件: 容器层-》镜像层
# 容器层创建一个文件

管理容器的常用命令

 创建容器的常用选项

# 进入容器
  docker container exec -it 容器ID号 bash

# 实例 
  docker run -d -e ABC=123  -p 8888:80 --name nginx -h web --restart=always  nginx 镜像# always 开机重启
# 查看是否生效
echo $ABC
hostname
# 挂在宿主机三个文件修改
hostname --hostname
hosta --dns
resolv.conf --add-host

容器资源管理

# 容器可以使用的最大内存量  
  docker run -d -m="512m" nginx
# 资源统计信息
  docker stats  长ID

容器资源扩容

# 更新容器配置
  docker update 更新配置
# 查看所有容器(包括停止的)
docker ps -a 查看所有容器
# 只显示容器id
docker ps -aq 只显示容器id
# 删除所有容器
docker rm -f $(docker ps -a)
# 从外部复制到容器中
# 从外到里
docker cp nginx.tar web:/opt
docker exec -it web bash
# 从里到外
docker cp web:/opt/xxx ./

容器实现核心技术

六种不同的命名空间 namespace

# 查看进程的命名空间
ll /proc/$$/ns # 查看有哪些命名空间
ls /proc/1/ns

限制容器资源CGroups

 

Docker核心组件

将数据从宿主机挂载到容器中的三种方法

 

volume

 bind mounts

 

docker网络

# 查看网络
docker network ls

# 应用场景
bridge

host 希望使用宿主机网络
none 手动配置容器网络,对接公司的IPAM
container 希望容器与另一个容器在一个网络命名空间,Inmp

iptables

 

 

原文地址:https://www.cnblogs.com/Pythonzrq/p/14499474.html