Docker 的安装

news2024/9/23 13:16:55

讲解下在 Linux 下如何安装 Docker

官网

Docker 官网:https://www.docker.com

Docker Hub 官网: https://hub.docker.com (有很多 Docker 镜像的仓库,可能得魔法上网)

对于 Docker 初学者,可以从官网上看文档来学习(后续我们也会经常去官网看文档):

例如有如何安装的文档:

Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境(之前也说过,Docker 是基于 Linux 的虚拟化技术的)。

Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。因此,Docker 如果其他系统想部署 Docker,就必须安装一个虚拟的 Linux 环境

在 Windows 上部署 Docker 的方法,通常都是先安装一个虚拟机,并在安装 Linux 系统的虚拟机中运行 Docker

准备 Linux

目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在 CentOS 7 (64-bit)上,要求系统为 64 位、Linux 系统内核版本为 3.8 以上,这里选用 Centos7.x。

读者可以使用虚拟机或者云服务器来准备 Linux。

Linux 下,可使用 uname 命令打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等):

# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

# uname -r
3.10.0-957.el7.x86_64

Docker 的基本组成

安装之前,先说下 Docker 的基本组成,也是非常重要的 3 个概念。

镜像(Image)

Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。

它也相当于是一个 root 文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。

镜像相当于容器的“源代码”,Docker 镜像文件类似 Java 的类模板,Docker 容器实例类似于 Java 中 new 出来的实例对象。

容器(Container)

从面向对象角度来看:Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是 Java 中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台

从镜像容器角度来看:可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

仓库(Repository)

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

类似于其他技术中的:

  • Maven 仓库,存放各种 Jar 包的地方;
  • GitHub 仓库,存放各种 Git 项目的地方;
  • Python 仓库,存放 Python 依赖的地方;
  • Node 仓库,存放 NodeJS 依赖的地方

Docker 公司提供的官方 repository 被称为 Docker Hub,存放各种镜像模板的地方。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载:

访问国外的网站可能打不开,或者网速慢,可以使用国内的公开仓库阿里云 、网易云等。

小结

需要正确的理解仓库/镜像/容器这几个概念:

Docker 本身是一个容器运行载体,也可称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是 image 镜像文件。只有通过这个镜像文件才能生成 Docker 容器实例(类似 Java 中 new 出来一个对象)。

image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

镜像文件:image 文件生成的容器实例,本身也是一个文件,称为镜像文件

容器实例:一个容器运行一种服务,当我们需要的时候,就可以通过 Docker 创建一个对应的运行实例,也就是我们的容器

仓库:就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了

Docker 平台架构图解(入门篇)

为了能简单了解 Docker 的内部原理,我们讲解下 Docker 内部的架构,为以后深入学习做准备。

先简单看个图:

从左到右依次是:客户端,Docker 服务端,镜像仓库。

Docker 是一个 Client-Server 结构的系统,Docker 守护进程运行在主机上, 然后通过 Socket 连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。(可以看到 Docker 服务端中有个 daemon 的单词,就是指守护进程)

可以类比 MySQL,启动 MySQL 后,后台会有一个 MySQL 的进程;然后可以通过 Navicat 等客户端工具连接 MySQL 并操作。

在 Docker 服务端中,还能看到 Containers 和 Images 两个组成,也就是在创建容器的时候,首先会判断本地有无该镜像,没有则去仓库中获取(docker pull);然后再创建容器。

Docker 平台架构图解(架构版)

这里讲解下更深层次的架构图解,有个印象即可,为之后的大厂篇做准备。

Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。Docker 运行的基本流程为:

  1. 用户使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者
  2. Docker 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 来实现具体对容器进行的操作。

示意图:

Centos7 上安装

安装文档:https://docs.docker.com/engine/install/centos/

授人以鱼不如授人以渔,要怎么找到这个安装文档呢?首先一般这些开源框架的官网上,都会有 Docs:

