Docker使用

举报
听风与他 发表于 2023/11/25 09:36:59 2023/11/25
【摘要】 Docker使用

📑前言

本文主要是【Docker】——Docker简单使用的文章,如果有什么需要改进的地方还请大佬指出⛺️

🎬作者简介:大家好,我是听风与他🥇
☁️博客首页:华为云主页听风与他
🌄每日一句:狠狠沉淀,顶峰相见

Docker使用

Docker容器技术

容器技术入门

我们先来看看Docker的整体架构:

image-20220630184857540

实际上分为三个部分:

  • Docker 客户端:也就是我们之前使用的docker命令,都是在客户端上执行的,操作会发送到服务端上处理。
  • Docker 服务端:服务端就是启动容器的主体了,一般是作为服务在后台运行,支持远程连接。
  • Registry:是存放Docker镜像的仓库,跟Maven一样,也可以分公有和私有仓库,镜像可以从仓库下载到本地存放。

当我们需要在服务器上部署一个已经打包好的应用和环境,我们只需要下载打包好的镜像就可以了,我们前面执行了:

sudo docker run -d -p 80:80 nginx

实际上这个命令输入之后:

  1. Docker客户端将操作发送给服务端,告诉服务端我们要运行nginx这个镜像。
  2. Docker服务端先看看本地有没有这个镜像,发现没有。
  3. 接着只能从公共仓库Docker Hub去查找下载镜像了。
  4. 下载完成,镜像成功保存到本地。
  5. Docker服务端加载Nginx镜像,启动容器开始正常运行(注意容器和其他容器之间,和外部之间,都是隔离的,互不影响)

容器与镜像

初识容器镜像

我们希望吧某个镜像从仓库下载到本地,这里使用官方的hello-world镜像:

docker pull hello-world

只需要输入pull命令,就可以直接下载到指定的镜像了:

image-20220701111043417

可以看到对上面一行有一句Using default tag,实际上一个镜像的名称是由两部分组成的,一个是repository,还有一个是tag,一般情况下约定repository就是镜像名称,tag作为版本,默认为latest,表示最新版本。所以指定版本运行的话:

docker pull 名称:版本

镜像下载之后会存放在本地,要启动这个镜像的容器:

docker run hello-world

如果仅仅想创建而不想立马运行的话,可以使用create命令:

docker create hello-world

可以看到成功启动了:

image-20220701111314331

启动之后,会使用当前镜像自动创建一个容器,我们可以输入ps命令来查看当前容器的容器列表:

docker ps -a

注意后面要加一个-a表示查看所有容器(其他选项可以使用-h查看),如果不加的话,只会显示当前正在运行的容器,而HelloWorld是一次性的不是Nginx那样的常驻程序,所以容器启动打印了上面的内容之后,容器就停止运行了:

image-20220701111840091

可以看到容器列表中有我们刚刚创建的hello-world以及我们之前创建的nginx(注意同一个镜像可以创建多个容器),每个容器都有一个随机生成的容器ID写在最前面,后面是容器的创建时间以及当前的运行状态,最后一列是容器的名称,在创建容器时,名称可以由我们指定也可以自动生成,这里就是自动生成的。

我们可以手动指定名称启动,在使用run命令时,添加--name参数即可:

docker run --name=lbwnb hello-world

image-20220701125951980

手动开启处于停止状态的容器:

docker start <容器名称/容器ID>

停止容器,输入stop命令

docker stop <容器名称/容器ID>

或是重启

docker restart <容器名称/容器ID>

如果我们不需要容器了,那么可以将容器删除,注意只有容器处于非运行状态时才可以删除

docker rm <容器名称/容器ID>

如果我们希望容器停止之后自动删除,我们可以在运行时添加 --rm 参数:

docker run --rm 镜像名称

删除后,容器将不复存在,当没有任何关于nginx的容器之后,我们可以删除nginx的本地镜像:

docker rmi nginx

我们可以使用images命令来检查当前本地有哪些镜像

docker images

镜像架构介绍

下载CentOS的base镜像:

docker pull centos

image-20220701132622893

可以看到,CentOS的base镜像就已经下载完成,不像我们使用完整系统一样,base镜像的CentOS省去了内核,所以大小只有272M,这里需要解释一下base镜像的机制:

image-20220701133111829

Linux操作体系由内核空间和用户空间组成,其中内核空间就是整个Linux系统的核心,Linux启动后首先会加bootfs文件系统,加载完成后会自动卸载掉,之后会加载用户空间的文件系统,这一层是我们自己可以进行操作的部分:

  • bootfs包含了BootLoader和Linux内核,用户是不能对这层作任何修改的,在内核启动之后,bootfs会自动卸载。
  • rootfs则包含了系统上的常见的目录结构,包括/dev/proc/bin等等以及一些基本的文件和命令,也就是我们进入系统之后能够操作的整个文件系统,包括我们在Ubuntu下使用的apt和CentOS下使用的yum,都是用户空间上的。

base镜像底层会直接使用宿主主机的内核,也就是说你的Ubuntu内核版本是多少,那么base镜像中的CentOS内核版本就是多少,而rootfs则可以在不同的容器中运行多种不同的版本。所以,base镜像实际上只有CentOS的rootfs,因此只有300M大小左右,当然,CentOS里面包含多种基础的软件,还是比较臃肿的,而某些操作系统的base镜像甚至都不到10M。

使用uname命令可以查看当前内核版本:

uname -r

因此,Docker能够同时模拟多种Linux操作系统环境,就不足为奇了,我们可以尝试启动一下刚刚下载的base镜像:

docker run -it centos

因此,Docker能够同时模拟多种Linux操作系统环境,就不足为奇了,我们可以尝试启动一下刚刚下载的base镜像:

docker run -it centos

注意这里需要添加-it参数进行启动,其中-i表示在容器上打开一个标准的输入接口,-t表示分配一个伪tty设备,可以支持终端登录,一般这两个是一起使用,否则base容器启动后就自动停止了。

image-20220701135834325

可以看到使用ls命令能够查看所有根目录下的文件,不过很多命令都没有,连clear都没有,我们来看看内核版本:

image-20220701140018095

可以看到内核版本是一样的(这也是缺点所在,如果软件对内核版本有要求的话,那么此时使用Docker就直接寄了),我们输入exit就可以退出容器终端了,可以看到退出后容器也停止了:

image-20220701140225415

当然我们也可以再次启动,注意启动的时候要加上-i才能进入到容器进行交互,否则会在后台运行:

image-20220701140706977

基于base镜像,我们就可以在这基础上安装各种各样的软件的了,几乎所有的镜像都是通过在base镜像的基础上安装和配置需要的软件构建出来的:

image-20220701143105247

每安装一个软件,就在base镜像上一层层叠加上去,采用的是一种分层的结构,这样多个容器都可以将这些不同的层次自由拼装,比如现在好几个容器都需要使用CentOS的base镜像,而上面运行的软件不同,此时分层结构就很爽了,我们只需要在本地保存一份base镜像,就可以给多个不同的容器拼装使用,是不是感觉很灵活?

删除镜像命令:

docker rmi <名称>

📑文章末尾

image.png

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。