栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

【Docker 基础篇】学习笔记

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Docker 基础篇】学习笔记

docker 学习笔记
  • 基础篇
    • Docker简介
      • Docker的来由
      • Docker理念
    • Docker平台架构 入门
    • Docker平台架构 架构
    • Docker安装
    • Docker常用命令
    • Docker镜像
    • 本地镜像发布到阿里云
    • 本地镜像发布到私有库
    • Docker容器数据卷
    • Docker常规安装简介

基础篇 Docker简介 Docker的来由

系统平滑移植,容器虚拟化技术

在docker出现之前,环境配置相当麻烦,换一台机器,就要重来一次,费时费力。Docker的诞生就是为了解决这个问题,安装的时候,把原始环境一摸一样地复制过来

在docker诞生前,开发团队需要清楚的告诉运维团队,用的全部配置文件+所有团建环境。不过,即便如此,仍然常常发生部署失败的情况。
Docker的出现使得Docker得以打破过去程序即应用的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上的打包,达到应用程式跨平台间的无缝接轨运作

Docker理念

一次镜像,处处运行

源码+运行环境+配置文件+第三方组件。。。 = 镜像

这样不同的电脑都安装一下docker下载上面说的镜像,就不会有各种环境问题导致不同的机器运行不了程序,docker的诞生最初的目的就是解决这个问题。只需要一次配置好环境,换到别的机器上就可以一键部署好,大大简化了操作

举个例子,就比如我在沈阳住在XX小区,现在我去了北京,我还想住在这个小区,于是我把小区原封不动的搬到了北京

docker是基于GO语言实现的云开源项目,docker的出现解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术

Docker和传统虚拟化方式不同之处:

  • 传统虚拟化技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在系统上再运行所需应用进程
  • 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且页没有进行硬件虚拟。因此容器要比传统虚拟机更轻便
  • 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源

Docker是内核级别虚拟化,其不像传统的虚拟化技术一样需要额外的系统支持,所以再一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率

Docker平台架构 入门

镜像(image):
就是一个只读模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器
它也相当于是一个root文件系统,比如官方镜像centos:7就包含了一套完整的一套centos7最小系统的root文件系统
相当于容器的源代码,docker镜像文件类似于java的类模板,而docker容器实例类似于java中new出来的实例对象

容器(container):
1、从面向对象的角度
Docker利用容器独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器时用镜像创建的运行实例。就像是java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是互相隔离的、保证安全的平台

2、从镜像容器角度
可以把容器看作是一个简易版的linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序

仓库(repository):
仓库是集中存放镜像文件的场所
类似于
maven仓库,存放各种jar包的地方
github仓库,存放各种git项目的地方
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方

仓库分为公开仓库(Public)和私有仓库(Private)两种形式
最大的公开仓库是Docker Hub(https://hub.docker.com)
存放了数量庞大的镜像供用户下载,国内的公开仓库包括阿里云、网易云等

小总结:
Docker本身是一个容器运行载体或称之为管理引擎,我们把应用程序和配置依赖打包形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似java中new出来一个对象)

image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例

镜像文件:
image文件生成的容器实例,本身也是一个文件,称为镜像文件

容器实例:
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个应用的运行实例,也就是我们的容器

仓库:
就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库拉下来就可以了

docker的工作原理:
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket链接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器,是一个运行时环境,就是我们前面说到的集装箱

Docker平台架构 架构

Docker是一个CS模式的架构,后端是一个松耦合架构,众多模块各司其职

Docker运行的基本流程为:
1、用户是使用Docker Client 与Docker Daemon建立通信,并发送请求给后者
2、Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求
3、Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个job的形式的存在
4、Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动Graph driver将下载镜像以Graph的形式存储
5、当需要Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境
6、当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成
7、Libcontainer是一项独立的容器管理包,network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作

Docker安装

官网上有,需要注意的是,在配置镜像仓库的时候,选择国内仓库,阿里或者网易

这里引出一个问题,为什么说docker运行比虚拟机快?

  • docker有着比虚拟机更少的抽象层
  • docker利用的是宿主机的内核,而不需要加载操作系统OS内核
Docker常用命令
三大类命令:
1、帮助启动类命令

	// 启动
	systemctl start docker

	// 停止
	systemctl stop docker
	
	// 重启
	systemctl restart docker

	// 查看docker状态
	systemctl status docker

	// 开机启动
	systemctl enable docker
	
	// 查看docker概要信息
	docker info
	
	// 查看docker总体的帮助文档
	docker --help
	
	// 查看docker命令帮助文档
	docker 具体命令 --help

2、镜像命令

	// 列出本地主机上的镜像
	// 参数:-a 列出本地所有的镜像;-q 只显示镜像ID
	docker images

	// 在远程仓库查找X镜像
	// 参数:--limit 
	docker search X

	// 从远程仓库拉取X镜像
	docker pull X
	
	// 查看镜像、容器、数据卷所占用的空间
	docker system df
	
	// 删除X镜像
	// 参数:-f 删除多个镜像
	// 组合命令,删除所有镜像 docker rmi -f ${docker images -qa}
	docker rmi X
	
	// 列出本地主机上的镜像
	docker images

	// 上传容器成为镜像
	docker commit -m='信息' -a='作者' 容器ID 要创建的目标镜像名:[标签名]
	docker push