然后就能看到有 install 的分类:

然后在左侧菜单能看到有相关的文档:

其实看文档并不复杂(可能对英语有一点点要求)。接下来我们按步骤来:

  • 确定 CentOS 版本
  • 卸载旧版本
  • yum 安装 gcc 相关
  • 安装需要的软件包
  • 设置 stable 镜像仓库
  • 更新 yum 软件包索引
  • 安装 DOCKER CE
  • 启动 docker

确定 CentOS 版本

官网说明:

To install Docker Engine, you need a maintained version of one of the following CentOS versions:

  • CentOS 7
  • CentOS 8 (stream)
  • CentOS 9 (stream)

The centos-extras​ repository must be enabled. This repository is enabled by default, but if you have disabled it, you need to re-enable itopen_in_new.

也就是要求 Centos7 及以上版本。我们执行该命令查看版本:

# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

卸载旧版本

官网文档:

Uninstall old versions

Older versions of Docker went by the names of docker​ or docker-engine​. Uninstall any such older versions before attempting to install a new version, along with associated dependencies.

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

yum​ might report that you have none of these packages installed.

Images, containers, volumes, and networks stored in /var/lib/docker/​ aren’t automatically removed when you uninstall Docker.

有时候 Centos 会默认安装一些软件,然而这些软件一般是过时了的,因此得卸载。执行:

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

yum 安装 gcc 相关

gcc 这些可以说是基本的安装包了,执行:

yum -y install gcc gcc-c++

安装需要的软件包,设置 stable 镜像仓库

官网文档:

Installation methods

You can install Docker Engine in different ways, depending on your needs:

  • You can set up Docker's repositories and install from them, for ease of installation and upgrade tasks. This is the recommended approach.
  • You can download the RPM package and install it manually and manage upgrades completely manually. This is useful in situations such as installing Docker on air-gapped systems with no access to the internet.
  • In testing and development environments, you can use automated convenience scripts to install Docker.

大意:你可以用不同方式安装 Docker 引擎,这取决于你的需求:

  • 可以设置并安装 Docker repository(推荐使用)
  • 使用 rpm 方式安装(相当于下载离线安装包)
  • 使用脚本安装

这里我们用第一种,设置并安装 Docker repository。文档说明:

Install using the rpm repository

Before you install Docker Engine for the first time on a new host machine, you need to set up the Docker repository. Afterward, you can install and update Docker from the repository.

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

但是!该 repository 是国外的,由于某些不可描述的原因,使用该地址,后续安装经常会因为网络问题导致安装失败:

[Errno 14] curl#35 - TCP connection reset by peer
[Errno 12] curl#35 - Timeout

因此我们得修改下地址为国内阿里云的:

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

更新 yum 软件包索引

该步骤官网没有,这是 Centos 的基础知识,建议执行下

yum makecache fast

安装 DOCKER CE

终于开始安装 Docker 引擎了,官网文档:

Install Docker Engine

install Docker Engine, containerd, and Docker Compose:

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完后,可以看看版本信息:

$ sudo docker version
Client: Docker Engine - Community
 Version:           24.0.5
 API version:       1.43
 Go version:        go1.20.6
 Git commit:        ced0996
 Built:             Fri Jul 21 20:39:02 2023
 OS/Arch:           linux/amd64
............

启动 Docker

执行:

sudo systemctl start docker

然后我们可以执行 systemctl status docker ​来查看 Docker 状态:running 说明正常启动了

也可以查看下 Docker 的进程:

ps -ef | grep docker

测试

官网文档:

Verify that the Docker Engine installation is successful by running the hello-world​ image.

$ sudo docker run hello-world

我们执行上述命令,Docker 就会帮我们启动一个 hello-world ​实例。运行结果:

[root@10 peterjxl]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete 
Digest: sha256:dcba6daec718f547568c562956fa47e1b03673dd010fe6ee58ca806767031d1c
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
..........

