本博客将记录博主学习b站编程不良人的Docker的总结,虽然以前也有使用过docker,但都是一些最基本的用法,这次将会全面认真的学习Docker。
Docker学习总结(二)
Docker学习总结(三)

01:docker的引言

什么是docker

  • 官方定义:
  • 总结:Docker就是容器技术 ===> 应用容器技术 容器里面运行软件环境
  • Docker 使用 Google 公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及OverlayFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其他的隔离进程(操作系统隔离),因此也称其为容器。

为什么是docker

  • Docker将程序以及使用软件环境直接打包在一起,无论在哪个机器上都保证了环境一致
    一致的运行环境,更轻松的迁移
  • “服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了”
    对进程进行封装隔离,容器与容器之间互不影响,更高效的利用系统资源
  • “公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器”
    通过镜像复制N多个环境一致的容器

02:docker与传统虚拟机对比

docker与宿主机之间的结构对比.png

虚拟机缺点:

  • 虚拟机运行软件环境之前必须经自身携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是:
    虚拟内存 -> 虚拟物理内存 -> 真正物理内存

Docker优势

  • Docker是不携带操作系统的,所以Docker的应用就非常的轻巧
  • Docker引擎分配资源直接是 虚拟内存 ---> 真正物理内存

docker与传统虚拟机之间的区别.png

03:docker安装

注意windows10安装需要开启Hyper-V(1903版本以上无需开启)

  • docker在linux系统安装,或类unix系统,通用安装方式:bash脚本安装

    curl -fsSL get.docker.com -o get-docker.sh
    sudo sh get-docker.sh --mirror Aliyun
  • 启动、停止、重启docker服务

    systemctl status | start | stop | restart docker
  • 查看当前docker信息

    docker info
  • 配置docker开机自启动

    systemctl enable docker
  • 建立docker组 并使用root用户

    sudo groupadd docker
    sudo usermod -aG docker $USER
  • 测试docker安装是否正确

    docker run hello-world

04:Docker的核心概念和核心架构图

镜像 image images

  • 定义:一个镜像代表着一个软件,如:mysql镜像、redis镜像、nginx镜像
  • 特点:只读

    容器 container

  • 定义: 基于某个镜像运行一次就是生成一个程序实例,一个程序实例称之为一个容器
  • 特点:可读可写

    仓库 repository

  • 定义: 用来存储docker中所有镜像具体位置
  • 远程仓库:docker在世界范围维护一个唯一的远程仓库
  • 本地仓库:当前自己机器中下载镜像存储位置
    docker架构图.png

05:Docker配置镜像加速

  • 创建阿里云账号 -> 登录 -> 管理控制台 -> 在产品服务中搜索,容器服务在搜索列表中找到 容器镜像服务
  • 在打开页面中找到镜像加速器,并选择相应的系统,依次执行页面中的bash命令,例如我的ubuntu:
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
  • 通过docker info查询最后新增的镜像

06:Docker的helloworld应用

  • docker入门案例
    docker run hello-world

    docker run 镜像名

    根据run后面镜像运行一个容器,在运行之前先在自己的本地仓库中查找对应的镜像,找到直接使用,找不到自动取远程仓库下载。
    docker run 流程.png

07:Docker镜像中相关操作

辅助命令

docker info
docker version
docker --help || docker
docker [option] command(具体命令)

操作镜像Images的相关命令

  • 查看本地仓库中存在哪些镜像(+名字过滤)

    docker images [REPOSITORY]
    docker images -q (只显示镜像id)

    docker本地镜像.png

  • 下载新的镜像

    docker pull 镜像名称:版本号
    或者 docker pull 镜像名:@DIGEST(摘要)
  • 不通过dockerbub,通过命令行搜索需要镜像

    docker search mysql
  • 将打包tar镜像文件导入到自己的docker仓库中

    docker load -i 文件名
  • 删除镜像

    docker image rm REPOSITORY:TAG | ID
    docker image rm -f REPOSITORY:TAG | ID (强删,把容器也删掉)
    (简化)docker rmi REPOSITORY:TAG | ID
    docker rmi -f $(docker images -q) 删除所有镜像和容器

