[Linux]如何在Ubuntu中安装Docker,并且学习基本操作?

news2024/11/15 19:34:45

一、我们为什么需要Docker?

        相信大家都遇到过部署一个应用时缺少依赖的情况,往往我们需要手动解决依赖问题,在解决了依赖问题以后,好不容易安装了这个应用,但是我们更换了计算机以后又需要重复上面步骤将这个软件再安装一次。再比如说,大家在同时部署多个应用时,他们相互依赖的系统软件包发生了冲突,我们应该怎么解决呢?放弃一个应用?还有就是,在开发环境中,总有可能遇到自己的环境和服务器环境不同,导致本地能跑,服务器不能跑......上面这些问题都是因为环境问题导致的应用不能运行,不管是环境冲突还是环境缺失,我们总会因为环境问题导致我们的应用无法运行。那,有没有一种应用可以帮我解决这些环境问题,让应用在构建的时候就连同环境被打包好作为一个镜像,我们要运行某个应用的时候,用特殊的应用打开这个镜像即可。因为镜像中集成了这个应用运行所需的环境,所以我们也不需要考虑这个应用运行的环境问题。再加上每个镜像都单独运行,我们也不需要考虑应用间依赖的冲突问题。因为我们可以把应用打包成一个镜像并且集成环境,我们更不用担心到了别的计算机这个应用无法运行的问题。在上面这个能完美解决运行和依赖问题的应用就是我们的Docker,因为它强大的集成性和扩展性,深受普通用户和开发,运维人员的喜爱,那我们今天就来学习一下怎么安装Docker,并且使用它吧!

二、需要准备什么?

        需要强调的是,这次的教程已经不针对纯小白了,看这篇教程的你,需要具备一定的Linux基础和一定的解决问题的能力。

        首先需要准备的就是一台装有Linux系统的计算机或者虚拟机,我这里会主要使用Ubuntu进行演示。如果你想在物理机上安装Ubuntu可以参考下面的文章:

在物理机上安装Ubuntu:[Linux]如何在物理机安装Ubuntu(小白向)-CSDN博客

        然后你需要准备一个稳定科学上网的环境,总之你需要保证你的计算机能够访问国际网络。网络上有很多教程,这里我就不多说了。

当你准备好以上以后,就让我们开始吧!

三、理解Docker,镜像,容器之间的关系

        首先就是Docker,它是用来运行和管理容器与镜像的应用,我们的镜像与容器都是基于Docker本身。

        然后是镜像,镜像是一个只读模板,它用于创建容器。镜像中包含的软件运行所必须的代码,库,依赖,配置文件和操作系统等。镜像是层叠结构的,这种层次结构也使得镜像非常高效,因为多个容器可以共享相同的基础镜像层。

        最后是容器,容器是镜像运行的实例,它是一个独立的运行环境,运行在Docker的容器引擎上,容器的运行不需要完整的操作系统,它通过与宿主机共用系统内核,从而更高效,更快速。

        当你初步理解了Docker,镜像,容器之间的关系以后,我们就可以开始安装Docker了。

四、Docker的安装

        1.网络环境的配置

        因为Docker的部分容器并不那么安全,所以国家对Docker的访问进行了限制,我们现在需要配置我们的网络,让我们能够正常访问Docker。之前也提到了,我们需要准备一个科学上网的环境,目前最直接的科学上网方式就是使用代理服务器,我们需要在终端中配置我们的代理服务器。首先一点你需要清楚的是,在Ubuntu系统的图形化设置中配置的代理并不能使全局生效,因为终端中使用的是Bashshell,然而,Bashshell有自己的代理规则。所以,并不是在系统中配置了代理,终端中就会生效。我们现在需要单独配置终端中的代理规则。我们使用下面的命令,可以打开我们当前用户的环境变量配置文件:

nano ~/.bashrc

我们需要在用户环境变量中添加下面这两条语句:

export http_proxy=http://127.0.0.1:7897
export https_proxy=http://127.0.0.1:7897

