DOCKER20231217: 容器引擎Docker

发布时间 2023-12-17 11:53:55作者: HOUHUILIN

 

 

 

1.1 Docker简介

 

1.1.1 什么是Docker?

一种轻量级的操作系统虚拟化技术,基于Go语言实现的开源容器项目,诞生于2013年,最初发起者是dotCloud公司(现 Docker Inc)

Docker容器化虚拟技术 vs 传统虚拟机技术

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千容器 一般几十个
隔离性 弱于 强于
安全性 弱于 强于
跨操作系统 不支持 支持

Docker设计思想

  • BUILD、SHIP、RUN
  • 即对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)
  • 一次封装、到处运行
  • 封装的对象可以是一个Web应用、一个编译环境、也可以是一套数据平台服务,甚至是一个操作系统或一个大数据集群
  • 高效、敏捷、轻量级的容器方案,并支持部署到本地和多种主流云平台

 

1.1.2 Docker的主要特性

Docker优势

  • 利用并共享主机内核,性能出色
  • 加快应用部署速度,支持多种场景运行
  • 迁移、扩展、更新方便

 

 

1.2 Docker运行原理

1.2.1 系统架构

Image镜像

  • Image镜像是创建Docker容器的基础,App及其所需的运行环境,可以构建到Image镜像中
  • 镜像相当于静态模板,通过Image镜像可以启动多个Container容器
  • Image镜像依赖操作系统的内核,操作系统的内核在启动时会用bootfs加载
  • 它由多层layer组成,最底层是rootfs,包含某个发行版操作系统的根目录结构和配置文件
  • 每一层的layer,都会在前一层的基础上,对rootfs文件系统进行操作,安装软件或修改配置
  • 所有layer层的叠加,形成最终的文件结构便是Image镜像
  • Image镜像可以通过Dockerfile构建,也可以对Container进行操作后再持久化为Image
### 第一行必须指定基于的容器镜像
FROM ubuntu
### 维护者信息
MAINTAINER docker_user docker_user@email.com
### 镜像的操作命令
RUN echo "deb http://archive.ubuntu.com/ubuntu/raring main universe" >>/etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >>/etc/nginx/nginx.conf
### 容器启动时执行指令
CMD /usr/sbin/nginx

 

Container 容器

  • Docker容器是Docker镜像的一个运行实例。
  • Docker镜像是静态的只读文件,Docker容器带有运行时需要的可写文件层。
  • Docker容器是独立运行的一个或一组应用,以及他们必须的运行环境。
  • 系统架构

  • Docker 核心概念
    • Docker客户端
      • Docker command、RESTful API
    • Docker daemon
      • 核心引擎,接受请求、实现功能、返回结果
      • 内部机制复杂,需管理容器、镜像、存储等
    • Docker  容器
      • 核心内容,功能上以镜像作为基础,提供标准和隔离的执行环境
      • 概念上容器体现了Docker集装箱的理念
    • Docker 镜像
      • 容器环境的静态体现,轻量级的虚拟镜像(只是一个可定制的rootfs)
    • Registry
      • 存放Docker镜像的仓库,通常部署在服务器或者云端

 

1.2.2 镜像仓库

Docker Hub

  • Docker 官方维护的公共仓库,所有用户都可以进行Image的上传和获取
  • 本地没有Image镜像,并且没有指定镜像仓库时,会默认从Docker Hub进行获取

私有镜像仓库

  • 企业一般会在内网环境中搭建私有镜像仓库来进行镜像的存储,以减少风险
  • TDH镜像仓库在Manager主节点的5000端口
  • 如果同时存在多个镜像仓库,可以在容器名上进行区分:
  • registry.xxx.io/demo/centos:latest
    • repository:registry.xxx.io/demo/centos
    • tag/版本:latest
    • 远端仓库地址:registry.xxx.io
    • 项目/镜像名:demo/centos

 

1.2.3 工作机制

  • 准备阶段
    • 拉取镜像,若无本地镜像,则需要从远程仓库拉取
    • 创建新的容器,并设置进程间隔离的Spec,完成与宿主机进程和网络的隔离;容器进程纳入Cgroup,限制容器的资源占用,包括CPU、内存、网络、磁盘I/O等
    • 分配union文件系统并且挂载一个可读写层,任何修改容器的操作都会被记录在这个读写层上(可以保存这些修改成新的镜像;也可以选择不保存,下次运行镜像的时候所有修改操作都会被消除)
    • 分配网络\桥接接口,创建一个容器与本地主机通信的网络接口
    • 设置容器IP,为创建的容器分配一个IP地址,同时向iptables中追加一条新的映射规则
  • 启动阶段
    • 容器启动,运行指定的程序
    • 捕获并且提供应用输出,包括输入、输出、报错信息

 

 

1.3 Docker 基础操作

 

1.3.1 最佳实践

应用程序构建

# 拉取私有仓库镜像
docker pull node01:5000/first_image
# 查看镜像详情
docker image inspect node01:5000/first_image
# 通过镜像启动容器
docker run --name container-name -d node01:5000/first_image
# ----------------参数含义[start]---------------- #
# --name: 为容器起一个名称
# -d: detached,以守护进程的方式在后台运行
# -i: 以交互方式运行容器, 通常与-t搭配使用
# -t: 为容器重新分配一个伪输入终端,通常与-i搭配使用
# -P: 随机端口映射
# -p: 指定端口映射
# ----------------参数含义[end]---------------- #
# 查看运行中的容器
docker ps

容器管理

# 查看所有容器
docker container ls [-a]
# 查看容器日志
docker logs container-id/container-name
# 进入运行中的容器执行操作
dcoker exec -ti container-id/container-name bash
# 退出容器
exit
# 从本地拷贝文件到容器
docker cp container-id:path local_path
# 从容器拷贝文件到本地
docker cp local_path container-id:path
# 正常关闭容器
docker stop container-name/container-id
# 强制杀死容器
docker kill container-name/container-id
# 重启容器
docker restart container-name/container-id
# 删除容器
docker rm container-name/container-id
# 从运行中的容器创建一个新的镜像
docker commit container-id node01:5000/second_image

 

1.3.2 镜像管理

常用命令列表(本地镜像)

Command Description
docker images 列出本地镜像
docker rmi 删除本地一个或多个镜像
docker tag 标记本地镜像,将其归入某一仓库
docker build 根据Dockerfile构建镜像
docker commit 将容器commit为镜像
docker history 查看指定镜像的创建历史
docker save 将指定镜像保存成tar归档文件
docker load 导入使用docker save命令导出的镜像
docker import 从归档文件中创建镜像
docker login 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库Docker Hub
docker logout 登出一个docker镜像仓库,如果未执行镜像仓库地址,默认为官方仓库Docker Hub
docker pull 从镜像仓库中拉取或者更新指定镜像
docker push 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker search 从Docker镜像仓库中查找镜像