Docker最新超详细版教程通俗易懂(基础版)

Docker概述

  1. 概念:容器虚拟化技术,系统平滑移植,解决了运⾏环境和配置问题的软件容

器,⽅便做持续集成并有助于整体发布的容器虚拟化技术

  1. 意义:Docker的出现使得Docker得以打破过去程序即应⽤的观念,透过镜像将

作业系统核⼼除外,运作应⽤程序所需要的系统环境,由下⽽上打包,达到应

⽤程序跨平台间的⽆缝接轨运作

  1. ⽬标:Docker的主要⽬标就是通过对应⽤组件的封装、分发、部署、运⾏等⽣

命周期的管理,使⽤户的APP及其运⾏环境能够做到"⼀次镜像,处处运⾏",

只需要⼀次配置好环境,换到别的机⼦上就可以⼀键部署好,⼤⼤简化了操

作。

  1. ⾯试题:容器与虚拟机⽐较

a. 传统虚拟机技术

虚拟机就是带环境安装的⼀种解决⽅案,它可以在⼀种操作系统⾥⾯运⾏另⼀
种操作系统,⽐如在Window10系统⾥⾯运⾏Linux系统CentOS7。应⽤程序对此
毫⽆感知,因为虚拟机看上去跟真实系统⼀模⼀样,⽽对于底层系统来说,虚拟机
就是⼀个普通⽂件,不需要了就删除,对其他部分毫⽆影响。这类虚拟机完美的运
⾏了另⼀套系统,能够使应⽤程序、操作系统和硬件三者之间的逻辑不变。
虚拟机的缺点:1.资源占⽤多 2.冗余步骤多3.启动慢

b. 容器虚拟化技术

Linux容器是与系统其他部分隔离开的⼀系列进程,从另⼀个镜像运⾏,并由该
镜像提供⽀持进程所需的全部⽂件,容器提供的镜像包含了应⽤的所有依赖性项,
因⽽在从开发到测试再到⽣产的整个过程中,都具有可移植性和⼀致性
Linux容器不是模拟⼀个完整的操作系统⽽是对进程进⾏隔离。有了容器就可以
将软件运⾏所需的所有资源打包到⼀个隔离的容器中。容器与虚拟机不同,不需要捆绑⼀整套操作系统,只需要软件⼯作所悟的库资源和设置,系统因此⽽变得⾼效轻量并保证部署在任何环境中的软件都能始终如⼀地运⾏。
Docker容器是在操作系统层⾯上实现虚拟化,直接复⽤本地主机的操作系统,
⽽传统虚拟机则是在硬件层⾯实现虚拟化。与传统的虚拟机相⽐,Docker优势体现在启动速度快、占⽤体积⼩。

Docker安装

  1. docker官⽹:http://docker.com

  2. Docker Hub官⽹:https://hub.docker.com/

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo systemctl start docker
ps - ef|grep docker
  1. 安装步骤

a. 确定你是centOS7及以上版本

cat /etc/redhat-release

b. 卸载旧版本

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

c. yum安装gcc相关

yum -y install gcc
yum -y install gcc-c++

d. 安装需要的软件包

yum install -y yum-utils

e. 设置stable镜像仓库 – 不要⽤官⽹的镜像仓库,那个是国外的,⽤国内的镜像仓库速度⽐较快

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

f. 更新yum软件包索引

yum makecache fast

g. 安装DOCKER CE

yum -y install docker-ce docker-ce-cli containerd.io

h. 启动docker

systemctl start docker

i. 测试

yum -y install gcc
yum -y install gcc-c++

j. 卸载

systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
  1. 阿⾥云镜像加速

直接打开⽹址,点击控制台,选择容器镜像服务,选择镜像⼯具,获取镜像加速器地址,粘贴脚本直接执⾏。

**https://promotion.aliyun.com/ntms/act/kubernetes.html