这里的http_proxy和https_proxy是用来配置http和https流量的代理服务器的。这里的127.0.0.1表示代理服务器的IP地址,因为我的代理工具就在本地,所以我这里直接就写127.0.0.1,这里的7897表示我们代理服务器的端口,这个每个人的情况不一样,大家根据自己的端口进行填写。在填写好以后,我们进行一些简单的测试,输入下面的命令拉取google的主页:

wget google.com

可以看到,我们这里已经拉取成功了:

我们这里要注意的是,这里一定要使用wget去拉取而不是使用ping命令去ping谷歌的首页。

拉取成功以后,当前目录下会有一个“index.html”文件。

因为我们使用apt拉取应用的时候,大概率都会使用root,所以我们这里还要设置一下root用户的环境变量,这里也有要注意的,不是不切换到root用户就没有使用root用户,你使用sudo的时候就已经在使用root用户的环境变量了。所以,我们用上面同样的方法,打开root用户的环境变量配置文件,输入以下命令:

sudo nano /root/.bashrc

这里一定要加“sudo”,不然打开就是空白的。

打开root用户的环境变量以后,我们同样的在最下方加上上面的两句。

在配置好以后,我们可以直接用上面的方法进行测试,这次测试记得切换到root用户,记得是切换到root用户,如果使用sudo,设置的代理并不会生效。

我们这里也可以不配置环境变量,直接在语句中说明我们的代理服务器,例如下面的命令:

wget http_proxy=http://127.0.0.1:7897 https_proxy=http://127.0.0.1:7897 google.com

在上面这个命令中,我们在命令中就设置了代理服务器,这样做的好处就是,非常的方便,每条命令自由灵活,坏处也很明显,就是我们每次要使用代理服务器时都需要输入一长串的命令。

我们现在将配置文件中的语句屏蔽掉,然后测试一下上方的语句是否可行:

我们可以看出这样的方法也是成功的。

如果上面的方法你都不喜欢,那我们还有最后一种方法。修改apt的代理服务器,我们使用下面的命令打开apt的代理服务器配置文件:

sudo nano /etc/apt/apt.conf.d/00proxy

如果没有这个文件,在所示目录下创建这个文件即可。打开配置文件以后,在配置文件中写入下面两行语句:

Acquire::http::Proxy "http://localhost:7897/"; 

Acquire::https::Proxy "http://localhost:7897/"; 

acquire是apt的配置命令,用于配置apt在拉取应用或者更新包时所使用的代理服务器。我们这里的写法和上面一样,都是地址加端口号的形式,注意语句最后的分号是英文的分号并且不能省略。

配置好上面这些以后,我们的网络配置环节就已经结束了,下面我们进入Docker的安装环节。

2.安装Docker

        来到这一步,我就认为大家已经解决了网络问题,后面我可能很少会提及网络问题,如果你遇到拉取失败等情况,请回到上面一步查看是不是配置环节出了问题。下面的每一条命令都有严格的顺序,必须执行完前面的命令,并且都执行成功才可以进行下一步。

        我们先要使用下面的命令来安装Docker所需的依赖:

sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release 

        在Docker安装成功以后,我们使用下面的命令添加官方的“GPG key”:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 

        安装Docker本体:

sudo apt install docker-ce docker-ce-cli containerd.io 

如果你在上面遇到了任何的无法访问,无法下载,无法拉取,都是网络问题导致的,请检查代理服务器和配置文件。

在Docker安装好以后,我们就可以使用下面的命令查看Docker的版本:

sudo docker version 

这里有一点值得注意的是,对Docker的操作命令,记得都要加上“sudo”或者切换到root进行操作。

我们可以看到,输入了命令以后输出了很多信息,其中也包含了我们Docker的版本信息。在完成了上面这些步骤以后,我们的Docker的安装就已经完成了。下面我会教大家一些简单的Docker使用技巧,有了这些技巧以后,你就能使用Docker的基本功能了。

五、Docker的使用

        当我们拥有了容器和镜像的概念并且已经成功安装Docker后,我们就可以使用Docker的命令来对Docker进行操作了。下面我会演示Docker的常用命令。 之前也提到了,在使用Docker命令时,都应该加上“sudo”或者使用root的身份进行。

