docker从入门到入土(基础篇)

Hello~大家好,这里是KOKO师傅!

今天我们来学习Docker与微服务实战的相关内容。

docker简介

docker是什么

docker为什么出现

AB法则: before after
before:
在公司中每个人电脑的配置环境、开发环境各不相同,与公司标准化测试和生产环境也不尽相同。换台机器就需要重新部署环境。
after:
而我们想要进行平滑迁移,就需要用到容器虚拟化技术
源码+环境+配置+版本······打包形成一个镜像文件发送给docker引擎。

docker理念简介

一次镜像,处处运行;从搬家到搬楼

docker是什么

docker是基于GO语言实现的云开源项目;
主要目标:build,ship,and run any app,anywhere.
实现了跨平台、跨服务器。

解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟技术

容器和虚拟机比较

虚拟机:
应用程序对此无感知;对于底层系统而言,虚拟机就是一个普通文件,不需要就删掉。
资源占用多、冗余步骤多、启动慢。

容器:
Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。不需要捆绑一整套的操作系统,只需要该软件运行所必要的库和资源。

docker是在操作系统层面实现虚拟化,而虚拟机是在硬件层面实现虚拟化。

docker能干嘛(解决什么问题)

docker对工种的影响

coder
programmer
software engineer 软件开发工程师
DevOps engineer 开发+运维混合型工程师

DevOps engineer

一次构建、随处运行

更快速的应用交付和部署;
更便捷的升级和扩缩容;
更简单的系统运维;
更高效的计算机资源利用;

docker的应用场景

开发环境;
测试环境;
生产环境;

哪些企业在使用

新浪、美团、蘑菇街······

docker安装

去哪下

官网: http://www.docker.com
仓库: https://hub.docker.com/

前提说明

docker依赖于已存在并运行的Linux内核环境中。
centos上安装docker时,必须部署在Linux内核的系统上;如果其他系统想部署docker就必须安装一个虚拟Linux环境

目前,centos仅发行版本中的内核支持docker。
docker运行在centos7(64-bit)上。
要求系统为64位、Linux系统内核版本为3.8以上,这里选用centos7.x

查看内核版本号的命令:

cat /etc/redhat-release
uname -r

docker的基本组成三要素

镜像

是一个只读的模板。一个镜像可以创建很多容器;
相当于一个root文件系统;
类似Java的类模板。

容器

从面向对象角度:
docker利用容器独立运行的一个或一组应用,应用程序或服务运行在容器里面;
容器就类似于一个虚拟化的运行环境,是镜像运行时的实体;
类似Java的实例对象。

仓库

集中存放镜像文件;
docker hub。

分为公开库私有库
国内一般用阿里云、网易云······

docker平台入门

入门篇

docker是一个C/S结构的系统;
docker守护进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器;

架构篇

docker整体架构和底层通信原理简述:

docker的后端是一个松耦合架构众多模块各司其职

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

centos7下安装

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

安装步骤:

yum安装gcc相关:

//首先centos7能上外网
yum -y install gcc
yum -y install gcc-c++

安装需要的软件包:
根据官网要求手动安装/执行命令安装yum install -y yum-utils

设置stable镜像仓库:
不建议执行官网命令,因为访问外网不稳定、易超时;
推荐使用国内的,以阿里云为例:

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新yum软件包索引:

yum makecache fast

安装docker ce:

yum -y install docker-ce docker-ce-cli containerd.io

启动docker:

systemctl start docker
ps - efj grep docker

测试:

docker version
docker run hello-world

卸载:

systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

阿里云镜像加速

官网:https://promotion.aliyun.com/ntms/act/kubernetes.html

参照官网的操作文档。

通过helloworld分析介绍3要素配合

docker run hello-world
由于本地没有hello-world镜像,所以会去下载一个hello-world镜像,并在容器内运行;

底层原理——为什么docker会比VM虚拟机快

docker有比虚拟机更少的抽象层

docker可以复用主机的硬件资源,因此效率上有明显优势。

docker复用的是宿主机的内核,而不需要加载操作系统OS内核

docker常用命令

帮助启动类命令

启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info

查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help

镜像类命令

  • docker images [options]:列出本地主机上的镜像
    repository:表示镜像的仓库源
    tag:镜像的标签版本号
    image id:镜像ID
    size:镜像大小
    同一个仓库源可以有多个TAG版本,如果不指定版本标签,则默认使用最新版。
    [options]:
    -a 列出本地所有镜像(含历史映像层)
    -q/-aq 只显示镜像ID

  • docker search [options] 某个xxx镜像名字:查询
    [options]:
    –limit n 只列出n个镜像,默认25个

  • docker pull 某个xxx镜像名字[:TAG]:拉取下载
    没有[:TAG]就默认最新版。

  • docker system df: 查看镜像/容器/数据卷所占的空间

  • docker rmi 某个xxx镜像名字id: 删除镜像
    删除单个:docker rmi -f 镜像id
    删除多个:docker rmi -f 镜像名1:TAG 镜像名2:TAG
    删除全部:docker rmi -f $(docker images -qa)

虚悬镜像:仓库名和标签都是<none>的镜像