Docker基本组成

  1. 三要素:镜像文件、容器实例、仓库
  2. 镜像文件,image文件生成的容器实例,本身也是一个文件,称为镜像文件
  3. 容器实例,一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
  4. 仓库就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。
  5. 镜像文件:Docker镜像就是一个只读的模板,Docker镜像可以用来创建Docker容器,一个镜像可以创建很多容器。Docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
  6. 容器实例:从面向对象的角度看,Docker利用容器独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例,容器是镜像运行时的实体,容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
  7. 仓库:是集中存放镜像文件的场所
  8. Docker公司提供的官方仓库被称为Docker Hub(https://hub.docker.com/),存放各种镜像模板的地方。

Docker底层原理

  1. Docker有着比虚拟机更少的抽象层,由于docker不需要跟虚拟机一样实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上docker将会在效率上有明显优势。
  2. docker利用的是宿主机的内核,而不需要加载操作系统OS内核
Docker容器虚拟机VM
操作系统与宿主机共享OS宿主机OS上运行虚拟机OS
存储大小镜像小,便于存储与传输镜像庞大
运行性能几乎无额外性能损失操作系统额外的CPU、内存消耗
移植性轻便、灵活,适用于Linux笨重,与虚拟化技术耦合度高
硬件亲和性面向软件开发者面向硬件运维者
部署速度快速,秒级较慢,10s以上

Docker常⽤命令

  1. 帮助启动类命令
//启动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命令帮助文档
docker 具体命令 --help
  1. 镜像命令
//列出本地主机上的镜像,参数说明:

//REPOSITORY表示镜像的仓库源
//TAG表示镜像的标签版本号
//IMAGE ID表示镜像ID
//CREATED表示镜像的创建时间
//SIZE表示镜像大小
//同一仓库源可以有多个TAG版本,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG来定义不同的镜像
// -a:列出本地所有的镜像
// -q:只显示镜像ID

docker images

//寻找仓库中的hello-world镜像
docker search helllo-world

//后面没有加标签版本号TAG的话,默认是最新版本
docker pull hello-world

在这里插入图片描述

//查看镜像/容器/数据卷所占的空间
docker system df

//删除镜像文件
docker rmi 某个xxx镜像名字ID
//强制删除镜像文件
docker rmi -f 某个xxx镜像名字ID
//删除全部
docker rmi -f $(docker images -qa)
虚悬镜像:仓库名、标签都是<none>的镜像

  1. 容器命令
//新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
//举例:以交互模式启动一个容器,在容器内执行/bin/bash命令
// -i:交互式操作
// -t:终端
// ububtu:ubuntu镜像
// /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式Shell,因此用的是/bin/bash
// 要退出终端,直接输入exit
docker run -it ubuntu /bin/bash
[OPTIONS]常用说明
	--name="容器新名字" --> 为容器指定一个名称
	-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行)

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

	-P:随机端口映射,大写P
	-p:指定端口映射,小写p
    	端口映射 -p 8080:80

//-a	列出当前所有正在运行的容器+历史上运行过的
//-l	显示最近创建的容器
//-n	显示最近n个创建的容器
//-q	静默模式,只显示容器编号
docker ps [options]
//run进去容器,exit退出,容器停止
1.exit
//run进去容器,ctrl+p+q退出,容器不停止
2.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)
  1. 容器命令 - 重要

有镜像才能创建容器,这是根本前提!!!

在大部分场景下,我们希望docker的服务是在后台运行的,我们可以通过 -d 指定容器的后台运行模式
docker run -d 容器名
docker logs 容器ID
docker inspect 容器ID
docker top 容器ID
//启动类容器后退出,然后想重新进去,就用这个命令
docker exec -it 容器ID bashShell
//第二种方式
docker attach 容器ID

两种方式的区别:
exec是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器的停止
attach直接进入容器启动命令的终端,不会启动新的进程用exit退出,会导致容器的停止
容器 -> 主机
docker cp 容器ID:容器内路径 目的主机路径
export导出容器的内容流作为一个tar归档文件[对应import命令]
import从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]

docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

