Docker基础知识

Docker概念

Docker的理念

Docker是基于Go语言实现的云开源项目. Docker的主要目标是"Build, Ship and Run Any App, Anywhere", 也就是通过对应组件的封装, 分发, 部署, 运行等生命周期的管理, 使用户的APP(也可以是一个Web应用或数据库应用等)及其运行环境能够做到"一次镜像, 处处运行".

Linux容器技术的出现就解决了这样的一个问题, 而Docker就是在这个基础之上发展过来的. 将应用打成镜像, 通过镜像称为运行在Docker容器上面的实例, 而Docker容器在任何操作系统上都是一致的, 这就实现了跨平台, 跨服务器. 只需要一次配置好环境换到别的机子上就可以一键部署, 大大的简化了操作.

一句话解释就是, 解决了运行环境和配置问题的软件技术, 方便做持续集成并有助于整体发布的容器虚拟化技术.

虚拟机(virtual mashine)

虚拟机就是带环境安装的一种解决方案. 它可以在一种操作系统里面运行另一种操作系统, 比如Win10系统里面运行Linux系统CentOS7. 应用程序对此是毫无感知的, 因为虚拟机看上去和真实的系统一模一样, 而对于底层系统来说, 虚拟机就是一个普通的文件, 不需要就删除掉, 对其他部分毫无影响. 这一类虚拟机完美的运行了另一套 能够使应用程序, 操作系统和硬件三者之间的逻辑不变.

传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(例如: VirtualBox和VMWare等), 创建虚拟机(虚拟出各种硬件), 在虚拟机上安装操作系统, 再在从操作系统种安装部署各种应用.

虚拟机缺点:

  1. 资源占用多
  2. 冗余步骤多
  3. 启动慢

虚拟化技术

Linux容器(Linux Containers, 缩写为LXC)

Linux容器是与系统其他部分隔离开的一系列进程, 从另一个镜像运行, 并由改镜像提供支持进程所需的全部文件. 容器提供的镜像包含了应用的所有依赖, 因而在开发到测试再到生产的整个过程中,它都具有可移植性和一致性.

Linux容器不是模拟一个完整的操作系统而是对进程进行隔离,. 有了容器, 就可以将软件运行所需的所有资源打包到一个隔离的容器中. 容器与虚拟机不同, 不需要捆绑一整套操作系统, 只需要将软件工作所需的库资源和设置. 系统因此而变得高效轻量并保证部署在任何的软件中都能始终如一地运行.

Docker容器时在操作系统层面上实现虚拟化, 直接复用本地主机的操作系统, 而传统虚拟机则是在硬件层面实现虚拟化. 与传统的虚拟机相比, Docker优势体现为启动速度快, 占用体积小. Docker是内核级虚拟化.

VMDocker
Size
Startup
Integration复杂简单

Docker和传统虚拟机方式的不同之处:

  • 传统虚拟机技术是虚拟出一套硬件后, 在其上运行一个完整的操作系统, 在该系统上再运行所需应用进程.

  • 容器内的应用进程直接运行在宿主的内核, 容器内没有自己的内核且也没有进行硬件虚拟化,. 因此容器要必传统虚拟机更为轻便, 每个容器之间相互隔离, 每个容器有自己的文件系统, 容器之间进程不会相互影响, 能区分计算资源.

Docker官网

Docker Hub官网

Docker的基本组成:

  1. 镜像(image) ---- 类模板
  2. 容器(container) ---- 根据模板创建的实例
  3. 仓库(repository) ---- 存放类模板的仓库

Docker是一个C/S模式的架构, 后端是一个松耦合架构, 众多模块各司其职

Docker运行的基本流程为:

  1. 用户使用Docker Client与Docker Daemon建立通信, 并发送请求给后者
  2. Dockers Daemon作为Docker架构中的主体部分, 首先提供Docker Server的功能使其可以接受Docker Client的请求
  3. Docker Engine执行Docker内部的一系列工作, 每项工作都是以JOB的形式存在
  4. JOB的运行过程中, 需要容器镜像时, 则从Docker Registry中下载镜像, 并通过镜像管理驱动Graph driver将下载镜像以Graph的形式存储
  5. 当需要为Docker创建网络环境时, 通过网络管理驱动Network driver创建并配置Docker容器网络环境
  6. 当需要限制Docker容器运行资源或执行用户指令等操作时, 则通过Exec driver来完成
  7. Libcontainer是一项独立的容器管理包, Network driver以及Exec driver都是通过Libcontainer来实现具体对容器的操作