可以看到一开始首先提示本地没有镜像 'hello-world:latest'​,然后就会从仓库中拉取(pulling)

等输出完提示后,HelloWorld 就会停止运行,并且自动终止。那么 Docker run 干了什么?示意图:

Docker 的卸载

这里仅仅是说明怎么卸载,由于后续学习还要用到 Docker,这里就先不卸载。参考文档:

Uninstall Docker Engine

  1. Uninstall the Docker Engine, CLI, containerd, and Docker Compose packages:

    $ sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
    
  2. Images, containers, volumes, or custom configuration files on your host aren’t automatically removed. To delete all images, containers, and volumes:

    $ sudo rm -rf /var/lib/docker
    $ sudo rm -rf /var/lib/containerd
    

You have to delete any edited configuration files manually.

(完)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSH免密登录(Mac版)

1、查看ssh版本确保已安装 ssh -V 2、生成密钥对 ssh-keygen (我之前安装过了所以选no) 3、将公钥追加到需要设置免密登录的服务器上 使用ssh-copy-id命令进行追加ssh-copy-id -i id_rsa.pub useridip ( userid 和 ip 需要对应换成自己的)

opencv --- 人脸识别、人脸比对

opencv — 人脸比对 1、opencv安装参考: windows: windows 环境下安装OpenCV For Java linux:linux — CentOS 7 环境下编译安装OpenCV For Java 进入到opencv的安装目录: 进入到build\java 目录 2、准备文件 # 1. 特征分类器:windows 和 linux 中的配置文件都一样…

计算机网络:http协议

计算机网络:http协议 一、本文内容与前置知识点1. 本文内容2. 前置知识点 二、HTTP协议工作简介1. 特点2. 传输时间分析3. http报文结构 三、HTTP版本迭代1. HTTP1.0和HTTP1.1主要区别2. HTTP1.1和HTTP2主要区别3. HTTPS与HTTP的主要区别 四、参考文献 一、本文内容…

如何操作可以有效的防止其他人修改Excel文件?

工作中,我们经常遇到同一份表格可能需要好多人共同去完成,但是当你整理好数据发给别的同事的时候,等表格再回来的时候,你可能发现你之前设置的资料格式内容等都被修改了,遇到这种情况时,如何操作可以有效的…

Codeforces Round 970 (Div. 3)(A~H)

​​​​​题目链接​​​​​​​​​​​​​​​​​​​​​ A 当 a 为奇数的时候,无论如何配对都无法将最后一个 1 减去; 当 a 为偶数的时候,b 也偶数,自然可以内部通过加减操作变成 0;当 b 为奇数的时候&#…

观察者设计模式详解

观察者设计模式详解 文章目录 观察者设计模式详解一、定义二、观察者模式的结构三、特点四、应用场景五、实现 一、定义 **观察者设计模式(Observer Pattern)**是一种行为设计模式,也叫做 “发布-订阅模式”, 它定义了一种一对多…

ArcGIS的8个“合并”功能要分清——矢量:编辑器合并,复制粘贴,工具合并、追加、联合——栅格:镶嵌、镶嵌至新栅

​​​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 今天来看看ArcGIS中的几个涉及“合并”功能的用法。 对矢量: 包括编辑器中的合…

IOS 20 发现界面(UITableView)歌单列表(UICollectionView)实现

发现界面完整效果 本文实现歌单列表效果 文章基于 IOS 19 发现界面(UITableView)快捷按钮实现 继续实现发现界面歌单列表效果 歌单列表Cell实现 实现流程: 1.创建Cell,及在使用UITableView的Controller控制器上注册Cell&#x…

uni-app应用更新(Android端)

关于app更新,uni-app官方推荐的是 uni-upgrade-center,看了下比较繁琐,因此这里自己实现检查更新并下载安装的逻辑。 1.界面效果 界面中的弹框和 进度条采用了uView 提供的组件 2.检查更新并下载安装 一、版本信息配置在服务端&#xff0c…