Docker镜像分层

  1. 镜像:是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件
  2. 只有通过这个镜像文件才能生成Docker容器实例(类似于Java中new出来一个对象)
  3. Docker分层镜像:Union文件系统是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。 Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
  4. 重点理解:Docker镜像层都是只读的,容器层是可写的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作容器层,容器层之下的都是镜像层
  5. Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似于java继承于一个Base基础类,自己再按需扩展。新镜像是从base镜像一层一层叠加生成的,每安装一个软件,就在现有镜像的基础上增加一层。

Docker commit

  1. docker commit 提交容器副本使之称为一个新的镜像
docker commit -m = "提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
//举例
docker commit -m="安装vim镜像" -a="zyt"  容器ID 要创建的目标镜像名:1.0
  1. 小总结:Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似java继承于一个Base基础类,自己再按需扩展,新镜像是从base镜像一层一层叠加生成的,每安装一个软件,就在现有镜像的基础上增加一层。

docker仓库

  1. 存放到阿里云仓库:https://cr.console.aliyun.com/repository/cn-hangzhou/zyt-private/myubuntu/details
  2. 存放到Docker Hub地址:https://hub.docker.com/,Docker Registry是官方提供的工具,可以用于构建私有镜像仓库

容器数据卷

  1. 有个坑 — 容器卷记得加入

--privileged=true

Docker挂载主机目录访问如果出现cannot open directory .: Permission denied

解决办法:在挂载目录后多加一个–privileged=true参数即可

如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用–privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

在这里插入图片描述

  1. 定义:使用docker容器的时候,会产生一系列的数据文件,这些数据文件在删除docker容器时是会消失的,但是其中产生的部分内容是希望能够把它保存起来另作用途的,Docker将应用与运行环境打包成容器发布,程序员希望在运行过程中产生的数据是可以持久化的,而且容器之间我们希望能够实现数据共享。一般来说,docker容器数据卷可以看成常用的U盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

一句话:有点类似我们Redis里面的rdb和aof文件

  1. 目的:容器数据卷设计的目的就是数据的持久化,完全独立于容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷。

docker run -it --privileged=true -v/宿主机绝对路径目录:/容器内目录  镜像名
  1. 特点:
    1. 数据卷可在容器之间共享或重用数据
    2. 卷中的更改可以直接实时生效
    3. 数据卷中的更改不会包含在镜像的更新中
    4. 数据卷的生命周期一直持续到没有容器使用它为止
  1. 宿主 vs 容器之间映射添加容器卷
    1. 直接命令添加
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /宿主机目录:/容器内目录 ubuntu /bin/bash
docker run -it --name myu3 --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash

    1. 查看数据卷是否挂载成功
docker inspect 容器ID

    1. 容器和宿主机之间数据共享
docker修改,主机同步获得
主机修改,docker同步获取
docker容器stop,主机修改,docker容器重启看数据是否同步

  1. 读写规则映射添加说明

写(默认)

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名

默认同上案例,默认就是rw

rw = read + write

在这里插入图片描述

只读:容器实例内部被限制,只能读取不能写

/容器目录:ro 镜像名 就能完成功能,此时容器自己只能读取不能写 ,ro = read only

此时如果宿主机写入内容,可以同步给容器内,容器可以读取到。

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名


  1. 卷的继承和共享

容器1完成和宿主机的映射

docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu

容器2继承容器1的卷规则

docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu

在这里插入图片描述

本地镜像发布到阿⾥云流程

  1. 阿里云ECS Docker生态如下图所示:

  1. 镜像的生成(commit)方法

基于当前容器创建一个新的镜像,新功能增强

docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
OPTIONS说明:
-a :提交的镜像作者;
-m :提交时的说明文字;

  1. 创建阿里云仓库镜像
  1. 选择控制台,进入容器镜像服务

  1. 选择个人实例

在这里插入图片描述

  1. 命名空间

  1. 仓库名称

在这里插入图片描述

  1. 进入管理界面获得脚本

  1. 将镜像推送到阿里云
  1. 管理界面脚本

  1. 脚本实例

docker login --username=zzyybuy registry.cn-hangzhou.aliyuncs.com