sudo docker pull 镜像名

上面这条命令用于拉取一个Docker的镜像,命令执行以后。Docker会根据你输入的包名去Docker的镜像服务器拉取对应的镜像。之前也提到了,镜像是创建容器的基础,我们需要一个镜像作为模板来创建容器,下面我将会从拉取一个镜像开始,逐步讲解,下面我们以“nginx”的镜像为例。一般的像“nginx”,"mysql",这些常用软件的镜像都是维护这些软件的官方上传到仓库的。

我们使用下面的命令来拉取“nginx”:

sudo docker pull nginx

我们可以看到,命令执行以后,很多东西开始下载了。下载完成以后我们的“nginx”的Docker镜像就被下载下来了。

我们也可以使用下面的命令来下载指定版本的“nginx”的Docker镜像:

sudo docker pull nginx:1.24.0

在镜像下载好以后,我们可以使用下面的命令来查看我们下载的镜像:

sudo docker images

这条命令可以帮我们看到镜像的名字,ID号,大小等信息,我们也可以使用这条命令来查看我们刚才的拉取是否成功。如果拉取失败,或者拉取以后这里并没有拉取的镜像,都有可能是网络问题。请检查代理服务器。

我们可以使用下面的命令来创建一个容器:

sudo docker run --name mynginx -d -p 8080:80 nginx

下面我们来讲解一下这条命令,这里的--name选项后面跟的就是我们要创建的容器的名字。这里的-d选项是这个容器运行方式,如果是-d的话就表示容器在后台运行,如果是-it就表示容器前台运行即进入容器。后面的-p参数表示端口映射这里我们将主机的8080端口映射到容器内部的80端口上,因为nginx内部默认监听80端口,因为加了映射,当我们访问主机的8080端口时,访问的就是容器内部的80端口,即被nginx监听的端口。最后的nginx就是我们要使用的镜像的名字了。

出现以上提示就表示创建成功了。

在创建好容器以后,我们可以使用下面的命令来查看运行中的容器:

sudo docker ps

这里我们就可以查看到我们运行中的容器的各种信息,包括端口地址映射,使用的镜像等。可以在上面的命令加上-a参数,可以显示所有的docker容器,不论容器有没有在运行。

当你看到你的Docker容器在运行时,我们就可以来测试一下了。因为我们将nginx监听的端口映射到了本机的8080端口,我们就可以直接访问本机的8080端口从而访问到nginx的服务。

在浏览器中输入“127.0.0.1:8080”就可以看到:

这就表示我们的容器已经在正常运行,并且nginx的已经正常启动了。

如果我们想进入容器,并且对容器进行修改,我们就可以用到下面的命令:

sudo docker exec -it mynginx /bin/bash

下面我们来解释一下这条命令,这里的-it之前提到过,表示让容器前台运行,这里的“mynginx”是我们要进入的容器的名字,后面的“bin/bash”表示我们启动容器内的bashshell命令行工具,注意这里是容器内的。

在进入容器以后,我们可以发现主机名发生了变化。

如果我们想退出容器,我们可以直接输入下面的命令:

exit

如果我们想要删除一个容器,可以使用下面的命令:

sudo docker rm 容器名

下面我们来演示一下:

是的如你所见,它出现了错误。错误内容:

Error response from daemon: cannot remove container "/mynginx": container is running: stop the container before removing or force remove

这个错误表示这个容器正在运行,所以我们不能删除它,我们可以使用下面的命令让这个容器停止运行:

sudo docker stop mynginx

在停止以后,我们就可以删除这个容器了。

与停止容器对应的我们可以使用下面的命令启动容器:

sudo docker start 容器名

我们可以使用下面的命令来删除一个镜像:

sudo docker rmi 镜像名

如果你在删除一个镜像时,遇到:

Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container 8d8f894fb073 is using its referenced image 5ef79149e0ec

这就表示,这个镜像正在被容器占用,无法删除,要删除这个镜像我们必须先删除和它关联的容器。

以上就是我们Docker使用中的基本命令了。