Docker安装

CentOS Docker安装

Docker并非是一个通用的容器工具, 它依赖于已存在并运行的Linux内核环境. Docker实质上是已经运行的Linux下制造一个隔离的文件环境, 因此他执行的效率几乎等同于所部署的Linux主机. 因此,Docker必须部署在Linux内核的系统上. 如果是其他系统想部署Docker就必须安装一个虚拟机Linux环境.

前提条件

目前CentOS仅发行版中的内核支持Docker. Docker运行在CentOS7(64-bit)上, 要求系统为642位, Linux系统内核版本为3.8以上

# 查询Linux内核版本
uname -r
# 查询系统版本
cat /etc/redhat-release

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRbgkzZY-1653230610374)(E:\学习笔记\Docker.assets\1649142423632.png)]

卸载旧版本

 sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安装gcc

首先要确保CentOS7能上外网

# 第一次安装可能会比较慢,之前安装过可以跳过这一步
yum -y install gcc
yum -y install gcc-c++

安装需要的软件包

# 安装Docker前需要先安装stable repository,而stable repository需要借助yum-utils
yum install -y yum-utils
# 安装stable repository(这里不建议使用官网的地址,因为官网上的是国外网站,经常会超时.建议使用国内的)
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引(可选)
yum makecache fast

安装Docker CE

# 我这边选择的是一路y安装下来的
yum install docker-ce docker-ce-cli containerd.io

启动Docker

# 执行命令后是没有任何反应的
systemctl start docker
# 查看Docker信息
docker version

hello-world

# 第一个docker程序
docker run hello-world

卸载

# 停docker服务
systemctl stop docker
# 移除docker文件
yum remove docker-ce docker-ce-cli containerd.io
# 移除docker配置文件
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

配置阿里云镜像加速

前提条件: 自己拥有一个阿里云的账号

加速器地址: 产品与服务 --> 弹性计算 --> 容器镜像服务 --> 镜像工具 --> 镜像加速器

# 创建一个文件夹路径
mkdir -p /etc/docker
# 将加速器地址写道json串中 
# https://*****.mirror.aliyuncs.com 这一部分为你自己的加速器地址
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://*****.mirror.aliyuncs.com"]
}
EOF
# 重新加载daemon
systemctl daemon-reload
# 重启docker服务
systemctl restart docker
# 检验是否正常
docker run hello-world

查找镜像逻辑:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fSrgm4X2-1653230610375)(E:\学习笔记\Docker.assets\1649165522838.png)]

Docker常用命令

帮助启动类命令

# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 开机启动
systemctl enable docker
# 查看docker概要信息
docker info
# 查看docker总体帮助文档
docker --help

镜像命令

# 列出本机所有镜像
docker images [OPTIONS]

# 表头说明:
# REPOSITORY: 表示镜像的仓库源
# TAG: 镜像的标签版本号
# IMAGE ID: 镜像ID
# CREATED: 镜像创建时间
# SIZE: 镜像大小

# 常用[OPTIONS]说明
# -a 列出本地所有的镜像(包括历史映像层)
# -q 只显示镜像ID

# 说明: 同一仓库源会有多个TAG版本, 代表这个仓库源的不同版本, 我们使用REPOSITORY:TAG来定义不同的镜像. 如果不指定一个镜像的版本标签, 例如你只使用ubuntu, docker默认使用ubuntu:latest镜像(即最新版)
# docker虚悬镜像: REPOSITORY和TAG都是<none>的镜像,俗称虚悬镜像dangling image.一般都会删掉
# 查找某个镜像
docker search [OPTIONS] 镜像的名称

# 表头说明:
# NAME: 镜像名称
# DESCRIPTION: 镜像说明
# STARS: 点赞数量
# OFFICIAL: 是否是官方
# AUTOMATED: 是否是自动构建

