• docker基本概念与部署和基础命令


    前言

    在这里插入图片描述

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

    一,Docker 概述

    1.docker 的基本概念

    • 1.是一种轻量级的“虚拟机”,Docker是一个用于开发,交付和运行应用程序的开放平台

    • 2.Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源

    • 3.在Linux容器里运行应用的开源工具——》容器引擎,让开发者可以打包大门的应用及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或者window机器中

    • 4.Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器

    • 5.Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱

    • 6.鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序

    • 7.Docker的设计宗旨:Build,Ship and Run Any App,Anywhere(在任何地方构建,发布和允许任何应用程序)

    • 8.即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统

    2.docker 的沙箱概念

    沙箱(Sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制

    1.沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响

    2.搭建测试环境,沙箱的应用只能访问自己的应用访问目录,而不能应用之间的资源进行共享,这样就形成了一个相对安全的机制,由于沙箱具有非常良好的独立性、隔离性,所以能够搭建一些具有高风险的软件进行测试,使得应用组件经过Docker的封装,可以随意移植到服务上

    3.容器化越来越受欢迎的原因

    • 灵活:即使是最复杂的应用也可以集装箱化
    • 轻量级: 容器利用并共享主机内核
    • 可互换:可以即时部署更新和升级
    • 便携式:可以在本地构建,部署到云,并在任何地方运行
    • 可扩展:可以增加并自动分发容器副本
    • 可堆叠:可以垂直和即时堆叠服务

    4.为什么会有docker出现

    • 以linux而言,linux操作系统会有一个主进程pid=1,派生出其他进程来控制不同服务
      例如:pid=2—python
         pid=3—java
         pid=4—php
      三个服务可能会相互影响
    • 使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本,一次延伸出能否将这三种服务分别封装起来,所以就有了kvm虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境,而随着技术发展,虚拟化技术开销较大(例如:只要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)由此,延伸出了容器技术,也就是docker等

    5.docker是啥

    • docker是基于容器技术的轻量级虚拟化解决方案
    • docker是容器技术,把linux的cgroup、namespaces等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行cli、api等)c/s
    • docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术( copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g
    5.1namespace 的六项隔离
    namespace系统调用参数隔离内容
    UTSCLONE_NEWUTS主机名与域名
    IPCCLONE_NEWWIPC信号量、消息队列和共享内存
    PIDCLONE_NEWPID进程编号
    NETWORKCLONE_NEWNET网络设备、网络栈、端口等
    MOUNTCLONE_NEWNS挂载点(文件系统)
    USERCLONE_NEWUSER用户和用户组(3.8以后的内核才支持)

    6.使用docker有什么意义

    • 实现了三个统一
    • docker引擎统一了基础设施环境-docker环境(引擎)―—》image —》封装一个简易的操作系统
    • docker引擎统一了程序打包(装箱/封装-类比于集装箱)方式-docker镜像(把引擎放在镜像中,带着镜像到处跑)—》images
    • docker引擎统一了程序部署(运行)方式-docker容器(利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了)——》基于镜像-》运行为容器(可运行的环境)
    • 镜像——>>封装的某一个时刻的服务/应用状态
    • 容器——>>应用跑起来的状态(正常提供服务的状态,运行时)
    • 实现了一次构建、多次、多处使用
    • 注:需要内核在3.8以上

    二、Docker与虚拟机机的区别

    • 容器在Linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量
    • 虚拟机运行的是一个完整的操作系统,通过虚拟的管理程序对主机资源进行虚拟访问,相比之下需要的资源更多
    • docker解决了vm的一个环境孤岛的问题
    • docker可以自定义传参(创建-创建镜像/容器、启动(基于镜像启动)之前)
    特性Docker容器虚拟机vmware sphere
    启动速度秒级(进程控制)分钟级(来宾操作系统管理)
    计算能力损耗几乎无损耗50%左右
    性能接近原生弱于
    系统支持量(单机)成百上千(进程)一般几十台(操作系统级别)
    隔离性资源隔离/限制 namespace/cgroup (进程级别)完全隔离 系统级别(更彻底)
    操作系统主要支持Linux(只需要支持引擎)几乎所有(吃宿主机操作系统的支持)
    磁盘占用MBGB (操作系统镜像2G)
    封装程度只打包项目代码和依赖关系,共享宿主机内核完整的操作系统,与宿主机I隔离

    三,docker的使用场景

    • K8s image镜像+ container容器的方式
    • war iar —》aithub aitlab 私有仓库(代码仓库)—》jenkins(测试)
      (应用程序封装/构建镜像)—》运维下载,使用容器技术进行运行/发布
    • 打包应用程序简单部署
    • 可以脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云
    • 持续集成和持续交付(CI/CD) :开发到测试发布
    • 部署微服务
    • 提供PAAS产品(平台即服务){OpenStack的云主机类似于阿里云的Ecs,属于IAAS、Docker (K8s) 属于PAAS}

    四,Docker的核心概念

    镜像一个面向Docker容器引擎的只读模板
    容器从镜像创建的运行实例
    仓库集中保留镜像的地方,分为共有仓库和私有仓库

    1、镜像

    • Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板

    • 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件

    • Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓

    2、容器

    • Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每–个容器都是相互隔离、互不可见,以保证平台的安全性

    • 可以把容器看做是要给简易版的1inux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序

      3、仓库

    • Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public) 或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取

    • 仓库分为

    公有仓库:Docker官方仓库

    私有仓库:个人化、私有化的仓库

    Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker 目录下

    总结:Docker是容器管理工具,容器由镜像创建而来,镜像从仓库中获取而来,仓库分为公有、私有

    CentOS安装Docker的两种方式

    • 1.使用CURL获得Docker的安装脚本进行安装

    • 2.使用YUM仓库来安装Docker

    五,Docker 安装

    #目前 Docker 只能支持 64 位系统
    #1.关闭防火墙
    [root@localhost ~]# systemctl stop firewalld
    [root@localhost ~]# systemctl disable firewalld
    [root@localhost ~]# setenforce 0
    
    #2.安装依赖包
    [root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 
    ##上面依赖环境解释
    1.yum-utils:提供了 yum-config-manager 工具
    2.device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构
    3.device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2
    ########################################################################
    
    #3.设置阿里云镜像源
    [root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
    
    #4.安装 Docker-CE 社区版并设置为开机自动启动
    [root@localhost ~]# yum install -y docker-ce docker-ce-cli containerd.io
    systemctl start docker.service
    systemctl enable docker.service 
    #安装好的Docker系统有两个程序,Docker.服务端和Docker客户端。其中Docker服务端是个服务进程,负责管理所有容器
    #Docker客户端则扮演着Docker.服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户揣运行在一·台机器上
    
    #5.查看 docker 版本信息
    [root@localhost ~]# docker version  或docker info
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    1.阿里云镜像加速

    1.申请加速器地址
    这里我们使用阿里云的镜像,加速镜像下载速度
    注册阿里云账号并登录

    image-20220109213613248

    搜索容器镜像服务

    image-20220109213752604

    查看操作文档

    image-20220109214140247

    image-20220109214212976

    image-20220109214422145

    2.网络优化

    开启路由转发 是让docker0能根据虚拟机ip为自己所有的docker容器分配虚拟ip

    [root@localhost docker]# vim /etc/sysctl.conf 
    [root@localhost docker]# sysctl -p
    net.ipv4.ip_forward = 1
    [root@localhost docker]# systemctl restart network
    [root@localhost docker]# systemctl restart docker
    ########################################################################
    vim /etc/sysctl.conf
    net.ipv4.ip_forward=1  #开启路由转发
    
    sysctl -p
    systemctl restart network
    systemctl restart docker
    
    #####################################################################
    #docker-server端配置文件daemon . json
    [root@localhost docker]# vim /etc/docker/daemon.json 
    {
    "graph" : " / data/docker" ,			#数据目录/var/ lib/docker
    "storage-driver" : "overlay2" ,			#存储引擎,早期的时候存储引擎使用的是aufs,现在是overlay2
    "insecure-registries": [ "registry.access.redhat.com" , "quary.io"]	#私有仓库
    "registry-mirrors" :[ "https :/lq"]		#镜像加速
    "bip": "172.17.0.1/24",					#docker网络
    "exec-opts" : [ "native.cgroupdriver=systemd" ],	#启动时候的额外参数(驱动,k8s使用)
    " live-restore" : true					#当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)
    }
    以上是建议的配置项
    docker容器网络生产经验
    docker 的网络建议和宿主机的iP"对照”
    比如宿主机 10.2.5.6容器的地址就可以修改为172.5.6.1,这样方便在故障发生时,更容易定位故障节点位置
    
    
    {
      "graph":"/data/docker",
      "storage-driver":"overlay2",
      "insecure-registries":["registry.access.redhat.com","quary.io"],
      "bip":"172.17.0.1/24",
      "exec-opts":["native.cgroupdriver-systemd"],
      "live-restore":true
    }
    [root@localhost docker]# systemctl daemon-reload
    [root@localhost docker]# systemctl restart docke
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    3.测试docker

    [root@nginx1 docker]# docker run hello-world
    
    • 1

    image-20220905142041148

    • 运行成功
    • docker images可以看到刚才下载的hello-world

    image-20220905142112086

    六,Docker 基础命令

    1.镜像操作

    1.1查看docker 版本
    • 显示 Docker 系统信息,包括镜像和容器数
    [root@localhost ~]# docker version  或docker info    #显示 Docker 版本信息
    
    • 1

    image-20220905150843403

    1.2搜索镜像
    docker search		//从Docker Hub查找镜像
    [root@localhost docker]# docker search nginx
    NAME	DESCRIPTION	 STARS	OFFICIAL	AUTOMATED
    
    #参数说明:
    NAME: 镜像仓库源的名称
    DESCRIPTION: 镜像的描述
    OFFICIAL: 是否 docker 官方发布
    stars: 类似 Github 里面的 star,表示点赞、喜欢的意思
    AUTOMATED: 自动构建
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1.3下载镜像
    docker pull 	//从镜像仓库中拉取或者更新指定镜像
    
    例:下载nginx
    [root@nginx1 docker]# docker pull nginx  #如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest标签
    
    • 1
    • 2
    • 3
    • 4
    1.4查看镜像列表
    [root@nginx1 docker]# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    nginx         latest    605c77e624dd   8 months ago    141MB
    
    #解释
    REPOSITORY    //镜像属于的仓库
    TAG           //镜像的标签信息,标记同一个仓库中的不同镜像
    IMAGE ID      //镜像的唯一ID号,唯一标识一个镜像
    CREATED       //镜像创建时间
    SIZE          //镜像大小
    
    #选项
    -a 				//列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
    --digests 		//显示镜像的摘要信息
    -f 				//显示满足条件的镜像
    --format 		//指定返回值的模板文件
    --no-trunc 		//显示完整的镜像信息
    -q 				//只显示镜像ID
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    image-20220905152632102

    1.5查看镜像信息
    [root@nginx1 docker]# docker inspect nginx    #获取容器,镜像的元数据 或根据镜像的唯一标识ID号,获取镜像详细信息
    镜像下载后存放在/var/lib/dodker
    Docker相关的本地资源存放在/var/lib/docker/日录下,其中containers
    日录存放容器信息,image日录存放镜像信息,overlay2
    目录下存放具体的镜像底层文件
    
    #查看下载的镜像文件信息
    [root@localhost docker]# cat /var/lib/docker/image/overlay2/repositories.json 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20220905152756393

    1.6添加镜像标签
    docker tag 		##标记本地镜像,将其归入某一仓库
    
    #例:
    [root@nginx1 docker]# docker tag nginx:latest nginx:q   
    [root@nginx1 docker]# docker images   #再次查看发现多出一个镜像
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    nginx         latest    605c77e624dd   8 months ago    141MB
    nginx         q         605c77e624dd   8 months ago    141MB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1.7删除镜像
    #格式:
    docker rmi 镜像名称
    docker rmi 镜像标签
    
    #可选项
    #注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像
    -f :强制删除
    
    #测试模板
    [root@nginx1 docker]# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    nginx1        latest    605c77e624dd   8 months ago    141MB
    nginx         j         605c77e624dd   8 months ago    141MB
    nginx         latest    605c77e624dd   8 months ago    141MB
    nginx         q         605c77e624dd   8 months ago    141MB
    hello-world   latest    feb5d9fea6a5   11 months ago   13.3kB
      
    #例:
    [root@nginx1 docker]# docker rmi nginx1 
    [root@nginx1 docker]# docker rmi nginx:j
    [root@nginx1 docker]# docker rmi -f hello-world:latest 
    
    [root@nginx1 docker]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    nginx        latest    605c77e624dd   8 months ago   141MB
    nginx        q         605c77e624dd   8 months ago   141MB
    
    #删除所有:
    docker rmi `docker images -q`
    
    #若只想删除centos7
    docker rmi `docker images |grep centos:7`
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    image-20220905160644922

    1.8镜像导出
    #格式:docker save -o	文件名 镜像名	//将指定镜像保存成 tar 归档文件
    #选项:
    -o :输出到的文件
    
    #例:
    [root@nginx1 docker]# docker save -o nginx1 nginx:latest 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20220905161023814

    1.9镜像导入
    导入镜像,可以异地导入,但是必须要有docker引擎,并且版本不可以差太多
    #格式:docker load < 存出的文件
    #可以选项 -i   docker load -i 存出的文件
    
    #例:
    [root@nginx1 docker]# docker images  ##查看一下镜像
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    nginx        latest    605c77e624dd   8 months ago   141MB
    nginx        q         605c77e624dd   8 months ago   141MB
    [root@nginx1 docker]# docker rmi nginx:latest   #删除原有镜像,测试导入
    [root@nginx1 docker]# docker load < nginx1   #导入后再次查看镜像就发现还原了
    
    #也可以将导出的镜像以scp方式导到别的服务器上,然后一样导入测试
    [root@nginx1 docker]# pwd
    /etc/docker
    [root@nginx1 docker]# scp nginx1 192.168.113.127:/opt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    image-20220905172808383

    1.10上传镜像

    默认上传到docker Hub 官方公共仓库,需要注册使用公共仓库的账号https://hub.docker.com

    可以使用docker login 命令米输入用户名、密码和邮箱米完成注册和登录

    在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用docker push命令进行上传

    docker tag nginx:latest nginx:q		#添加新的标签
    [root@nginx1 docker]# docker tag 605c77e624dd qjm1/nginx:q  要改为自己的账户名
    [root@nginx1 docker]# docker push qjm1/nginx:q 
    [root@nginx1 docker]# docker login    #登录公共仓库
    Username: qjm1   #就改为跟他一样的标签
    Password: 
    [root@nginx1 docker]# docker push qjm1/nginx:q
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    image-20220905191959076

    image-20220905191239952

    2.容器操作

    容器创建:就是将镜像加载到容器的过程

    • 新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器
    #新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
    
    #格式:docker create [选项] 镜像
    #常用选项:
    -i:让容器的输入保持打开
    -t:让 Docker 分配一个伪终端
    -it:合起来实现和容器交互的作用,运行一个交互式会话shell
    -d: 让Docker以后台守护进程运行
    #示例:
    docker create -it nginx:latest /bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2.1查询容器
    [root@nginx1 docker]# docker ps -a  
    docker ps -a
    --------------------------------------------------------------------------------
    CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS    PORTS     NAMES
    8b0a7be0ff58   nginx:latest   "/docker-entrypoint.…"   57 seconds ago   Created             inspiring_swanson
    
    容器的ID号	   加载的镜像     运行的程序               创建时间       当前的状态  端口映射  名称
    
    #可查看容器内进程信息
    [root@nginx1 docker]# docker container top 21ff89a79426 
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                11402               11383               0                   20:44               pts/0               00:00:00            /bin/bash
    
    #查看容器的日志信息,-f 为持续监控,-t 为更加详细显示
    [root@nginx1 docker]# docker container logs -ft 21ff89a79426
    2022-09-05T12:41:55.754558047Z [root@21ff89a79426 /]# eixt
    2022-09-05T12:41:55.754625103Z bash: eixt: command not found
    2022-09-05T12:42:00.957197185Z [root@21ff89a79426 /]# exit
    2022-09-05T12:42:00.957211833Z exit
    
    
    #选项:
    -a :			显示所有的容器,包括未运行的
    -f :			根据条件过滤显示的内容
    --format :		指定返回值的模板文件
    -l :			显示最近创建的容器
    -n :			列出最近创建的n个容器
    --no-trunc :	不截断输出
    -q :			静默模式,只显示容器编号
    -s :			显示总的文件大小
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    2.2创建容器
    [root@nginx1 docker]# docker create -it centos:7 /bin/bash #创建一个新的容器但不启动它
    
    #去查询容器会发现状态为Created
    [root@nginx1 docker]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                   PORTS     NAMES
    c5a06d3fefe9   centos:7       "/bin/bash"              About a minute ago   Created         
    cranky_franklin
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    2.3启动容器和停止
    #格式: docker start 容器ID		##启动一个或多个已经被停止的容器
    [root@nginx1 docker]# docker start 94aee325884f  #要停止就stop
    [root@nginx1 docker]# docker stop 94aee325884f
    
    #例:
    #再去查询状态会发现变成正在运行中
    [root@nginx1 docker]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                   PORTS     NAMES
    94aee325884f   nginx:latest   "/docker-entrypoint.…"   8 minutes ago   Up 20 seconds            80/tcp    condescending_shaw
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    image-20220905194106146

    2.4启动容器(一次性执行)

    可以直接执行docker run命令,等同于先执行docker create命令,再执行docker start命令

    注意:容器是一个与其中运行的sel1命令共存亡的终端,命令运行容器运行,命令结束容器退出

    docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker 容器是否正在运行的依据,如果docker容器中pid=1的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉

    • 当利用docker run来创建容器时,Docker在后台的标准运行过程是:

    (1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载
    (2)利用镜像创建并启动一个容器
    (3)分配一个文件系统给容器,在只读的镜像层外面挂载层可读写层
    (4)从宿主 主机配置的网桥接口中桥接一个虚拟机接口到容器中
    (5)分配一个地址池中的IP地址给容器
    (6)执行用户指定的应用程序,执行完毕后容器被终止运行

    #加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束
    
    #示例1:
    docker run -itd nginx:latest /bin/bash
    
    #示例2:执行后退出
    docker run centos:7 /usr/local/bash -c ls /   
    
    #示例3:执行后不退出,以守护进程方式执行持续性任务
    docker run -d centos:7 /usr/local/bash -c "while true;do echo hello;done" 
    
    #一次性运行centos:7并查看根
    [root@nginx1 docker]# docker run centos:7 /usr/bin/bash -c ls /
    
    #接着去查询状态会发现是退出状态
    [root@nginx1 docker]# docker ps -a
    CONTAINER ID   IMAGE      COMMAND           CREATED          STATUS                    PORTS     NAMES
    6a036e466e1a   centos:7   "/usr/bin/bash"   3 seconds ago    Exited (0) 1 second ago             objective_leakey
    
    #退出状态是因为没有设置守护进程,如果想要他持续运行,需要加上 -d,并给他一个持续性任务
    [root@nginx1 docker]# docker run -d centos:7 /bin/bash -c "whice true;do echo hello; done"
    
    #再去查看状态就会是正在运行
    [root@nginx1 docker]# docker ps -a
    CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS                       PORTS     NAMES
    a28917d35e70   centos:7   "/bin/bash -c 'while…"   4 seconds ago    Up 4 seconds                           dazzling_dijkstra
    
    
    #创建容器并持续运行容器
    [root@nginx1 docker]# docker run -itd --name test1 centos:7 /bin/bash
    [root@nginx1 docker]# docker ps
    CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS          PORTS     NAMES
    a934133b75e2   centos:7       "/bin/bash"              32 seconds ago      Up 31 seconds             test1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 选项
    -a stdin : 	指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    
    -d : 	后台运行容器,并返回容器ID;
    
    -i : 	以交互模式运行容器,通常与 -t 同时使用;
    
    -P : 	随机端口映射,容器内部端口随机映射到主机的端口
    
    -p :	 指定端口映射,格式为:主机(宿主)端口:容器端口
    
    -t : 	为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    
    --name="nginx-lb" :			 为容器指定一个名称;
    
    --dns 8.8.8.8 :	 			指定容器使用的DNS服务器,默认和宿主一致;
    
    --dns-search example.com :	 指定容器DNS搜索域名,默认和宿主一致;
    
    -h "mars" : 				指定容器的hostname;
    
    -e username="ritchie" : 	设置环境变量;
    
    --env-file=[] : 			从指定文件读入环境变量;
    
    --cpuset="0-2" or --cpuset="0,1,2" : 	绑定容器到指定CPU运行;
    
    -m :						设置容器使用内存最大值;
    
    --net="bridge" : 			指定容器的网络连接类型,支持 bridge/host/none/container : 四种类型;
    
    --link=[] : 				添加链接到另一个容器;
    
    --expose=[] : 				开放一个端口或一组端口;
    
    --volume , -v : 			绑定一个卷
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    2.5进入容器
    • 使用 run 登陆
    [root@nginx1 docker]# docker run -it centos:7 /bin/bash
    [root@dc200453a06b /]# 
    #若想退出则直接exit,但是容器会自动关闭
    [root@nginx1 docker]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                        PORTS     NAMES
    dc200453a06b   centos:7       "/bin/bash"              About a minute ago   Exited (127) 12 seconds ago             competent_ritchie
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 使用exec(容器必须为开启状态)
    [root@nginx1 docker]# docker start dc200453a06b  
    dc200453a06b
    [root@nginx1 docker]# docker exec -it dc200453a06b /bin/bash 
    [root@dc200453a06b /]# 
    
    • 1
    • 2
    • 3
    • 4
    • exec利和shell是两种运行模式
    • ps
      ①docker run -it会创建前台进程,但是会在输入exit后终止进程
      ②docker attach会通过连接 stdin ,连接到容器内输入输出流,会在输入 exit 后终止容器进程
      ③docker exec -it会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过 exit 退出容器,不影响容器运行
    从 主机(宿主机)把文件复制到容器中 *
    [root@nginx1 docker]# echo 123 > /opt/test.txt
    [root@nginx1 docker]# cd /opt
    [root@nginx1 opt]# cat test.txt 
    123
    
    [root@nginx1 opt]# docker cp /opt/test.txt a934133b75e2:/opt
    [root@nginx1 opt]# docker exec -it a934133b75e2 /bin/bash
    [root@a934133b75e2 /]# cd /opt
    [root@a934133b75e2 opt]# cat test.txt 
    123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    从 容器把文件复制到主机(宿主机)中 *
    [root@nginx1 opt]# docker exec -it a934133b75e2 /bin/bash
    [root@a934133b75e2 /]# cd /opt
    [root@a934133b75e2 opt]# echo 456 > /opt/a.txt
    [root@a934133b75e2 opt]# cat a.txt 
    456
    [root@a934133b75e2 opt]# exit
    
    [root@nginx1 opt]# docker cp a934133b75e2:/opt/a.txt /opt/b.txt
    [root@nginx1 opt]# cat /opt/b.txt 
    456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2.6容器导出

    用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移

    #格式:docker export 容器ID > 文件名
    
    #例:
    [root@nginx1 docker]# docker export dc200453a06b > centos7-1
    [root@nginx1 docker]# ls
    centos7-1  daemon.json  key.json  nginx1  文件名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20220905200832739

    2.7容器导入(生成镜像)
    #格式:docker import 导出的文件名(容器) 指定镜像名称
    
    #例:
    [root@nginx1 docker]# docker import centos7-1 centos:7-2
    [root@nginx1 docker]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    centos       7-2       5e6e3e6b791e   12 seconds ago   204MB
    
    #方法二
    #格式:cat 文件名 | docker import – 镜像名称:标签
    cat centos7tar | docker import - centos7:test			#导入后会生成镜像,但不会创建容器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    2.8删除容器
    #格式:docker rm 容器ID
    #例:
    [root@localhost opt]# docker rm adf09d4bda14 
    
    #强制删除容器(正在运行的)
    [root@localhost opt]# docker rm -f adf09d4bda14 
    
    #批量删除容器
    [root@nginx1 docker]# docker rm `docker ps -aq`
    
    
    
    #通过正则匹配批量删除容器
    docker ps -a I awk 'NR>=2(print "docker stop "$1)'I bash
    #批量停止容器
    
    docker ps -a awk 'NR>=2(print $1}'xargs docker stop
    docker ps -a I awk 'NR>=2(print "docker rm "$1)'I bash
    #批量删除所有容器
    
    docker ps -a I awk 'NR>=2(print $1}'xargs docker rm
    docker images I awk 'NR>=2(print "docker rmi "$3)'I bash
    #批量删除镜像
    
    docker images I grep none I awk '(print $3)'I xargs docker rmi
    #删除none镜像
    
    docker rm $(docker ps -a -q)
    #批量清理后台停止的容器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    2.9查询所有当前容器资源消耗信息
    [root@nginx1 docker]# docker stats
    
    • 1

    image-20220905203945039

    故障演示docker 日志满了 删除日志

    #1.创建测试容器
    [root@localhost ~]# docker run -itd --name test1 centos:7 /bin/bash
    
    #2.进入容器编写模拟故障脚本
    [root@localhost ~]# docker ps
    [root@localhost ~]# docker exec -it 4988373fbaa9 /bin/bash
    [root@4988373fbaa9 /]# vim 1.sh
    #!/bin/bash
    i=0
    while true
    do
    let i++
    echo "hello world $i"
    done
    [root@4988373fbaa9 ~]# chmod +x 1.sh
    [root@4988373fbaa9 ~]# ./1.sh
    
    
    #3.查看日志
    [root@localhost containers]# pwd
    /var/lib/docker/containers
    [root@localhost containers]# du -sh *  #此时磁盘空间应该瞬间爆满了
    
    #4.编写脚本删除日志,可以创建周期性任务什么时候执行一次
    [root@localhost containers]# vim 2.sh
    #!/bin/bash
    logs=$(find /var/lib/docker/containers/ -name *-json.log)
    for log in logs
    do
    cat /dev/null > $logecho " " > $log
    done
    [root@localhost containers]# chmod +x 1.sh
    [root@localhost containers]# ./1.sh
    
    #方法二,直接在配置文件里面限制
    ##设置docker日志文件数量及每个日志大小
     vim /etc/docker/daemon.json
    {
    "registry-mirrors": ["http://f613ce8f.m.daocloud.io"]"log-driver": "json-file",
    "log-opts": { "max-size" : "500m", "max-file" : "3"}
    }
    修改完需要重新加载  
    systemctl daemon-reload  
    systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    基于二次型性能指标的燃料电池过氧比RBF-PID控制
    论文精读--Learning Efficient Object Detection Models with Knowledge Distillation
    JVM-JVM中对象的结构
    06 【Sass语法介绍-函数】
    复制粘贴,快速将Python程序打包成exe
    移动通信网络规划:面、线、点覆盖规划
    QT快捷键
    配置 npm run-script 在 PowerShell 中运行
    2020java面试总结
    kafka简易搭建(windows环境)
  • 原文地址:https://blog.csdn.net/weixin_61269220/article/details/126887212