• Docker学习笔记(一)安装Docker、镜像操作、容器操作、数据卷操作


    1 Docker介绍

    1.1 Docker的优势

    微服务虽然具备各种各样的优势,但服务的拆分通常会给部署带来了很大的麻烦:

    • 分布式系统中,依赖的组件非常多,不同组件之间部署时可能会产生一些冲突;
    • 在数百上千台服务器中重复部署,每台服务器的环境不一定一致,可能会遇到各种问题。

    1.1.1 应用部署的环境问题

    大型项目组件较多,运行环境也较为复杂,部署时可能会碰到一些问题:

    • 依赖关系复杂,容易出现兼容性问题;
    • 开发、测试、生产环境有差异。

    例如一个项目中,部署时需要依赖于node.jsRedis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖库各不相同,甚至会有冲突,这就给部署带来了极大的困难。

    1.1.2 Docker解决依赖兼容问题

    Docker为了解决依赖的兼容问题的,采用了两个手段:

    • 将应用、Libs(函数库)、Deps(依赖)、配置一起打包,形成可移植镜像。
    • 将每个应用放到一个隔离容器去运行,避免互相干扰。

    这样打好的包,既包含应用本身,也包含应用所需要的Libs、Deps,无需再在操作系统上安装这些,自然就不存在不同应用之间的兼容问题了。

    1.1.3 Docker解决操作系统环境差异

    解决了不同应用的兼容问题,但是开发、测试等环境仍会存在差异,操作系统版本也会有差异。例如,将一个Ubuntu版本的MySQL应用安装到CentOS系统,MySQL在调用Ubuntu函数库时,会发现找不到或者不匹配,则会报错。

    Docker为了解决不同系统环境差异问题,也采用了两个手段:

    • 将应用与所需要调用的系统函数库一起打包。
    • 基于打包的系统函数库,借助于操作系统的Linux内核来运行。

    这样打好的包,即包含应用本身,也包含应用所需要的系统函数库,直接基于Linux内核运行,因此可以在任意Linux操作系统上运行。

    1.1.4 小结

    总的来说,Docker是一个快速交付应用、运行应用的技术,具备下列优势:

    • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统。
    • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰。
    • 启动、移除都可以通过一行命令完成,方便快捷。

    1.2 Docker和虚拟机的区别

    Docker可以让一个应用在任何操作系统中非常方便的运行。而虚拟机,也能在一个操作系统中,运行另外一个操作系统,保护系统中的任何应用。

    两者的区别在于:

    • 虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的 Ubuntu 应用了。
    • Docker仅仅是封装函数库,并没有模拟完整的操作系统。

    • 在性能上,Docker接近原生,虚拟机性能较差;
    • 在硬盘占用上,Docker一般为MB,虚拟机一般为GB;
    • 在启动上,Docker一般为秒级,虚拟机为分钟级。

    总的来说,Docker只是一个系统进程,而虚拟机是在操作系统中的操作系统;Docker体积小、启动速度快、性能好,而虚拟机体积大、启动速度慢、性能一般。

    1.3 Docker架构

    1.3.1 镜像和容器

    • 镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
    • 容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。因此一个镜像可以启动多次,形成多个容器进程。

    1.3.2 DockerHub

    DockerHub是一个官方的Docker镜像的托管平台,称为Docker Registry。国内也有类似于DockerHub的公开服务平台,比如网易云镜像服务阿里云镜像库等。

    我们不仅可以从DockerHub拉取镜像,还可以将自己的镜像共享到DockerHub:

    1.3.3 Docker架构

    Docker是一个CS架构的程序,由两部分组成:

    • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等。
    • 客户端(client):通过命令或RestAPI向Docker服务端发送指令,可以在本地或远程向服务端发送指令。

    1.4 安装Docker

    Docker分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期7个月),EE 即企业版,强调安全,付费使用,支持周期24个月。

    Docker CE 分为 stable testnightly 三个更新频道。

    官方网站上有各种环境下的安装指南,这里主要学习 Docker CE 在 CentOS7 上的安装步骤。

    Docker CE 支持64位版本CentOS 7,并且要求内核版本不低于3.10,CentOS 7满足最低内核的要求。

    1.4.1 卸载旧版本Docker(可选)

    如果之前安装过旧版本的Docker,可以使用下面命令卸载;如果未安装过,可以直接跳过:

    yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-selinux \
                      docker-engine-selinux \
                      docker-engine \
                      docker-ce
    

    1.4.2 安装Docker

    • 1)安装yum工具
    yum install -y yum-utils \
               device-mapper-persistent-data \
               lvm2 --skip-broken
    

    • 2)更新本地镜像源
    # 设置Docker镜像源
    yum-config-manager \
        --add-repo \
        https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        
    sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
    
    yum makecache fast
    

    • 3)安装docker-ce
    yum install -y docker-ce
    

    1.4.3 启动Docker

    Docker应用需要用到各种端口,逐一去修改防火墙设置非常麻烦,因此在使用虚拟机进行学习时可以直接关闭防火墙!但生产环境是绝对不可以的!

    • 1)关闭防火墙
    # 关闭防火墙
    systemctl stop firewalld
    # 禁止开机启动防火墙
    systemctl disable firewalld
    
    • 2)启动Docker
    # 启动Docker服务
    systemctl start docker  
    
    # 停止Docker服务
    systemctl stop docker  
    
    # 重启Docker服务
    systemctl restart docker  
    
    • 3)查看Docker版本
    docker -v
    

    1.4.4 配置镜像加速

    Docker官方镜像仓库网速较差,我们可以设置为国内镜像服务。

    参考阿里云镜像加速器文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

    按照文档指引执行以下命令,即可完成镜像加速配置:

    2 Docker的基本操作

    2.1 镜像操作

    2.1.1 镜像名称

    镜像名称一般由两部分组成:[repository]:[tag]。在没有指定tag时,默认是latest,代表最新版本的镜像。如图:

    2.1.2 镜像命令

    2.1.2.1 拉取、查看镜像

    需求:从DockerHub中拉取一个Nginx镜像并查看。

    • 1)去DockerHub镜像仓库搜索Nginx镜像

    • 2)根据查看到的镜像名称,拉取自己需要的镜像
    docker pull nginx
    

    • 3)查看拉取到的镜像
    docker images
    

    2.1.2.2 导出、删除、导入镜像

    需求:将Nginx镜像导出磁盘,然后再加载回来。

    • 1)导出Nginx镜像到磁盘

    格式:docker save -o [保存的目标文件名称] [镜像名称]

    docker save -o nginx.tar nginx:latest
    

    • 2)删除本地的Nginx镜像
    docker rmi nginx:latest
    

    • 3)读取nginx.tar文件加载Nginx镜像
    docker load -i nginx.tar
    

    2.2 容器操作

    Docker容器有三个状态:

    • 运行:进程正常运行
    • 暂停:进程暂停,CPU不再运行,但并不释放内存
    • 停止:进程终止,回收进程占用的内存、CPU等资源

    2.2.1 创建并运行一个容器

    创建并运行nginx容器的命令:

    docker run --name nginx -p 80:80 -d nginx
    

    命令解读:

    • docker run:创建并运行一个容器
    • --name nginx: 给容器起一个名字,这里叫做nginx
    • -p 80:80 :将容器端口映射到宿主机端口,冒号左侧是宿主机端口,右侧是容器端口
    • -d:后台运行容器
    • nginx:镜像名称,这里是nginx

    特别需要注意-p参数,是将容器端口映射到宿主机端口。默认情况下,容器是隔离环境,直接访问宿主机的80端口,肯定是访问不到容器中的Nginx服务的。

    而通过该映射,将容器的80端口与宿主机的80端口关联起来,当访问宿主机的80端口时,就会被映射到容器的80端口,这样就能访问到容器中的Nginx了。如图:

    2.2.2 进入容器,修改文件

    需求:进入nginx容器,修改html文件内容,添加“我进来了…”

    • 1)进入nginx容器
    docker exec -it nginx bash
    

    命令解读:

    • docker exec:进入容器内部,执行一个命令
    • -it: 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
    • nginx:要进入的容器的名称,执行docker run时指定
    • bash:进入容器后执行的命令,bash是一个linux终端交互命令

    • 2)进入nginx容器的html所在目录/usr/share/nginx/html

    容器内部会模拟一个独立的Linux文件系统,看起来如同一个linux服务器一样。Nginx的环境、配置、运行文件全部都在这个文件系统中,包括要修改的html文件。

    cd /usr/share/nginx/html
    

    • 3)修改index.html的内容

    容器内没有vi命令,无法直接修改,但可以使用sed命令来修改:

    sed -i -e 's#Welcome to nginx#我进来了...#g' -e 's###g' index.html
    
    • 4)访问index.html

    在浏览器访问:http://192.168.146.129

    2.2.3 其他常用命令

    • 查看nginx容器日志的命令:
    docker logs nginx
    # 持续查看日志
    docker logs nginx -f
    

    • 查看容器状态:
    # 查看正在运行的所有容器
    docker ps
    # 查看所有容器,包括已经停止的
    docker ps -a 
    

    2.3 数据卷

    2.3.1 数据卷介绍

    在上面的案例中,修改nginx的html页面时,需要进入nginx内部,并且因为没有编辑器,修改文件内容显示很麻烦。

    这是因为容器与数据(容器内文件)耦合带来的后果:

    • 不便于修改:要修改容器内的文件,需要进入容器内部;
    • 数据不可复用:在容器内的修改对外是不可见的,所有修改对新创建的容器是不可复用的;
    • 升级维护困难:升级时删除旧容器,则会把修改的数据一并删掉。

    要解决这个问题,则必须将数据与容器解耦,这就要用到数据卷了。

    数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。例如:

    一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录上。而操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录

    2.2.2 数据卷命令

    2.2.2.1 创建和查看数据卷

    创建一个数据卷,其名称为html:

    docker volume create html
    

    查看所有数据卷:

    docker volume ls
    

    查看数据卷详细信息:

    docker volume inspect html
    

    可以看到,上面创建的html数据卷关联的宿主机目录是/var/lib/docker/volumes/html/_data

    另外,还有两个常用的命令:

    # 删除指定数据卷
    docker volume rm [name]
    # 删除所有未使用的数据卷
    docker volume prune
    
    2.2.2.2 挂载数据卷

    在创建容器时,可以通过-v参数来挂载一个数据卷到某个容器内的目录,例如:

    docker run --name nginx4 -v html:/usr/share/nginx/html -p 80:80 -d nginx
    

    在上面的命令中,创建了一个容器nginx4,其中-v html:/usr/share/nginx/html就是把容器中的/usr/share/nginx/html这个目录挂载到html数据卷。

    此时,如果要修改nginx4容器内/usr/share/nginx/html目录内的index.html的内容,只需要进入html数据卷所在位置/var/lib/docker/volumes/html/_data,修改其中的index.html即可:

    # 查看html数据卷的位置
    docker volume inspect html
    # 进入该目录
    cd /var/lib/docker/volumes/html/_data
    # 修改文件
    vi index.html
    

    修改完成后,在浏览器访问:http://192.168.146.129

    通过数据卷,将容器与数据分离解耦合,方便操作容器内数据,保证数据安全。

    本节完,更多内容请查阅分类专栏:微服务学习笔记

    感兴趣的读者还可以查阅我的另外几个专栏:

  • 相关阅读:
    基于Ingress实现灰度发布(金丝雀发布)和蓝绿发布
    2023年度API安全状况详解
    Docker技术在测试中的应用--环境搭建篇
    k8s-----25、资源调度-ResourceQuota资源配额、资源限制limitrange、服务质量QoS
    数据分析er看过来,五款工具有你需要的
    【小程序源码】强大的多功能图片处理图片画框合成
    使用sql判断两段时间是否重叠
    vue导出word文档
    js回车事件的使用
    商家团购app微信小程序模板
  • 原文地址:https://blog.csdn.net/weixin_42739799/article/details/138728788