# 常用[OPTIONS]说明
# --limit 只列出指定N个镜像,默认25个
docker search --limit 5 redis

# 说明:一般使用官方的镜像
# 下载镜像
docker pull 镜像名称[:TAG]

# 上传镜像
docker push 镜像名称[:Tag]

# 说明: 同一仓库源会有多个TAG版本, 代表这个仓库源的不同版本, 我们使用REPOSITORY:TAG来定义不同的镜像. 如果不指定一个镜像的TAG, 例如你只使用ubuntu, docker默认使用ubuntu:latest镜像(即最新版)

# 拍照公式 用于将自己的容器修改成Repository指定格式的镜像,方便后期commit
docker tag 镜像:Tag Host:port/Repository:Tag
# 查看空间
docker system df 查看镜像/容器/数据卷所占的空间
# 删除镜像
docker rmi [OPTIONS] 镜像名字/ID

# 常用[OPTIONS]说明
# -f 强制删除 f为forced

# 删除单个
docker rmi -f 镜像ID
# 删除多个
docker rmi -f 镜像名字1:TAG 镜像名字2:TAG
# 删除全部
docker rmi -f $(docker images -qa)

容器命令

以下的命令都是在docker中pull了一个ubuntu镜像,容器的命令都在ubuntu中演示(centOS大一些200多兆, ubuntu70多兆)

# 新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 常用[OPTIONS]说明
--name="容器新名称"  # 为容器指定一个名称
-d 			   	   # 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)

# 以下两个即为启动交互式容器(前台有伪终端,等待交互)
-i				   # 以交互模式运行容器,通常与-t同时使用
-t  			   # 为容器重新分配一个伪输入终端,通常与-i同时使用

-P				   # 随机端口映射,大写P 
-p				   # 指定端口映射,小写p -p hostPort:containerPort -p 8080:80
# 举例:
# 运行docker里面的ubuntu镜像,返回一个bash命令窗口 使用exit可退出ubuntu
docker run -it --name=myubtu ubuntu bash
# 列出当前所有正在运行的容器
docker ps [OPTIONS]

# 常用[OPTIONS]说明
-a 				   # 列出当前所有正在运行的容器+历史上运行过的
-l				   # 显示最近创建的容器
-n 数量		      # 显示最近n个创建的容器
-q				   # 静默模式,只显示容器编号
# 退出容器
# 方式一: run进去容器,exit退出,容器停止
exit

# 方式二: run进去容器,Ctrl + p + q退出,容器不停止
Ctrl + p + q
# 启动已经停止运行的容器
docker start 容器ID或者容器名

# 重启容器
docker restart 容器ID或者容器名

# 停止容器
docker stop 容器ID或者容器名

# 强制停止容器
docker kill 容器ID或者容器名

# 删除已经停止的容器
docker rm 容器Id或者容器名

# 一次性删除多个容器实例(慎用)
docker rm -f ${docker ps -a -q}
docker pa -a -q | xargs docker rm

# 查看容器日志
docker logs 容器Id或者容器名

# 查看容器内运行的进程
docker top 容器Id或者容器名

# 查看容器内部细节
docker inspect 容器Id或者容器名

# 进入正在运行的容器并以命令行交换(推荐使用这个)
docker exec -it 容器Id或者容器名 /bin/bash

# 重新进入
docker attach 容器Id或者容器名

# 上面两个命令的区别
# attach直接进入容器启动命令的终端,不会启动新的进程.用exit退出会导致容器的停止
# exec是在容器中打开新的终端,并且可以启动新的进程.用exit退出不会导致容器的停止
# 一般是用-d后台启动,再用exec进入对应的容器实例

# 从容器内拷贝文件到主机上
docke cp 容器Id:容器内路径 目的主机路径

# 导入导出容器
# 导出
docker export 容器Id > 文件名.tar # 默认导出到当前路径

# 导入
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

Docker镜像