08:容器基本操作

  • 帮助命令
    docker run --help
  • 通过镜像运行一个容器
    docker run REPOSITORY:TAG | ID
  • 完整运行命令:启动容器 指定名称 后台运行 端口映射(-p xxxx:xxxx可以写多个)
    docker run -d(后台运行) -p 宿主机端口:容器端口 --name 别名 REPOSITORY:TAG | ID
  • 例子:
    docker run -d -p 3307:3306 --name mymysql mysql:5.7
  • 查看当前运行的容器
    docker ps

    docker-ps.png

    docker ps -a 查看所有容器(运行 & 非运行)
    docker ps -q 返回正在运行容器id
    docker ps -qa 返回所有容器的id
  • 开启/重启/停止/立即停止容器
    docker start/restart/stop/kill ID | NAMES
  • 删除容器
    docker rm ID | NAMES
    docker rm -f ID | NAMES   (删除正在运行的容器)
    docker rm -f $(docker ps -aq)   (删除所有容器)
  • 查看容器内服务运行的日志
    docker logs ID | NAMES
    docker logs -f ID | NAMES  (实时日志)
    docker logs -tf ID | NAMES  (加入时间戳实时日志)
    docker logs --tail n ID | NAMES  (查看容器尾部n行日志)
  • 查看容器内运行的进程
    docker top ID | NAMES
  • 产看容器的详细信息与细节
    docker inspect ID | NAMES
  • 与容器内部进行交互(进入容器)
    docker exec -it ID | NAMES bash   (进入容器,并与容器内部命令终端进行交互)
    exit 退出
  • 操作系统与容器的传输文件
    docker cp ID | NAMES : 容器内部资源路径 宿主机中路径 (从容器复制文件到宿主机)
    docker cp 文件 | 目录 ID | NAMES : 容器内部资源路径 (从宿主机复制文件到容器)

    数据卷 Volume

    docker-Volume

  • 作用:
    实现宿主机系统与容器之间的文件共享(关联映射)
  • 数据卷使用(自定义数据卷目录):
    docker run -d -p 8080:8080 --name tomcat01 -v 宿主机路径(绝对):容器内目录 tomcat:8.0-jre
  • 数据卷使用(自动数据卷目录):
    docker run -d -p 8080:8080 --name tomcat01 -v aa:容器内目录 tomcat:8.0-jre
  • 注意:
    1.aa代表一个数据卷名字,名称可以随便写,docker在不存在时自动创建这个数据卷同时自动映射宿主机中某个目录
    2.同时在启动容器时会将aa对应容器目录中全部内容复制到aa映射目录中
    3.自动创建的目录一般在/var/lib/docker/volumes下

    如果你对数据卷中宿主机的文件只进行读操作,建议用自动数据卷目录(主要对数据文件进行保护和备份,例如mysql、redis、es)
    如果你需要对数据卷中宿主机的文件进行写操作,建议用自定义数据卷目录
  • 将容器打包成一个新的镜像(可以通过docker images来查看)
    docker commit -m "描述信息" -a "作者信息" 容器id或名称 打包的镜像名称:标签
  • 生成tar文件
    docker save 镜像名:标签 xxxx.tar

    数据卷详细

  • 数据卷的特点:
    数据卷可以在容器之间共享和重用

    对数据卷的修改会立即影响到对应容器

    对数据卷的更新修改,不会影响镜像

    数据卷默认会一直存在,即使容器被删除
  • 设置容器对数据卷只读(宿主机可以改变数据卷,容器不可以)
    docker run -d -p 8990:8080 --name tomcat -v /root/apps:/usr/local/tomcat/webapps:ro tomcat:8.0-jre8
  • 数据卷相关操作
    docker volume ls    (查看所有数据卷)
    docker volume inspect 卷名       (查看某个数据卷的细节)
    docker volume create 卷名      (创建数据卷)
    docker volume rm 卷名     (删除某个数据卷)
    docker volume prune      (删除所有未使用的数据卷)
最后修改:2021 年 06 月 12 日