docker tag cea1bb40441c registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1

docker push registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1

上面命令是阳哥自己本地的,你自己酌情处理,不要粘贴我的。

  1. 将阿里云上的镜像下载到本地
docker pull registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/358191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink中的时间语义和TTL

时间语义 事件时间&#xff08;Event Time&#xff09; 事件时间是数据生成的时间&#xff0c;是数据流中每个元素或者每个事件自带的时间属性&#xff0c;一般是事件发生的时间&#xff0c;在实际项目中作为前端的一个属性嵌入。在理想情况下&#xff0c;数据应当按照事件时…

TeX:一款功能强大的Telegram安全监控与管理工具

关于TeX TeX是一款功能强大的Telegram安全监控与管理工具&#xff0c;该工具专为Telegram设计&#xff0c;可以实现针对Telegram的安全监控与管理。 TeX旨在帮助安全研究人员、调查人员和执法人员收集和处理针对网络犯罪分子的取证信息&#xff0c;其中包括网络犯罪、欺诈攻击…

vue3-深入组件-透传属性

透传属性 &#xff08;透传 attribute&#xff09; 什么是透传属性&#xff08;透传 attribute&#xff09;? 传递给一个组件&#xff0c;却没有被该组件声明为 props 或 emits 的 attribute 或者是事件监听器&#xff0c;例如 class style id 等。 属性继承 当一个组件以单…

STM32 1-5

目录 STM32简介 点亮PC13LED GPIO LED闪烁 LED流水灯 按键控制LED 光敏传感器控制蜂鸣器 OLED调试工具 OLED显示 EXTI外部中断 对射式红外传感器计次 旋转编码器计次 继续 STM32简介 点亮PC13LED main.c #include "stm32f10x.h" // D…

【linux】复制cp和硬连接、软连接的区别? innode 关系?

1.命令&#xff1a; cp -r [源文件或目录] [目的目录] #复制 ln -s [被链接的文件] [链接的目录/名称] #软连接 ln [被链接的文件] [链接的目录/名称] #硬连接 注&#xff1a;cp -r 会把所有source当作普通文件&#xff08;regular文件&#xff09;&#x…

代码随想录算法训练营第35天 | 860.柠檬水找零 406.根据身高重建队列 452.用最少数量的箭引爆气球

柠檬水找零 局部最优&#xff1a;收到20元时优先找零10元5元&#xff0c;不够再找零3个5元&#xff0c;因为5元可以找零20和10&#xff0c;更有用。全局最优&#xff1a;完成所有的找零。 class Solution { public:bool lemonadeChange(vector<int>& bills) {int fi…

Flink问题解决及性能调优-【Flink rocksDB读写state大对象导致背压问题调优】

RocksDB是Flink中用于持久化状态的默认后端&#xff0c;它提供了高性能和可靠的状态存储。然而&#xff0c;当处理大型状态并频繁读写时&#xff0c;可能会导致背压问题&#xff0c;因为RocksDB需要从磁盘读取和写入数据&#xff0c;而这可能成为瓶颈。 遇到的问题 Flink开发…

多线程编程3——线程的状态

一、状态是线程的状态 状态是PCB中与调度相关的属性&#xff0c;线程是CPU调度执行的基本单位。所以&#xff0c;状态是线程的属性。谈到状态&#xff0c;考虑的都是线程的状态&#xff0c;不是进程&#xff01;&#xff01;&#xff01; 二、在Java中&#xff0c;线程的状态…

作业车间调度问题:P还是NP

获取更多资讯&#xff0c;赶快关注上面的公众号吧&#xff01; 文章目录 基本概念多项式时间指数时间 P问题&#xff08;多项式问题&#xff09;NP问题&#xff08;非确定性多项式问题&#xff09;暴力穷举法动态规划 P与NP关系&#xff1a;作业车间调度问题是典型的NP难问题 …

将vite项目(vue/react)使用vite-plugin-pwa配置为pwa应用,只需要3分钟即可

