欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker 容器 ----介绍&安装&基本命令

程序员文章站 2024-02-02 10:38:22
...

Docker—入门详解、部署、镜像加速、基本命令

前言

  • Docker自2013年爆红以来,一直独领风骚,以下是我整理的一些Docker基础理论,个人感觉这些是以后玩Docker,K8S等的敲门砖,很基础,很重要!

一:DOCKER理论

1.1:什么是docker?有什么作用?

Docker 容器 ----介绍&安装&基本命令

  • Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。
  • 是一个开源的应用容器引擎,让开发者可以打包大门的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
  • 沙箱(Sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制
  • Docker在2013年一炮而红,直到现在,已经成为容器技术的代名词。
  • Docker从一开始就以提供标准化的运行时环境为目标,真正做到“build once, run anywhere”,可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了CaaS(容器即服务)技术。
  • Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。 namespace 资源隔离 cgroups 进程的资源限制 kvm 虚拟磁盘文件,资源隔离 kvm资源限制,–cpus --memory
  • docker主要组件有:镜像、容器、仓库, 网络,存储

1.2:Docker的使用场景

  • 打包应用程序简单部署
  • 可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云
  • 持续集成和持续交付(CI/CD):开发到测试发布
  • 部署微服务
  • 提供PAAS产品(平台即服务){OpenStack的云主机类似于阿里云的ECS,属于IAAS、Docker(K8S) 属于PAAS}

1.3: Docker的优势

  • 更快速的交付和部署

docker在整个开发周期都可以完美的辅助你实现快速交付。

docker允许开发者在装有应用和服务本地容器开发。可以直接集成到可持续开发流程中

docker容器的启动时间是秒级的,大量地节约了开发、测试、部署的时间

例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。

  • 高效的部署和扩容

docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、pc、服务器。

这种兼容性可以让用户把一个应用程序从平台直接迁移到另外一个

docker的兼容性和轻量型可以很轻松的实现负载的动态管理,可以快速扩容或者方便的下线应用和服务,趋近于实时

  • 更高的资源利用率

docker对系统资源的利用率很高,一台主机上可以同时运行数据个docker容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行10个不同的应用就要10个虚拟机,而docker只需要启动10个隔离的应用即可

  • 更简单的管理

使用docker,只需要小小的修改,就可以替代以往的大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理

1.4:Docker引擎(Docker Engine)

  • Docker Engine是具有以下主要组件的客户端-服务器应用程序:

  • 服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。

  • REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。

  • 命令行界面(CLI)客户端(docker命令)。

    Docker 容器 ----介绍&安装&基本命令

1.5:Docker的架构(Docker architecture)

  • Docker使用客户端-服务器架构。Docker 客户端与Docker 守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。

  • Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快

  • Docker Client:客户端

    • Docker客户端(docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker API。Docker客户端可以与多个守护程序通信。
  • Docker daemon:守护进程

    • Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。
  • Docker images:镜像

    • 容器可以被打包成镜像
  • Docker container:容器

  • Docker registry:镜像仓库

    • 存储镜像的地方,默认在公共的Docker Hub上查找,可以搞个人仓库。

    Docker 容器 ----介绍&安装&基本命令

1.6:容器与虚拟机的区别

  • Docker 容器 ----介绍&安装&基本命令

  • linux容器技术,容器虚拟化和kvm虚拟化的区别 kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)

  • linux开机启动流程: bios开机硬件自检 根据bios设置的优先启动项boot 网卡 硬盘 u盘 光驱 读取mbr引导 2T UEFI(gpt分区) mbr硬盘分区信息,内核加载路径, 加载内核 启动第一个进程/sbin/init systemd 系统初始化完成 运行服务(nginx,httpd,mysql) 。。。

  • 容器启动流程: 共用宿主机内核: 第一个进程直接启动服务(nginx,httpd,mysql)

  • 容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行linux系统

  • 虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统

  • 不同点 container VM
    启动速度 秒级 分钟级
    运行性能 接近原生(直接在内核中运行) 5%左右损失
    磁盘占用 MB GB
    数量 成百上千 一般几十台
    隔离性 进程级别 系统级别(更彻底)
    操作系统 主要支持Linux 几乎所有
    封装程度 只打包项目代码和依赖关系,共享宿主机内核 完整的操作系统,与宿主机隔离

1.7 : Docker的核心概念

  • image(镜像)

docker镜像就是一堆只读层的统一视角(统一文件系统技术能够将不同的层整合成为一个文件系统,为这些层提供一个统一的视角,在用户看来,只存在一个文件系统)

例如:一个镜像可以包含一个完整的操作系统环境,里面仅仅安装了Apache或用户需要的其他应用程序

镜像可以用来创建docker容器,一个镜像可以创建很多容器

docker提供了一个很简单的机制来创建镜像或者更新已有的镜像,用户也可以直接从其他人哪里下载一个已经做好的镜像来直接使用

  • repository(仓库)

仓库是集中存放镜像文件的场所。

有时候会把仓库和仓库注册服务器当作同一含义。实际上仓库注册服务器存放着很多仓库,每个仓库之间又包含了多个镜像,每个镜像又有不同的标签(tag)

仓库分为公开仓库(public)和私有仓库(private)两种形式。最大的公开仓库的Docker Hub,存放了数量庞大的镜像,提供用户下载。国内的公开仓库包括时速云、网易云等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库

当用户创建了自己的镜像之后就可以使用push命令将镜像上传到公有或者私有仓库中,这样下次可以在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了

Docker仓库概念和Git类似,注册服务器可以理解为GItHub这样的托管服务

  • container(容器)

Docker利用容器(container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序

容器的定义和镜像几乎一样,也是一堆层的统一视角,唯一的区别在于容器的最上面那一层是可读写的

一个运行当中的容器被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程

而正是文件系统隔离技术使得docker成为了一个非常有潜力的虚拟化技术。一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层

二: Docker安装与优化

  • #安装docker与镜像加速
    
    #!/bin/bash
    #安装最新版Docker依赖环境
    yum -y install yum-utils device-mapper-persistent-data lvm2
    #关闭防火墙与核心防护
    systemctl stop firewalld && systemctl disable firewalld
    setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    #网络优化
    echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
    sysctl -p
    systemctl restart network
    #设置阿里云镜像
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    #阿里云镜像加速
    mkdir /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://ye71id**.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    #安装Docker-Ce社区版
    yum -y install docker-ce 
    systemctl enable docker.service
    systemctl start docker.service
    if [ $? -eq 0 ];then 
    echo "docker已安装完成并优化完毕"
    fi
    systemctl status docker.service
    
    #注释
    ##"registry-mirrors": ["https://ye71id**.mirror.aliyuncs.com"] 设置为自己的阿里云账号加速器
    ##yum-utils 提供了yum-config-manager
    ##device mapper 存储驱动程序需要device-mapper-persistent-data和lvm2
    ##device mapper 是Linux2.6内核中支持逻辑卷管理的通用设备映射机制,它为了实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构
    

三: Docker基本操作

3.1: Docker镜像常用命令

  • docker version "查看docker版本"

  • docker search "搜索镜像"

  • docker images "查看镜像列表"

  • docker history "查看镜像制作历史"

  • docker inspect "查看镜像底层信息"

  • docker pull "下载镜像"

  • docker push "上传镜像"

  • docker rmi "删除本地镜像"

  • docker save "镜像另存为tar包"

  • docker load "使用tar包导入镜像"

  • docker tag "添加新镜像名称和标签"

  • #搜索,下载镜像
    [aaa@qq.com ~]# docker pull busybox
    [aaa@qq.com ~]# docker search nginx
    [aaa@qq.com ~]# docker pull nginx
    [aaa@qq.com ~]# docker images 
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              7e4d58f0e5f3        8 days ago          133MB
    busybox             latest              6858809bf669        9 days ago          1.23MB
    //8 days ago 表示该镜像是官网8天前更新的
    
  • #添加新镜像标签
    [aaa@qq.com ~]# docker tag nginx:latest nginx:web
    [aaa@qq.com ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              7e4d58f0e5f3        8 days ago          133MB
    nginx               web                 7e4d58f0e5f3        8 days ago          133MB
    busybox             latest              6858809bf669        9 days ago          
    [aaa@qq.com ~]# docker images|grep nginx
    nginx               latest              7e4d58f0e5f3        8 days ago          133MB
    nginx               web                 7e4d58f0e5f3        8 days ago          
    

    只留下一个别名的镜像才能用于删id,删除镜像

    #删除镜像;基于该镜像的容器正在使用,不支持删除 ;多个别名的镜像也不支持用id删除
    [aaa@qq.com ~]# docker rmi nginx:web 
    Untagged: nginx:web
    [aaa@qq.com ~]# docker images|grep nginx
    nginx               latest              7e4d58f0e5f3        8 days ago          
    [aaa@qq.com opt]# docker rmi nginx:latest 
    Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container 0b77b208ed1c is using its referenced image 7e4d58f0e5f3
    #批量删除容器后再删除镜像
    [aaa@qq.com opt]# docker ps -a | awk '{print "docker rm "$1}'|bash
    [aaa@qq.com opt]# docker rmi nginx
    Untagged: nginx:latest
    Untagged: nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
    Deleted: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d
    Deleted: sha256:eedfd37abc0b05520a719addf6675b372687fe9a2ed1746fa988335720d4376c
    Deleted: sha256:4f052ddd517f6dc5b74d2f7d881838b8ec6a5e67ec7a1da8bbbe91e1e068ad3a
    Deleted: sha256:5f78154d356577280e4ac0d9bf0d021d488828e57f953b011dcbadaecd539ce4
    Deleted: sha256:db5783668220e16186080f3e9d69ad748aab8c72abb8e457f6fc45369461634b
    Deleted: sha256:07cab433985205f29909739f511777a810f4a9aff486355b71308bb654cdc868
    [aaa@qq.com opt]# docker images|grep nginx
    #删除所有镜像
    docker image rm -f `docker image ls -q`
    
    #镜像保存到当前目录
    [aaa@qq.com ~]# cd /opt
    [aaa@qq.com opt]# docker save -o nginx nginx:latest 
    [aaa@qq.com opt]# ls -lh nginx 
    -rw-------. 1 root root 131M 9  19 07:52 nginx
    #从本地载入镜像
    [aaa@qq.com opt]# docker load < nginx 
    07cab4339852: Loading layer [==================================================>]  72.49MB/72.49MB
    f431d0917d41: Loading layer [==================================================>]  64.31MB/64.31MB
    60c688e8765e: Loading layer [==================================================>]  3.072kB/3.072kB
    eabfa4cd2d12: Loading layer [==================================================>]  4.096kB/4.096kB
    908cf8238301: Loading layer [==================================================>]  3.584kB/3.584kB
    Loaded image: nginx:latest
    [aaa@qq.com opt]# docker images|grep nginx
    nginx               latest              7e4d58f0e5f3        8 days ago          
    
    #上传镜像
    "改标签"
    docker tag nginx:latest abner/nginx:web		"用户名abner/仓库名:镜像名
    "登陆"
    docker logion
    Username: docker
    password
    Email: xxx@xxx.com
    "上传"
    docker push abner/nginx:web
    

3.2: Docker容器常用命令

  • docker create -it "创建容器;-i让容器的标准输入打开,-t让docker分配一个伪终端"

  • docker run "运行容器"

  • docker ps "查看容器列表"

  • docker stop "关闭容器"

  • docker start id "启动容器"

  • docker restart "重启容器"

  • docker attach|exec "进入容器"

  • docker inpect "查看容器底层信息"

  • docker top "查看容器进程列表"

  • docker export id > nginx-am "保存容器到本地"

  • cat nginx-am|docker import - nginx:web "从本地导入容器

  • docker rm "删除容器" "容器要先关闭,才能删除;"

  • #创建容器
    [aaa@qq.com ~]# docker create -it nginx:latest /bin/bash
    4f7d7bfc622c3e3ded410e1daee0b7c5e5c42d652bfa96f0bdeb23e4019257e8
    #查看容器
    [aaa@qq.com ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    4f7d7bfc622c        nginx:latest        "/docker-entrypoint.…"   8 seconds ago       Created                                 goofy_kowalevski
    "状态为Created"
    
    #启动容器
    [aaa@qq.com ~]# docker start 4f7d7bfc622c
    4f7d7bfc622c
    [aaa@qq.com ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    4f7d7bfc622c        nginx:latest        "/docker-entrypoint.…"   19 minutes ago      Up 4 seconds        80/tcp              goofy_kowalevski
    "状态为Up"
    [aaa@qq.com ~]# ifconfig
    docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
            inet6 fe80::42:8fff:feab:74ea  prefixlen 64  scopeid 0x20<link>
            ether 02:42:8f:ab:74:ea  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 16  bytes 1994 (1.9 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    "docker0为docker的内部网关"
    
    #启动执行命令查看系统根目录
    ##方法一
    docker pull paigeeworld/centos7
    docker create -it paigeword/centos7 /bin/bash
    docker start id
    ##方法二
    docker run paigeworld/centos7 /user/bin/bash -c ls /		"-c command 命令"
    "run完就直接释放了,状态为Exited"
    ##持续在后台执行
    docker run paigeworld/centos7 /user/bin/bash -c "while true;do echo hello;done"
    #终止运行
    docker stop id
    
    #启动容器
    docker start id
    #容器进入
    docker start id			"前提是容器UP状态"
    docker exec -it id /bin/bash		"exec进入"
    exit					"离开容器"
    
    #容器导出
    docker export id > nginx-am		"名称自定义"
    #容器导入
    cat nginx-am|docker import - nginx:web
    #删除容器
    docker rm id
    #批量删除容器
    docker ps -a | awk '{print "docker rm "$1}'|bash
    
  • 基于镜像的容器在,就删不掉镜像,除非把容器删掉,才能删除镜像

    #创建交互式容器
    docker container run -it id		 "i表示交互式  t表示开启新的终端"
    #创建守护式容器
    docker run -d --name="nginx" nginx:1.14		"-d  表示守护式   如果没有这个镜像会自动Pull 拉取命令
    
    #交互式的容器用于: 工具类: 开发,测试,临时性的任务()
    #守护式容器用于: 服务器上 网络服务
    #把容器的80端口映射到外部的8080端口提供外部访问
    docker container run -d -p 8080:80 --name="nginx" nginx:1.14
    docker container run -d -p 10.0.0.100:8081:80 --name='n3' nginx:1.14 "映射到外部801"
    
    #演示
    [aaa@qq.com ~]# docker container run -d -p 8080:80  nginx:latest
    0c2c73225b4a573dd8c521a10f36e9bd91b75dd4fed01c5dc8e2ab372bc968e8
    [aaa@qq.com ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    0c2c73225b4a        nginx:latest        "/docker-entrypoint.…"   6 seconds ago       Up 5 seconds        0.0.0.0:8080->80/tcp   naughty_euclid
    
    

    Docker 容器 ----介绍&安装&基本命令