Docker使用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
应用实时监控服务-应用监控,每月50GB免费额度
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 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

相关文章
|
PyTorch 算法框架/工具 Docker
docker问题
docker问题
85 2
|
3月前
|
运维 安全 开发者
Docker
Docker
36 1
|
7月前
|
JavaScript Linux Docker
【Docker】什么是Docker?
【4月更文挑战第20天】【Docker】什么是Docker?
|
7月前
|
Linux 虚拟化 开发者
Docker(1)
Docker定义 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
|
7月前
|
关系型数据库 MySQL 应用服务中间件
docker
docker
117 2
|
Java Shell Linux
Docker使用总结
Docker使用总结
136 0
|
Docker 容器
|
NoSQL MongoDB Nacos
Docker的运用
Docker的运用
68 0
|
Linux 虚拟化 开发者
|
存储 运维 关系型数据库
Docker(2)
Docker(2)
下一篇
DataWorks