• Docker系列01—Docker 基础入门


    一、初识Docker和容器

    1.1 什么是docker

      容纳其他物品的工具,可以部分或完全封闭,被用于容纳、存储、运输物品。物体可以被放置在容器中,而容器则可以保护内容物。

    容器? 容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等。

    总结:

      与宿主机使用同一个内核,性能损耗小;

      不需要指令级模拟;

      容器可以在CPU核心的本地运行指令,不要要任何专门的解释机制;

      避免了准虚拟机和系统调用替换中的复杂性;

      轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机之间的资源共享。

    1.2 docker容器技术与传统虚拟机技术的比较

    1.3 要使用容器必须需要在内核级支持2种技术

      namespace 名称空间

      cotrol group(cgroup) 控制组

     

      为什么centos6版本不能使用容器?

      因为centos6的内核版本是2.6;容器需要一个user的名称空间,知道内核版本3.8才有:

       

      control group(cgroup)

        blkio: 块设备

        cpu: CPU

        cpuacct: CPU资源使用报告

        cpuset: 多处理平台上的CPU集合

        devices: 设备访问

        memory: 内存用量及报告

        perf_event: 对cgroup中的任务进行统一性能测试

        net_cls: cgroup中的任务创建的数据报文的类别标识符

     

     

    1.4 docker介绍

      Docker是一个开放源代码软件项目,让应用程序布署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。

      Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施。

      依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。”

     

     

    1.5 docker运行架构

     

     


     


    二、安装启动Docker

    2.1 安装环境

      1)依赖的基础环境:

      - 64位CPU

      - Linux kernel(内核) 3.10+

      - Linux kernel cgroups and namespaces

     

      2) 查询自己服务器的状态

      使用的服务器版本

    [root@docker ~]# cat /etc/redhat-release
    CentOS Linux release 7.5.1804 (Core) 

       内核版本

    [root@docker ~]# uname -r
    3.10.0-862.el7.x86_64

      ip地址【这里使用的是腾讯云,不显示公网】

    [root@docker ~]# hostname -I
    172.17.32.10

    2.2 安装docker

    2.2.1 使用官方安装脚本自动安装 【缺点:不能安装自定义版本】

    [root@docker ~]# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
    

    2.2.2 Centos7 【使用yum安装,推荐】

    # 1. 添加docker-ce源信息
    [root@docker ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
    
    
    
    # 2. 修改docker-ce源
    [root@python ~]# sed -i 's@download.docker.com@mirrors.tuna.tsinghua.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo
    
    
    # 3. 更新并安装docker-ce 【安装的默认是最新版本】
    [root@docker ~]# yum makecache fast
    [root@docker ~]# yum -y install docker-ce
    

     =====安装指定版本的docker====

      1,查看都有那些版本

    [root@docker ~]# yum list docker-ce.x86_64 --showduplicates | sort -r   

     

      2,下载指定版本,我在这里下载的稳定版本

     

    [root@docker ~]# yum -y install docker-ce-17.03.2.ce
    


    2.3 升级docker 【需要了解】

    2.3.1 查找主机上关于docker的软件包

    [root@docker ~]# rpm -qa |grep docker
    python36-docker-pycreds-0.2.1-2.el7.noarch
    python36-dockerpty-0.4.1-10.el7.noarch
    python36-docker-2.6.1-3.el7.noarch
    docker-client-1.13.1-103.el7.x86_64
    docker-1.13.1-103.el7.x86_64
    docker-compose-1.13.1-103.el7.noarch
    

    2.3.2 使用yum remove 卸载软件 【docker-client,docker-commen,docker-版本号】

    [root@docker ~]# yum remove docker-client-1.13.1-103.el7.x86_64
    [root@docker ~]# yum remove docker-1.13.1-103.el7.x86_64
    [root@docker ~]# yum remove docker-compose-1.13.1-103.el7.noarch
    

    2.3.3 使用curl 升级到最新版本 / 或者使用yum的方式

    [root@docker ~]# curl -fsSL https://get.docker.com/ | sh
    
    
    

    2.3.4 在线升级docker后出现的问题

    【问题】: 原本启动的容器无法被启动,显示

     

    Error response from daemon: Unknown runtime specified docker-runc
    

    【解决】:

     

    [root@docker ~]# grep -rl ‘docker-runc’ /var/lib/docker/containers/
    [root@docker ~]# grep -rl 'docker-runc' /var/lib/docker/containers/ | xargs sed -i 's/docker-runc/runc/g'
    [root@docker ~]# systemctl restart docker

     

    2.4 启动docker

    2.4.1 配置docker镜像加速 【docker cn 加速】

    [root@docker ~]# mkdir -p /etc/docker
    [root@docker ~]# tee /etc/docker/daemon.json <<-'EOF'
    {
       "registry-mirrors": ["https://registry.docker-cn.com"] 
    } 
    EOF
    

    2.4.2 配置docker镜像加速 【阿里云】

    1. 注册阿里云账号,专用加速器地址路径:

         https://cr.console.aliyun.com/#/accelerator

    1. 配置镜像加速地址

     

    [root@docker ~]# mkdir -p /etc/docker
    [root@docker ~]# tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
    }
    EOF
    
    # 修改配置文件后需要重载配置文件和重启容器
    [root@docker ~]# systemctl daemon-reload
    [root@docker ~]# systemctl restart docker
    

    2.4.3 启动docker服务

    # 1.重新加载docker的启动配置 【一般在修改了daemon.json文件后使用】
    
    [root@docker ~]# systemctl daemon-reload
     
    
    
    # 2. 将docker设置为开机自启
    
    [root@docker ~]# systemctl enable docker
     
    
    
    # 3.  启动/重启docker服务
    
    [root@docker ~]# systemctl start docker
    [root@docker ~]# systemctl restart docker
     
    

      

       -查看docker版本-

     

    [root@docker ~]# docker version
    Client: Docker Engine - Community
     Version:           19.03.8
     API version:       1.40
     Go version:        go1.12.17
     Git commit:        afacb8b
     Built:             Wed Mar 11 01:27:04 2020
     OS/Arch:           linux/amd64
     Experimental:      false
    
    Server: Docker Engine - Community
     Engine:
      Version:          19.03.8
      API version:      1.40 (minimum version 1.12)
      Go version:       go1.12.17
      Git commit:       afacb8b
      Built:            Wed Mar 11 01:25:42 2020
      OS/Arch:          linux/amd64
      Experimental:     false
    

      

    
    

     


     


    三、Docker的基础命令

    3.1 镜像操作

    3.1.1 搜索官方仓库的镜像

    [root@docker ~]# docker search nginx
    

      

    搜索结果:

     

     

    参数

     

    说明

     

    NAME

     

    镜像名称

     

    DESCRIPTION

     

    镜像描述

     

    STARS

     

    点赞数量(认同)

     

    OFFICIAL

     

    是否为官方

     

    AUTOMATED

     

    是否是自动构建

     

     

    3.1.2 拉取镜像

    1. 不带版本号默认拉取最新版本

    [root@docker ~]# docker pull nginx
    Using default tag: latest [root@docker ~]# docker pull busybox
    Using default tag: latest
    1. 带版本号即拉取指定服务版本

    [root@docker ~]# docker pull nginx:1.17.0-alpine
    1.17.0-alpine: Pulling from library/nginx
    1. 查看当前主机的镜像列表【这两种一样】

    [root@docker ~]# docker images
    [root@docker ~]# docker image ls
    1. 【说明:】 有两种实用的镜像:

        BusyBox : 集成了一百多个最常用的linux命令的精简工具箱,不到2M。被称为'linux系统的瑞士军刀'。

        Alpine : 面向安全的轻型linux发行版,关注安全,性能和资源效能。

     

    3.1.3 导出镜像

    [root@docker~]# docker image save busybox > save-busybox.tar.gz
    [root@docker ~]# ll save-busybox.tar.gz
    -rw-r--r-- 1 root root 1446400 Mar 27 17:13 save-busybox.tar.gz
    
    [root@docker ~]# docker image save -o /tmp/nginx_busybox.tar.gz busybox nginx
    [root@docker ~]# ll /tmp/nginx_busybox.tar.gz
    -rw------- 1 root root 155635200 Mar 27 18:20 /tmp/nginx_busybox.tar.gz

    【参数说明: 】

    · -o : 指定导出镜像的位置;

    · 可以指定多个镜像打包为一个文件;

    · 指定为.tar.gz的文件,可以解压。

     

    3.1.4 删除镜像 【两种方式一样】

    [root@docker ~]# docker rmi busybox
    Untagged: busybox:latest [root@docker ~]# docker image rm busybox
    Untagged: busybox:latest

     

    3.1.5 导入镜像

    [root@docker ~]# docker load -i save-busybox.tar.gz
    a6d503001157: Loading layer [==================================================>] 1.437MB/1.437MB Loaded image: busybox:latest

     

    3.2 容器操作

    3.2.1 启动容器

    docker run 镜像名
    
    eg: docker run [options] image [command] [arg..]
    
     
    
    options 常用命令选项:
    
    · -t : 打开一个终端,想使用交换机一样使用容器
    
    · -i : 以交互模式运行容器,通常与 -t 同时使用
    
    · --name : 为启动的容器起一个名字
    
    · --network : 为启动的容器指定一个网络
    
    · --rm : 容器一但停止,自动删除【一般用于测试】
    
    · -d : 后台运行
    
    容器,并返回容器ID
    
    · -a : 指定标准输入输出内容类型,可选【stdin | stdout | stderr】
    
    · -h : 指定容器的hostname
    
    · -t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用
    
    · -e : A="b",设置环境变量
    
    · --env-file=[] : 从指定文件读入环境变量
    
    · -m : 设置容器使用内存的最大值
    
    · --net="" : 指定容器的网络连接类型,支持【bridge|host|none|container】类型
    
    · --link=[] : 添加链接到另一个容器
    
    · --expose=[] : 开放一个端口或一组端口
    
    · --volume , -v : 绑定一个卷
    
    · -P : 随机端口映射,容器内部端口随机映射到主机的高端口
    
    · -p :指定端口映射,格式为:【主机(宿主)端口:容器端口】
    
    · -dns 8.8.8.8 : 指定容器使用的DNS服务器,默认和宿主机一致
    
    · -dns-search example.com : 指定容器DNS搜索域名,默认和宿主一致
    

      

    示例:运行一个容器

     

    [root@docker ~]# docker run -d --name web01 -p 1234:80 nginx:1.17.0-alpine
    339995b22002ffaad4b86014608bd58818dafc6a942bb945c44a75a3411e3f0a [root@docker ~]# docker port web01 # 查看端口映射情况
    80/tcp -> 0.0.0.0:1234 #将容器的80/tcp端口,映射到宿主机的1234端口 [root@python ~]# docker ps -a # 显示全部容器状态 [root@python ~]# docker ps # 只显示运行的容器

     

    参数说明:

      CONTAINER ID: 容器的专属ID

      IMAGE: 基于哪一个进项启动的

      COMMAND: 服务运行的命令【后面详解】

      CREATED: 创建时间,距离当前时间

      STATUS: 容器的状态,up为运行,down为关闭

      PORTS: 容器的映射端口

      NAME: 容器的专属别名

     

    示例:运行一个容器并进入

    [root@docker ~]# docker run -it --name busybox_01 busybox /bin/sh
    / # ls bin dev etc home proc root sys tmp usr var / # exit 退出进入的容器 [root@docker ~]#
    
    

    3.2.2 停止运行中的容器

    docker stop 关闭运行的容器
    
    docker kill 杀死运行的容器

     

    3.2.3 激活关闭中的容器

    # docker start
    
     
    [root@docker ~]# docker start busybox_01
    busybox_01

     

    3.2.4 查看容器的详细信息

    [root@docker ~]# docker inspect web01      显示详细信息
    [root@docker ~]# docker inspect web01 | grep 'IPAddress'
    "SecondaryIPAddresses": null, "IPAddress": "172.18.0.2", "IPAddress": "172.18.0.2",

      

    3.2.5 删除容器

     

    [root@docker ~]# docker kill web01          先关闭
    web01 [root@docker ~]# docker rm web01 再删除
    web01 [root@docker ~]# docker rm -f busybox_01 先关闭再删除
    busybox_01 [root@python ~]# docker rm -f `docker ps -a -q` 删除所有容器, -f 强制删除

    3.2.6 对运行的容器执行指定命令exec

    [root@docker ~]# docker exec 
    [root@docker ~]# docker container exec
    格式
    
    Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    
    options 选项
    
    · -d : 在后台运行命令
    
    · -e : 设置环境变量
    
    · -i : 交互式
    
    · -t : 打开一个终端
    
    · -u : 用户名或UID
    

     

    示例:

    [root@docker ~]# docker run -d -p 1234:80 --name web01 nginx:1.17.0-alpine
    · 在容器外部执行命令[查看ip] [root@docker ~]# docker exec web01 ip a |grep '172'
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0 

     

    3.2.7 查询容器内部日志

    [root@docker ~]# curl 0.0.0.0:1234
    [root@docker ~]# docker logs web01
    172.18.0.1 - - [31/Mar/2020:06:09:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
    
    

    3.2.8 图形总结命令

     

    3.3 补充操作

     

    # 类似于linux的 df 命令,用于查看Docker的磁盘使用情况
    [root@docker ~]# docker system df
    TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 54 6 12.41GB 11.84GB (95%) Containers 6 5 199B 0B (0%) Local Volumes 3 2 146.9MB 15B (0%) Build Cache 0 0 0B 0B # 用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像) [root@docker ~]# docker system prune # 清理的更加彻底,可以将没有容器使用的Docker镜像都删除掉(慎重!) [root@docker ~]# docker system prune -a
    
    

     


     


  • 相关阅读:
    vue part1 基础
    【转载】NBU异机恢复oracle
    【转载】跨域请求
    [转载] django contenttypes
    rest_framework setting
    rest_framework 视图/路由/渲染器/认证授权/节流
    【转载整理】 mysql百万级数据库分页性能
    rest_framework 分页
    rest_framework 序列化
    django middleware
  • 原文地址:https://www.cnblogs.com/ic-wen/p/13522112.html
Copyright © 2020-2023  润新知