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 [email protected]
### 镜像的操作命令
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镜像的仓库,通常部署在服务器或者云端
- 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
- repository:
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镜像仓库中查找镜像 |
标签:容器,container,仓库,DOCKER20231217,镜像,Docker,docker From: https://www.cnblogs.com/harleyblogs/p/17908906.html