镜像是一种轻量级,可执行的独立软件包. 它包含运行某个软件所需的所有内容, 我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码, 运行时需要的库, 环境变量和配置文件等), 这个打包好的运行环境就是image镜像文件. 只有通过这个镜像文件才能生成Docker容器实例(类似与java中new一个对象出来)

镜像的分层概念

Docker镜像加载原理:

​ docker的镜像实际上由一层一层的文件系统组成, 这种层级的文件系统称为UnionFS. docker镜像的最底层是引导文件系统bootfs

镜像分层的优点:

镜像分层最大的一个好处就是资源共享, 方便复制迁移, 就是为了复用.

说明:

docker镜像层都是只读的, 容器层是可写的. 当容器启动时, 一个新的可写层被加载到镜像的顶部. 这一层通常被称作"容器层", “容器层"之下的都叫"镜像层”.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Qcpy6ea-1653230610375)(E:\学习笔记\Docker.assets\1652112078520.png)]

# docker commit 镜像的生成方法其一(另一个就是dockerfile)
docker commit -m="提交的描述信息" -a="作者" 容器Id 要创建的目标镜像名:[标签名]
# eg:ubuntu安装vim(原始的docker拉下来的ubuntu不带vim)
# 先把ubuntu拉下啦,进入到ubuntu容器内部
# 1,先更新包管理工具
apt-get update
# 2,然后安装我们需要的vim
apt-get install vim
# 3,commit我们安装了vim的镜像(在容器外执行)
docker commit -m="add vim cmd" -a="kiwi" 9834ea03baa2 kiwi/myubuntu:1.0
# docker images命令可以看到原始的ubuntu是70多兆,带vim的是170多兆

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QACgT2Oc-1653230610376)(E:\学习笔记\Docker.assets\1652199150170.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-scFCG3eB-1653230610376)(E:\学习笔记\Docker.assets\1652199200351.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JAcKBJgf-1653230610376)(E:\学习笔记\Docker.assets\1652199514066.png)]

Docker容器数据卷

容器卷:

卷就是目录或文件, 存在于一个或者多个容器中, 由docker挂载到容器, 但不属于联合文件系统, 因此能够绕过Union File System提供一些用于持续存储或者共享数据的特性: 卷的设计目的就是数据的持久化, 完全独立于容器的生存周期, 因此Docker不会再容器删除时删除其挂载的数据卷.
docker的容器卷有点类似于redis里面的Rdb和Aof文件. 将docker容器内的数据保存进宿主机的磁盘中.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKWq9H9s-1653231148949)(E:\学习笔记\Docker.assets\1652542373503.png)]在这里插入图片描述

# 运行一个带有容器卷存储功能的容器实例
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
# 命令解释
docker run -d -p 5000:5000 -v /kiwi/myregistry/:/tmp/registry --privileged=true registry
# -d 后台进程的方式启动registry镜像 
# -p 宿主机5000端口映射容器5000端口 
# -v 创建容器卷映射 可以多个 -v 宿主机路径:容器内路径(不指定的话就会在容器的/var/lib/registry目录下)
# --privileged=true 放开权限,宿主机和容器内部内容信息互通互联

作用:

我们将运用与运行的环境打包镜像, run后形成的容器实例运行, 但是我们对容器内产生的数据要求是需要持久化的. Docker容器产生的数据, 如果不备份, 那么当容器实例删除后, 容器内的数据自然也就没有, 为了能保存数据, 我们可以使用卷来实现.

特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 数据卷中的更改可以直接实时生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止
# 宿主机和容器之间映射添加容器卷 -v 可以挂载多个
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
# 上面的命令是默认的可读可写,容器内可以读可以写
# 容器内可读可写
# docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
# 容器内只读,宿主机写的内容会同步到容器内
# docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

# 查看数据卷是否挂载成功  Mounts下
docker inspect 容器id

# 卷的继承和共享
# 1,容器1完成和宿主机的映射 
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
# 2,容器2继承容器1的卷规则
docker run -it --privileged=true --volumes -from 父类 --name=名称 镜像名
# 说明:继承好规则之后,即使容器1停止了,容器2和宿主机之间数据还是可以正常交
# 互.容器1重新启动之后,容器1在停止这短时间内没有同步的数据,也会恢复过来.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值