将项目配置为pwa模式&#xff0c;就可以在浏览器里面看到安装应用的选项&#xff0c;并且可以将web网页像app一样添加到手机桌面或者pad桌面上&#xff0c;或者是电脑桌面上&#xff0c;这样带来的体验就像真的在一个app上运行一样。为了实现这个目的&#xff0c;我们可以为vue…

vue3-hand-mobile

当我写完手势移动事件后&#xff0c;我又通过svg的方法添加了一段文字和polygon。当我在这个蓝色的polygon上滑动手势的时候&#xff0c;会报错。 可能这个bug只是我个人的代码导致的。但是我觉得vue3-hand-mobile插件的这一段代码写的有问题。 我通过circular-json库修复了这…

vite+vue3+ts项目上线docker 配置反向代理API

这次重点的坑是反向代理。 1。项目中配置代理&#xff0c;为了跨域请求数据 项目根目录中新建vite.config.ts文件 在文件中添加配置代理 注意&#xff1a;其中 /api 和target 的地址后面没有 / 2。在项目根目录中新建Httprequest.ts文件&#xff0c;引入axios&#xff0c;并…

网诺安全文件上传总结

一、文件上传简介 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff08;木马、病毒、恶意脚本、webshell等&#xff09;&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。上传点一般出现在头像、导入数据、上传压缩包等地方&#xff0c;由于程序对用户上传…

VUE使用computed实现子父组件双向绑定数据

上面字符串文字是父级的数据&#xff0c;下面表单是父级传给子组件并实现双向绑定 // 这里是vue3写法&#xff0c;vue2 同样在computed里写 get(){} 即可 const form computed({get(){ // props.modelForm 就是父级传过来的对象const proxy new Proxy(props.modelForm,{get(t…

网络原理——传输层2

1.TCP协议 TCP协议是工作中最常用到的协议。 TCP协议格式&#xff1a; 源端口号&#xff08;16位&#xff09;&#xff1a;源端口标识发送方的应用程序。目的端口号&#xff08;16位&#xff09;&#xff1a;目的端口标识接收方的应用程序。序列号&#xff08;32位&#xf…

echarts 堆叠柱状图数据差值较大,导致显示图形差异很大

问题描述&#xff1a; echarts 堆叠柱状图数据差值较大&#xff0c;导致显示图形差异很大 如图&#xff1a; 解决方案 柱状图、折线图 给 y轴或者x轴type设置log 就可以 。饼图 设置 minAngle

kafka summary

最近整体梳理之前用到的一些东西&#xff0c;回顾Kafka的时候好多东西都忘记了&#xff0c;把一些自己记的比较模糊并且感觉有用的东西整理一遍并且记忆一遍&#xff0c;仅用于记录以备后续回顾 Kafka的哪些场景中使用了零拷贝 生产者发送消息&#xff1a;在 Kafka 生产者发送…

使用.NET6 Avalonia开发跨平台三维应用

本文介绍在Vistual Studio 2022中使用Avalonia和集成AnyCAD Rapid AvaloniaUI三维控件的过程。 0 初始化环境 安装Avalonia.Templates dotnet new install Avalonia.Templates若之前安装过可忽略此步骤。 1 创建项目 选择创建AvaloniaUI项目 选一下.NET6版本和Avalonia版…

RX-8564 LC实时时钟模块

.内置 32.768 kHz 晶体单元(频率精度调整完毕) .接口类型&#xff1a;I2C-Bus 接口 (400 kHz) .工作电压范围&#xff1a;1.8 V ~ 5.5 V .计时&#xff08;保持&#xff09;电压范围 &#xff1a;1.0 V ~ 5.5 V / -20 ˚C ~70 ˚C .低待机电流 &#xff1a;275 nA / 3.0…

基于BiLSTM-CRF对清华语料文本进行分类

安装TorchCRF !pip install TorchCRF1.0.6 构建BiLSTM-CRF # encoding:utf-8import torch import torch.nn as nn from TorchCRF import CRFfrom torch.utils.data import Dataset from sklearn.model_selection import train_test_split import numpy as npimport torch im…