【Azure Redis】Redis-CLI连接Redis 6380端口始终遇见 I/O Error

问题描述 使用Redis-cli连接Redis服务,因为工具无法直接支持TLS 6380端口连接,所以需要使用 stunnel 配置TLS/SSL服务。根据文章(Linux VM使用6380端口(SSL方式)连接Azure Redis (redis-cli & stunnel) : https://www.cnblogs.com/luligh…

Python使用turtle画笑脸

import turtle as t t.pensize(5) #设置画笔尺寸 t.color("red","yellow") #设置画笔颜色 t.begin_fill() #开始填充 t.circle(150) #绘制一个半径为100像素的圆 t.end_fill() #结束填充#画眼睛(左眼…

Leetcode - 周赛413

目录 一,3274. 检查棋盘方格颜色是否相同 二,3275. 第 K 近障碍物查询 三,3276. 选择矩阵中单元格的最大得分 四,3277. 查询子数组最大异或值 一,3274. 检查棋盘方格颜色是否相同 本题就是找规律,假设白…

x11转发远程图形界面

1、 开一个有vnc的节点 2、 开放所有用户的Xserver权限 xhost 3、X11转发 ssh hlzhang192.168.3.156 -X4、打开远程窗口 paraview在227的界面打开156的图形窗口

uniapp和vue3中使用vConsole在H5中开启移动端调试

uniapp和vue3中使用vConsole在H5中开启移动端调试 1. 安装vconsole npm install vconsole --save2. 在main.js中全局引入 重新启动项目即可

【C++】手搓实现模板类

myTamplate.h #ifndef MYTAMPLATE_H #define MYTAMPLATE_H #include <iostream> using namespace std;template<typename T> class Node {T *data; //数据域int size; //指针域int len;//实际长度 public://无参构造Node():size(10),len(0){data new T[size]…

写的一致性问题之双写模式

文章目录 1、先写mysql&#xff1a;mysql会回滚&#xff0c;而redis不会回滚2、先写redis&#xff1a; 1、先写mysql&#xff1a;mysql会回滚&#xff0c;而redis不会回滚 写入msql成功&#xff0c;写入redis也成功&#xff0c;但是后续事务提交失败&#xff0c;mysql会回滚&a…

Django学习(一)

一、创建django项目 二、修改settings.py里的配置&#xff1a; 1、修改语言和时区&#xff1a; # 语言编码 LANGUAGE_CODE zh-hansTIME_ZONE UTCUSE_I18N True# 不用时区 USE_TZ False 2、配置数据库&#xff1a; DATABASES {default: {ENGINE: django.db.backends.m…

Python中的self有什么作用

你是否曾经好奇过,为什么Python类中的方法总是有一个神秘的self参数?为什么有时它似乎可有可无,有时却又不可或缺?今天,让我们一起深入探讨Python中self的奥秘,揭开面向对象编程的神秘面纱! 目录 引言:self的重要性self的本质:实例的引用为什么需要self?self的工作原理self的…

极米科技:走出舒适圈,推动数据架构现代化升级 | OceanBase 《DB大咖说》

《DB 大咖说》第 13 期&#xff0c;邀请到了极米科技软件与创新产品线高级架构师施刘凡来进行分享。 在小红书平台上&#xff0c;“是否应将家里的电视升级为投影仪&#xff1f;”这一话题激发了上百万篇笔记的分享与推荐&#xff0c;反映出年轻群体对投影仪的偏好。随着手机、…

Java MVC

1. MVC模式 1.1. JavaBean JavaBean&#xff1a;符合特定规范的Java类&#xff0c;是一种可重用的组件 特定规范&#xff1a; public, class, 提供无参数构造方法属性private提供public的getter和setter方法 功能分类&#xff1a; 封装数据&#xff1a;数据Bean&#xff0c…