3、容器命令

	// 新建+启动容器x
	// 参数(options):
	// --name='容器的新名字'  为容器指定一个名称
	// -d  后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
	// -i  以交互模式运行容器,通常与-t同时使用;也就是启动交互式容器
	// -t  返回一个终端
	// -P  随机端口映射,大写的P
	// -p  指定端口映射,小写的p
	docker run 参数 x
	docker run -it ubuntu /bin/bash
	
	// 查看正在运行的容器
	// 参数:
	// -l  显示最近创建的一个实例容器
	// -n  显示最近n个创建的容器
	// -q  静默模式,只显示容器编号
	// -a  列出当前所有的正在运行的容器+历史上运行过的
	docker ps
	
	// 退出容器
	exit  run进去容器,exit退出,容器停止
	ctrl+p+q  run进去容器,ctrl+p+q退出,容器不停止
	
	// 启动已经停止运行的容器
	docker start 容器ID
	
	// 重启容器
	docker restart 容器ID

	// 停止容器
	docker stop 容器ID

	// 强制停止容器
	docker kill 容器ID
	
	// 删除已停止容器
	docker rm 容器ID
	
	// 删除正在运行的容器
	docker rm -f 容器ID

	// 启动守护式容器(后台服务器)
	docker run -d 容器ID

	// 查看容器日志
	docker logs 容器ID

	// 查看容器内部细节
	docker inspect 容器ID

	// 进入正在运行的容器并以命令行交互
	// attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止
	// exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止
	docker exec -it 容器ID /bin/bash  
	docker attach 容器ID
	
	// 从容器内拷贝文件到主机
	docker cp 容器ID:容器内路径 目的主机路径

	// 导入和导出容器
	docker export 容器ID > 文件名.tar
	cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
Docker镜像

镜像
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需要的所有内容,我们把应用程序和配置依赖打包形成一个可交付的运行时环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行时环境就是image镜像文件

只有通过这个镜像文件才能生成docker容器示实例

UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交,来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统时Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理:
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层时引导文件系统bootfs。这一层与我们典型的linux/unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权由bootfs转交给内核,此时系统也会卸载bootfs

rootfs,在bootfs之上,包含的就是典型linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如ubuntu,centos等

镜像分层最大的一个好处就是共享资源,方便负责迁移,就是为了复用

比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host只需要在磁盘上保留一份base镜像;同时内存中也只需要加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享

Docker镜像层都是只读的,容器层是可写的
当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作‘容器层’,‘容器层’之下的都叫‘镜像层’

本地镜像发布到阿里云

登录阿里云,设置命名空间后会生成三条命令,依次执行即可
1、先通过账号密码连接阿里云
2、把镜像上传到本地成为容器
3、将容器发布到阿里云服务器

本地镜像发布到私有库

Docker Registry 用于构建私有仓库

拉取registry用于搭建私服
docker pull registry

运行私有库registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry – privaileged=true registry

创建一个新镜像,例如ubuntu安装ifconfig命令
docker pull ubuntu
docker run -it ubuntu /bin/bash
apt-get install net-tools

将容器提交成为本地的镜像
docker commit -m=‘’ -a=‘’ 容器ID 容器名字:tag

curl验证私服库上有什么镜像
curl -XGET http://ip:5000/v2/_catalog

将新镜像修改符合私服规范的tag
docker tag ubuntu:1.2 ip:5000/ubuntu:1.2

修改配置文件使之支持http
vim /etc/docker/daemon.json
{
“registry-mirrors”:[“http://aa25jngu.mirror.aliyuncs.com”],
“insecure-registries”:[“ip:5000”]
}
docker默认是不允许http方式推送镜像的,通过上述修改,重启docker

push推送到私服库
docker push ip:port/容器名字

curl验证私服库上有什么镜像
curl -XGET http://ip:5000/v2/_catalog

pull到本地并运行
docker pull ip:port/镜像名字:tag

Docker容器数据卷

启动容器添加权限扩容
–privileged=true

容器数据卷的方式完成数据的持久化
映射,容器内的数据备份+持久化到本地

命令
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了,为了能保存数据在docker中,我们使用数据卷的方式持久化,说白了就是将容器中的数据映射到指定位置保存

特点:
1、数据卷可以在容器之间共享或重用数据
2、卷中的更改可以直接实时生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止

宿主机和容器之间映射添加容器卷
docker run -it --privileged=true -v /宿主机绝对路径:/容器内目录 镜像名

查看数据卷是否挂载成功
docker inspect 容器ID

数据卷内容修改:
1、主机修改,docker同步获得
2、docker修改,主机同步获得
3、docker容器stop,主机修改,docker容器重启后自动同步

设置容器只读
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (ro表示read only)

数据卷的继承和共享
docker run -it --privaileged=true --volumes-from 父类 --name u2 ubuntu

Docker常规安装简介

常规安装流程

  • 搜索镜像
  • 拉取镜像
  • 查看镜像
  • 启动镜像
  • 停止容器
  • 移除容器

在实际开发中的应用方式

mysql:
挂载数据卷(log,data,conf)
docker run -d -p 3306:3306 --privileged=true 
-v /zzyyuse/mysql/log:/var/log/mysql 
-v /zzyyuse/mysql/data:/var/lib/mysql 
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d 
-e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

修改mysql的配置文件,设置utf-8编码
vim /zzyyuse/mysql/conf/my.cnf
character_set_server=utf-8


redis:
docker run -p 6379:6379 --name myr3 --privileged=true 
-v /app/redis/redis.conf:/etc/redis/redis.conf 
-v /app/redis/data:/data 
-d redis:6.0.8 redis-server /etc/redis/redis.conf

至此,docker的基础知识,已经学习完成

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/914791.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号