六、结语

        有了Docker以后,能帮我们解决许多依赖性问题,哪怕我们更换设备或者更换不同架构的设备只要我们能在这个设备上安装Docker,就能运行我们曾经部署过的应用,极大的简化了我们应用的部署流程......

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

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

相关文章

Unity(2022.3.38LTS) - Project Settings详细介绍不看你就亏大了(一)

目录 一. 简介 二. 详细介绍 1. Adaptive Performance(自适应性能) 2.音频 3. 编辑器 4. 图形 5. 输入管理器 6.包管理器 7.物理 8.2D物理 9.玩家 10.预设管理器 一. 简介 在 Unity 中,Project Settings(项目设置)页面是一个非常…

企业组网中MPLS和SD-WAN方案各有什么特点?

MPLS(多协议标签交换)和SD-WAN(软件定义广域网)是企业组网的两大关键技术方案,各自具备独特的特点和优势。 MPLS作为一种传统的专线技术,通过给数据包附加标签,实现了网络流量的高效转发。这种方…

教你如何安装并使用小熊猫c++

目录 前言 一、获取安装包 二、安装 1.打开安装包 2.选择语言 3.接受协议 4.安装场景 5.选择组件 6.选择位置 7.完成安装 三、如何使用 1.打开软件并选择主题 2.创建项目 3.新建空项目 4.创建源文件 5.测试C语言代码 6.编译 7.运行 总结 前言 已有的C/…

地震采集的观测系统

这张图表明,为什么在速度分析论文中,与CMP有关的数据都有CDP序号的影子——因为CDP序号是对一条测线上布置的观测系统对地下反射点的信号记录。换句话说,不同的CDP序号(类似测井位置)意味着不同的CMP道集。 几种论文中…

【Python快速入门和实践013】Python常用脚本-目标检测之按照类别数量划分数据集

一、功能介绍 这段代码实现了从给定的图像和标签文件夹中分割数据集为训练集、验证集和测试集的功能。以下是代码功能的总结: 创建目标文件夹结构: 在指定的根目录(dataset_root)下创建images和labels两个文件夹。在这两个文件夹下…

scoket通信 -- 网络字节序

include <arpa/inet.h> 考虑到不同语言不同库函数的参数可能不同&#xff0c;我这里以c语言的arpa/inet.h库中的函数为例. 网络字节序是什么 网络字节序&#xff08;Network Byte Order&#xff09;是指在网络通信中用于数据交换时所采用的字节序&#xff0c;它是大端…

log4j日志配置%X{TransId}

log4j日志配置文件中的%X{TransId}是怎么动态获取值的 在Log4j中&#xff0c;%X{TransId} 是用来从MDC&#xff08;Mapped Diagnostic Context&#xff09;中获取值的占位符。MDC 是 Log4j 提供的一种机制&#xff0c;用于在同一个线程的不同日志记录中传递上下文信息。通过 M…

centos ssh免密登录配置

ssh免密登录 centos 系统中&#xff0c;配置免密需要确保ssh配置文件免密登录权限打开了 sudo vim /etc/ssh/sshd_config 查看PubkeyAuthentication值为yes 修改之后&#xff0c;重启sshd sudo systemctl restart sshd免密配置 &#xff08;1&#xff09;生成秘钥文件 ssh-…

Linux 下 RocketMQ 安装、配置与运维(详细讲解)

一 RocketMQ 下载安装 1 下载 RocketMQ&#xff1a; 下载当前最新版本RocketMQ 官网下载&#xff1a; https://dist.apache.org/repos/dist/release/rocketmq/5.3.0/rocketmq-all-5.3.0-bin-release.zip wget https://dist.apache.org/repos/dist/release/rocket…

安装搭建MongoDB及配置副本集

目录 一、什么是MongoDB的副本集 简介 &#xff08;1&#xff09;冗余和数据可用性 &#xff08;2&#xff09;MongoDB中的复制 &#xff08;3&#xff09;主从复制和副本集区别 二、副本集的架构 三、副本集的成员 四、部署副本集 1、节点划分 2、安装MongoDB 2.1、…

数据结构与算法——平衡二叉树

