• Docker 基础篇 入门篇


    1.Docker入门

    1.为什么要用docker?

    相比于传统:
    	部署非常慢
    	成本非常高
    	资源浪费
    	难于迁移和扩展
    	可能会被限定硬件厂商
    
    • 由于物理机的诸多问题,后来出现了虚拟机

    • 一个物理机可以部署多个app,每个app独立运行在一个VM里。

    • 但是虚拟化也是有局限性的,每一个虚拟机都是一个完整的操作系统,要分配系统资源,虚拟机多道程度时,操作系统本身资源也就消耗殆尽,或者说必须扩容。

    • 由于环境部署配置的麻烦,出现了以下

      • 程序员将代码以及程序依赖,打包成一个docker镜像文件,以后需要把这个镜像文件,发给测试,运维,只需要安装docker,安装这个镜像文件,就可以运行开发环境了。

    2.Docker VS 传统虚拟机

    特性 容器 虚拟机
    启动 秒级 分钟级
    硬盘使用 一般为 MB 一般为 GB
    性能 接近原生
    系统支持量 单机支持上千个容器 一般几十个

    3.环境配置的难题

    • 让开发人员最头疼的麻烦事之一就是环境配置了,每台计算机的环境都不相同,应该如何确保自己的程序换一台机器能运行起来呢?
    • 用户必须确保的是:
      • 操作系统的相同
      • 各种平台库和组件的安装
      • 例如python依赖包,环境变量等
    • 如果环境配置这么痛苦的话,换一台机器,就得重新配置一下,那么在安装软件的时候,带着原始环境一模一样的复制过来。

    解决方案1:虚拟机

    • 虚拟机也可以制作模板,基于模板创建虚拟机,保证环境问题一致
    • 虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
    • 虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。

    1)资源占用多

    虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。

    (2)冗余步骤多

    虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。

    (3)启动慢

    启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

    解决方案2:Linux容器

    • 由于虚拟机的诸多问题,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写LXC)
    • 现在:自从用上docker容器后,可以实现开发、测试和生产环境的统一化和标准化。
    • Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。在正常进程的外面套了一个保护层,对于容器里面进程来说,它接触的资源都是虚拟的,从而实现和底层系统的隔离

    (1)启动快

    容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

    (2)资源占用少

    容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

    (3)体积小

    容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

    总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

    • 说的通俗点:Docker作用

      解决环境部署问题,基于一个镜像文件,能够运行出容器示例,就不需要做环境部署。
      

    4.docker容器的优势

    更高效的利用系统资源
    由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统 资源的利用率更高。
    无论是应用执行速度、内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运 行更多数量的应用。
    
    更快速的启动时间
    传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启 动时间。大大的节约了开发、测试、部署的时间。
    
    一致的运行环境
    开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环 境不一致,导致有些 bug 并未在开发过程中被发现。
    而 Docker 的镜像提供了除内 核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码 在我机器上没问题啊” 这类问题。
    
    持续交付和部署
    对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意 地方正常运行。
    使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员 可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系 统进行集成测试,
    而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
    而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环 境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
    
    更轻松的迁移
    由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在 很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运 行结果是一致的。
    因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一 个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
    

    5.工作中的虚拟化和容器

    6.Docker的三大生命周期概念

    • 镜像文件,可以理解为操作系统的
    • 容器实例,基于docker镜像运行出的容器实例 ,可以理解为微型操作系统
    • 仓库,存储镜像文件的地方

    7.docker安装方式

    1.yum安装,配置yum仓库
    	-阿里云仓库,清华源仓库,163仓库, 问题是,docker的版本可能很低,有很多漏洞
    	-选择软件官方提供的yum仓库,版本都是最新的,但是可能下载较慢
    	-由于网速问题,学习阶段还是使用阿里云的docker
    	
    [root@xujunk ~]#yum install docker -y
    	
    2.rpm 不推荐
    
    3.源码编译安装,很麻烦,如果没有特定需求,还是选择yum
    
    
    • 卸载docker
    yum remove docker* docker-* -y
    

    8.Docker镜像加速器

    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
    

    9.镜像,仓库,容器的增删改查管理命令

    • 启动
    systemctl status/start/stop docker
    
    [root@xujunk ~]#docker images  #列出当前所有的镜像文件 
    
    [root@xujunk ~]#docker  run  hello-world   #运行镜像文件,生成docker容器实例,docker run命令,会自动下载不存在的镜像
    #容器是随时创建,随时删除的,轻量级,每次docker run 都会生成新的容器记录 
    #docker容器进程,如果没有在后台运行的话,就会立即挂掉,  (容器中必须有正在工作的进程)
    
    
    #运行一个一直活着的容器进程
    docker run -d centos /bin/sh -c "while true;do echo '你个糟老头子,不听课,坏得很'; sleep 1;done"
    
    docker rmi  镜像名字/镜像id   #删除镜像文件 
    docker rm  容器id/容器进程名字   #删除容器记录
    docker rmi -f  #强制删除镜像文件  
    docker  rm  `docker ps -aq`   #批量删除容器记录,只能删除挂掉的容器记录 
    
    #docker容器进程的启停命令
    
    docker start  容器id 
    docker stop  容器id  
    
    docker search  镜像文件名字   #搜索镜像文件
    docker images  #列出当前所有的镜像文件 
    docker ps   #列出当前记录正在运行的容器进程 
    docker ps -a  #列出所有的容器进程,以及挂掉的  
    
    docker logs 容器id  #查看容器内的日志信息 
    docker logs -f  容器id   #检测容器内的日志 
    docker ps -aq  #列出所有容器id
    
    
    #进入容器空间内的命令 
    docker exec -it 容器id  /bin/bash  #进入容器空间内 
    	-i 交互式命令操作
    	-t 开启一个新的终端
    #退出容器
    exit
    
    #运行一个ubuntu容器
    docker run -it ununtu
    
    cat /etc/os-release  #查看一个系统版本
    
    • 删除一个镜像方式
    1.ps -a #查看是否有用此镜像运行中的容器
    2.docker stop  容器id   #将启动中的容器关闭
    2.docker ps -a	#查看所有的容器进程,以及挂掉的
    4.docker rm 容器id   #删除残留容器
    5.docker rmi 镜像文件名字  #删除镜像文件
    
    • 提交一个自定制的镜像文件
    #过程实现
    #运行出容器实例  二次修改容器实例  提交容器实例为新的镜像  导出镜像 发给别人导入
    
    
    1.docker run -it centos /bin/bash     #进入一个纯净的centos容器空间内,此时是最小化安装的系统,没有vim 没有py3 
    
    
    2.在容器空间内  yum install vim   ,然后退出容器
    
    3.此时这个容器记录就是携带者 vim的容器记录了(可以理解为携带者程序依赖,或者python3等等)
    
    4.提交这个容器为新的 镜像文件 
    311110e1ec56
    docker commit 容器进程id    镜像文件的名字 
    docker commit 419  s21docker-centos-vim 
    #e.g.:[root@xujunk ~]#docker commit 311110e1ec56 docker-centos-vim
    sha256:d1870159517111e3756f022fdc851a3c90b1bef6daf2c54b4d0a8a3da4224a1
    
    5.导出docker镜像,成为一个压缩文件,可以发送给你的测试,运维同事了
    
    docker save 镜像文件名/镜像id  > /opt/centos-vim.tar.gz  
    
    [root@xujunk ~]#docker save d18701595171 > /opt/centos-vim.tar.gz
    
    6.此时可以发送文件,给别人导入了
    #这里为了简便在本机进行操作,将原镜像文件删除
    [root@xujunk ~]#docker rmi 镜像文件id
    
    
    docker load <  同事给你发的镜像文件
    [root@xujunk ~]#docker load < /opt/centos-vim.tar.gz
    
    • **容器内运行一个web程序 ,进行端口映射 **
    1.下载一个flask的docker镜像 
    [root@xujunk ~]#docker pull training/webapp 
    
    2.运行docker镜像
    
    docker run -d -P  
    	-d  后台运行 
    	-P  随机端口映射   随机的宿主机的端口:容器内的端口(自动指定的,由代码指定)
    	-p  指定端口映射   宿主机的7777:8500
            
    3.创建一个容器空间,然后在里面执行 python app.py 命令
    [root@xujunk ~]#docker run -d -P training/webapp python app.py  
    
    创建一个容器空间,然后在里面执行 python app.py 命令
    [root@xujunk ~]#docker run -d -p  6000:5000 training/webapp python app.py 
    
    
    3.查看后台运行容器端口:
    [root@xujunk ~]#docker ps
    """
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
    1ff5a02461a2        training/webapp     "python app.py"     2 minutes ago       Up 2 minutes        0.0.0.0:32769->5000/tcp   musing_tesla
    """
    4.访问这个容器应用 
    服务器ip:宿主机的映射端口 
    浏览器输入:
    	192.168.58.131:32768 
    
    5.进入容器空间内,查看代码
    

    10.dockerfile学习

    • dockerfile学习,docker的脚本文件,用于构建镜像文件的
    #FROM指令用于  指定容器用什么发行版
    
    #制作base image 基础镜像,尽量使用官方的image作为base image
    FROM scratch 
    #使用base image
    FROM centos 
    #带有tag的base image
    FROM ubuntu:14.04 
    
    #定义标签变量的
    LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
    LABEL maintainer="yc_uuu@163.com"
    
    
    #万能RUN指令,让容器自己去做些什么事 
    #对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
    RUN yum update && yum install -y vim 
        Python-dev #反斜线换行
    RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”
    RUN yum install redis  #自动安装redis
    
    
    
    WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
    WORKDIR /test #如果没有就自动创建
    WORKDIR demo #再进入demo文件夹
    RUN pwd     #打印结果应该是/test/demo
    
    - 小示例:
    	"""
    	WORKDIR   /opt
        WORKDIR /tmp  
        WORKDIR  ../
    	"""
        #路径切换到根目录
    
    #  ADD命令用来  将宿主机的文件添加到容器空间内 
    #ADD存在压缩文件解压的功能,因此,仅仅添加文件到容器内,用COPY而不是ADD  
    
    ADD and COPY 
    ADD hello /  #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
    ADD test.tar.gz /  #添加到根目录并解压
    
    ENV #环境变量,尽可能使用ENV增加可维护性
    ENV MYSQL_VERSION 5.6 #设置一个mysql常量
    
    示例:RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
    

    11.dockerfile构建一个flask web app

    1.创建一个文件:
    	[root@xujunk opt]#mkdir s21docker
    	[root@xujunk opt]#cd s21docker
    2.编写flask代码文件
    	[root@xujunk s21docker]#vim s21flask.py
    	"""
    from flask import Flask
    app=Flask(__name__)
    @app.route('/')
    def hello():
    	return "hello docker"
    if __name__=="__main__":
    	app.run(host='0.0.0.0',port=8080)
    	"""
    3.准备Dockerfile (名字必须叫做 Dockerfile)
    """
    FROM centos
    COPY CentOS-Base.repo /etc/yum.repos.d/
    COPY epel.repo /etc/yum.repos.d/
    RUN yum clean all
    RUN yum install python-setuptools -y
    RUN easy_install flask
    COPY s21flask.py /opt/
    WORKDIR /opt
    EXPOSE 8080
    CMD ["python","s21flask.py"]
    
    """
    4.在Dockerfile同级目录,准备好其他环境文件,代码文件:CentOS-Base.repo  Dockerfile  epel.repo  s21flask.py
    [root@xujunk s21docker]#cp /etc/yum.repos.d/CentOS-Base.repo ./
    [root@xujunk s21docker]#cp /etc/yum.repos.d/epel.repo ./
    #查看s21docker目录下文件:
    [root@xujunk s21docker]#ls
    CentOS-Base.repo  Dockerfile  epel.repo  s21flask.py
    
    5.构建docker镜像
    
    docker build -t xujunkai521/s21-flask-docker   .
    	docker build  编译Dockerfile  
    	-t  给镜像加上名字  ,镜像名字,以仓库地址开头,则可以推送到仓库中管理
    	.    找到当前的Dockefile文件
        
    #会按照Dockerfile从上到下一步一步编译
        
    
    6.构建完毕之后,查看镜像文件
    [root@xujunk s21docker]#docker images
    
    7.运行这个flask镜像文件,生成容器实例,代码就跑在容器中了
    [root@xujunk s21docker]#docker run -d  -p  9999:8080  指定你要运行的镜像id/名字 
    
    8.web端访问http://192.168.58.131:9999/ 成功访问
    
    
    • docker run解析:

    12推送本地镜像到docker hub 共有仓库

    • 流程图:

    • 代码流程

      1.登录docker账户
      [root@xujunk s21docker]#docker login
      2.修改docker镜像文件名字,以docker hub账号开头 
      [root@xujunk s21docker]#docker tag docker.io/redis xujunkai521/redis
      3.推送镜像到dockerhub仓库中,(注意这个是公共仓库)
      [root@xujunk s21docker]#docker push xujunkai521/redis
      
      

    13.私有docker仓库搭建(保证镜像安全)

    1.下载私有仓库镜像文件
    [root@xujunk s21docker]#
    docker run -d 
        -p 5000:5000     #   宿主机的端口(自定义,自己考虑去分配):容器内暴露的端口(django中写了 8000),flask 5000
        -v /opt/data/registry:/var/lib/registry 
        registry
    
        -p  表示端口映射
        -v  表示宿主机路径和容器内路径的映射
    2.修改docker的配置文件,支持推送非https的私有镜像 
    [root@xujunk s21docker]#cat /etc/docker/daemon.json  ,内容如下
    
    {
        "registry-mirrors": ["http://f1361db2.m.daocloud.io"],
        "insecure-registries": [
        "192.168.58.131:5000"
      ]
    }
        
    3.修改docker的启动文件,加载第二步,修改的配置文件
    [root@xujunk s21docker]#vim /lib/systemd/system/docker.service  #找到如下的[Service]  代码块,添加参数
    [Service]
    EnvironmentFile= -/etc/docker/daemon.json 
    4.修改了docker配置文件,重新加载docker
    [root@xujunk s21docker]#systemctl daemon-reload
    5.重启docker服务 
    [root@xujunk s21docker]#systemctl restart docker
    6.由于重启了docker,需要重新运行私有仓库的容器进程
    
    [root@xujunk s21docker]#docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
    
    --privileged=true  docker容器的安全机制:设置特权级运行的容器
    7.建立完私有云,就上传一波文件吧!
    [root@xujunk s21docker]#docker tag docker.io/hello-world 192.168.58.131:5000/hello-666
    #把hello-666镜像 上传到192.168.58.131:5000路径
    [root@xujunk s21docker]#docker pull 192.168.58.131:5000/hello-666
    
    8.查看浏览器:
    http://192.168.58.131:5000/v2/_catalog
    
    
    • hello-666上传到私有仓库

    如何要把文件下拉下来,执行下面命令:
    [root@xujunk s21docker]#docker pull 192.168.58.131:5000/hello-666
    
  • 相关阅读:
    for循环嵌套的原理
    php for循环|求1-100之间被3整除且被5不整除的偶数
    php 1-100之间能被3整除的数字之和;
    php判断某年某月有多少天
    关系运算符
    变量
    习题5-7 使用函数求余弦函数的近似值
    习题5-6 使用函数输出水仙花数
    习题4-11 兔子繁衍问题
    习题4-9 打印菱形图案
  • 原文地址:https://www.cnblogs.com/xujunkai/p/11566952.html
Copyright © 2020-2023  润新知