容器类命令

  • 新建+启动容器:
    docker run [options]IMAGE[COMMAND][ARG...]
    [options]:
    –name=“容器新名字” 为容器指定一个名称
    -d 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
    -i 以交互模式运行容器,通常与-t同时使用
    -t 为容器重新分配一个伪输入终端,通常与-i同时使用
    也即启动交互式容器(前台有伪终端,等待交互)
    -P 随机端口映射,大写P
    -p 指定端口映射,小写p
    -p hostport:containerport

  • 启动交互式容器(前台命令行):
    eg: docker run -it ubuntu /bin/bash

  • 列出当前所有正在运行的容器:
    docker ps [options]
    [options]:
    -a 列出当前所有正在运行的容器+历史上运行过的
    -l 显示最近创建的容器
    -n 显示最近n个创建的容器 eg:docker ps -n 1
    -q 静默模式,只显示容器编号

  • 退出容器:
    两种退出方式:
    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 rm -f $(docker ps -a -q)
    docker ps -a -q | xargs docker rm

  • 非常重要:
    启动守护式容器(后台服务器):
    在大部分场景下,我们希望docker的服务是在后台运行的,我们可以通过-d指定容器的后台运行模式:docker run -d 容器名
    但用docker ps -a发现容器已经退出
    docker容器后台运行,就必须有一个前台进程
    当容器运行的命令如果不是那些一直挂起的命令(比如运行top、tall),就是会自动退出的。(这是docker的机制问题)
    最佳解决方案:将想要运行的程序以前台交互式启动!
    我们用redis前后台启动演示case:
    前台交互式启动 docker run -it redis:6.0.8
    后台守护式启动 docker run -d redis:6.0.8

  • 查看容器日志: docker logs 容器ID

  • 查看容器内运行的进程: docker top 容器ID

  • 查看容器内部细节: docker inspect 容器ID

  • 进入正在运行的容器并以命令行交互:
    docker exec -it 容器ID bashShell
    重新进入: docker attach 容器ID
    上述两种方法的区别:
    attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止;
    exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止(推荐使用的方法);

  • 从容器内拷贝文件到主机上:
    docker cp 容器ID:容器内路径 目的主机路径

  • 导入和导出容器:
    export导出容器的内容流作为一个tar归档文件[对应import命令]
    import从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
    即:
    docker export 容器ID>文件名.tar
    cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

docker镜像详细介绍

分层的镜像

镜像是分层的

UnionFS(联合文件系统)

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

docker镜像加载原理

bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel。
Linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,而系统此时也会卸载bootfs。

rootfs(root file system)在bootfs之上,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同操作系统的发行版,比如CentOS,Ubuntu等等。

为什么docker镜像要采用这种分层架构

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

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

docker commit镜像加强命令

原始镜像不带有某个命令,如果想加上该命令,则联网安装命令并测试通过
安装完成后,commit我们新的镜像
docker commit提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者"容器ID 要创建的目标镜像名:[标签名]

docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。

本地镜像发布到阿里云/从阿里云上拉取镜像

镜像生成方法

  • 用之前新建的方法
  • dockerfile(后需进阶篇详细介绍)

将本地镜像推送到阿里云

  • 进入阿里云开发者平台(需要有自己账户);

  • 创建仓库镜像
    选择控制台,进入容器镜像服务;
    选择个人实例;
    创建命名空间;
    仓库名称;
    进入管理界面获得脚本,运行即可;

将阿里云上的镜像下载到本地

用管理界面的脚本从阿里云上拉取镜像

docker私有库的基本使用

Docker Registry是官方提供的工具,可以用于构建私有镜像仓库。

  • 下载镜像Docker Registry

  • 运行私有库Registry,相当于本地有个私有Docker hub

docker run -d -p 5000:5000 -v /[name]/myregistry:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器数据卷映射,方便联调。

  • 创建一个新镜像(eg:ubuntu上安装ifconfig命令)

  • curl验证私服库上有什么镜像

curl -XGET http://192.168.111.162:5000/v2/_catalog
(开启5000端口,IP改成自己Linux的IP)

  • 将新镜像修改符合私服规范的Tag

docker tag 镜像:Tag Host:Port/Repository:Tag

  • 修改配置文件使之支持http

vim /etc/docker/daemon.json进入配置文件的编辑模式
在镜像后加一个,再加上"insecure-registries":["192.168.111.167:5000"]
注意,IP需要更改,和宿主机不一样
然后重启docker

  • push推送到私服库

docker push 192.168.111.167:5000/Repository:Tag

  • curl再次验证私服库上有什么镜像

  • pull到本地运行并测试

docker pull 192.168.111.167:5000/Repository:Tag

docker容器数据卷

!!!坑!容器卷记得加入:--privileged=true
docker挂载主机目录访问,如果出现访问的权限不够,在挂载目录后多加上述参数即可!

在上一级目录中,运行私有库的命令docker run -d -p 5000:5000 -v /[name]/myregistry:/tmp/registry --privileged=true registry
-v 添加自定义的容器卷
/tmp/registry 容器内的路径
–privileged=true 权限

是什么

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷。

容器数据卷可以完成数据的持久化重要资料backup,通过映射,容器内的数据备份+持久化到宿主机目录

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

能干嘛

保存数据!

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

容器卷和主机互通互联

宿主机vs容器卷之间映射添加容器卷

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

查看数据卷是否挂载成功:
docker inspect 容器ID
Mounts中可以查看

容器和宿主机之间数据共享:
双向绑定

容器卷rw和ro读写规则映射添加说明

读写(默认):read&write
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名

只读:read only
容器内部被限制,只能读取不能写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

卷的继承和共享

容器1完成和宿主机的映射

容器2继承容器1的卷规则:
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值