1、基本介绍 1&#xff09;平衡二叉树又叫平衡二叉搜索树(Self-balanceing binary search tree)&#xff0c;又被称为AVL树&#xff0c;可以保证查询效率较高。 2&#xff09;具有以下特点&#xff1a;它是一颗空树或它的左右两颗子树的高度差绝对值不超过1&#xff0c;并且左…

网络热门编程项目导学:尚医通

本文作者&#xff1a;程序员鱼皮 免费编程学习 - 编程导航网&#xff1a;https://www.code-nav.cn 现在网上有很多播放量巨高的免费编程项目教程&#xff0c;很多学编程的同学可能都看过&#xff0c;就导致大家可能写在简历上的内容都差不多。 于是就有了下面这张图&#xff1…

python之matplotlib (3 坐标轴设置)

写在前面 在说明坐标轴设置之前&#xff0c;我有必要和大家说清楚图像设置的一些方法&#xff0c;避免陷入困扰模糊的地步。前面我们说过&#xff0c;画图的三种方法&#xff08;python之matplotlib &#xff08;1 介绍及基本用法&#xff09;-CSDN博客&#xff09;。而设置也…

2024年证券从业资格考试题型特点及答题技巧

考试题型、题量、分值 证券从业科目题型题量&#xff1a; 一、单选题(每题0.5分&#xff0c;共40题&#xff0c;共20分) 下列每小题的四个选项中&#xff0c;只有一项是最符合题意的正确答案&#xff0c;多选、错选或不选均不得分。 二、多选题(每题1分&#xff0c;共40题&…

我的Vue2/Vue3知识框架汇总

文章目录 一、前言二、Vue3篇Vue3 相对于 Vue2 做了哪些更新&#xff1f;​Vue3响应式Vue3响应式特点​Object.defineProperty 与 Proxy 的区别​什么是Proxy&#xff1f;​为什么需要 Reflect&#xff1f;(目标对象内部的this指向问题)​Vue3 惰性响应式​Proxy 只会代理对象的…

图片文件比较大怎么办?分享4个简单的在线压缩图片工具

现在经常将图片发布到网上用来展示&#xff0c;但是随着图片质量越高相应的文件也比较大&#xff0c;在遇到图片文件较大问题时&#xff0c;经常会无法正常上传到网站使用&#xff0c;所以一般需要使用图片压缩功能来调整大小后使用。对于经常需要处理图片的小伙伴来说&#xf…

Notion 插件开发入门

Notion 插件开发入门 最近想要用 Notion 记笔记&#xff0c;奈何 Notion 的标签分类功能确实不太好用…… 看了看其它文章中配置多级标签的繁杂流程之后&#xff0c;我觉得还是写一个插件比较靠谱…… 本文主要介绍 Notion 简单的插件开发&#xff0c;编程语言使用 JavaScrip…

打工人的“低成本的高生产力”之ToDesk云电脑

在快节奏的现代生活中&#xff0c;是不是经常觉得钱包瘪得快&#xff0c;但工作压力却大得要命&#xff1f;想要提升效率&#xff0c;又不想掏空腰包&#xff1f;来来来&#xff0c;作为职场老油条&#xff0c; 今儿给你们安利个神器——ToDesk云电脑&#xff0c;简直是咱们打工…

子域名太多如何实现HTTPS?一张通配符SSL证书全搞定

在当今数字化时代&#xff0c;网站安全性已经成为网站运营者以及访问者都非常关注的重要问题。部署SSL证书实现HTTPS加密&#xff0c;确保数据传输安全&#xff0c;防止信息被泄露或篡改&#xff0c;消除浏览器“不安全”提示&#xff0c;提高网站安全性以及可信任度已成为必然…

期权应该怎么及时止损?期权止损有哪些方式?

今天带你了解期权应该怎么及时止损&#xff1f;期权止损有哪些方式&#xff1f;如何在期权的交易计划中设置合适的止损点”是相对简单的事情。 如果自己遭遇了一定的损失&#xff0c;就要及时止损。 一般来说如果亏损接近30%的时候就可以进行止损了。但是不同的投资者资金实力…