Docker使用
📑前言
本文主要是【Docker】——Docker容器技术使用的文章,如果有什么需要改进的地方还请大佬指出⛺️
🎬作者简介:大家好,我是听风与他🥇
☁️博客首页:阿里云主页听风与他
🌄每日一句:狠狠沉淀,顶峰相见
Docker容器技术
容器技术入门
我们先来看看Docker的整体架构:
实际上分为三个部分:
- Docker 客户端:也就是我们之前使用的docker命令,都是在客户端上执行的,操作会发送到服务端上处理。
- Docker 服务端:服务端就是启动容器的主体了,一般是作为服务在后台运行,支持远程连接。
- Registry:是存放Docker镜像的仓库,跟Maven一样,也可以分公有和私有仓库,镜像可以从仓库下载到本地存放。
当我们需要在服务器上部署一个已经打包好的应用和环境,我们只需要下载打包好的镜像就可以了,我们前面执行了:
sudo docker run -d -p 80:80 nginx
实际上这个命令输入之后:
- Docker客户端将操作发送给服务端,告诉服务端我们要运行nginx这个镜像。
- Docker服务端先看看本地有没有这个镜像,发现没有。
- 接着只能从公共仓库Docker Hub去查找下载镜像了。
- 下载完成,镜像成功保存到本地。
- Docker服务端加载Nginx镜像,启动容器开始正常运行(注意容器和其他容器之间,和外部之间,都是隔离的,互不影响)
容器与镜像
初识容器镜像
我们希望吧某个镜像从仓库下载到本地,这里使用官方的hello-world镜像:
docker pull hello-world
只需要输入pull
命令,就可以直接下载到指定的镜像了:
可以看到对上面一行有一句Using default tag,实际上一个镜像的名称是由两部分组成的,一个是repository
,还有一个是tag
,一般情况下约定repository
就是镜像名称,tag
作为版本,默认为latest,表示最新版本。所以指定版本运行的话:
docker pull 名称:版本
镜像下载之后会存放在本地,要启动这个镜像的容器:
docker run hello-world
如果仅仅想创建而不想立马运行的话,可以使用create命令:
docker create hello-world
可以看到成功启动了:
启动之后,会使用当前镜像自动创建一个容器,我们可以输入ps
命令来查看当前容器的容器列表:
docker ps -a
注意后面要加一个-a
表示查看所有容器(其他选项可以使用-h查看),如果不加的话,只会显示当前正在运行的容器,而HelloWorld是一次性的不是Nginx那样的常驻程序,所以容器启动打印了上面的内容之后,容器就停止运行了:
可以看到容器列表中有我们刚刚创建的hello-world以及我们之前创建的nginx(注意同一个镜像可以创建多个容器),每个容器都有一个随机生成的容器ID写在最前面,后面是容器的创建时间以及当前的运行状态,最后一列是容器的名称,在创建容器时,名称可以由我们指定也可以自动生成,这里就是自动生成的。
我们可以手动指定名称启动,在使用run
命令时,添加--name
参数即可:
docker run --name=lbwnb hello-world
手动开启处于停止状态的容器:
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
可以看到,CentOS的base镜像就已经下载完成,不像我们使用完整系统一样,base镜像的CentOS省去了内核,所以大小只有272M,这里需要解释一下base镜像的机制:
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容器启动后就自动停止了。
可以看到使用ls命令能够查看所有根目录下的文件,不过很多命令都没有,连clear都没有,我们来看看内核版本:
可以看到内核版本是一样的(这也是缺点所在,如果软件对内核版本有要求的话,那么此时使用Docker就直接寄了),我们输入exit
就可以退出容器终端了,可以看到退出后容器也停止了:
当然我们也可以再次启动,注意启动的时候要加上-i
才能进入到容器进行交互,否则会在后台运行:
基于base镜像,我们就可以在这基础上安装各种各样的软件的了,几乎所有的镜像都是通过在base镜像的基础上安装和配置需要的软件构建出来的:
每安装一个软件,就在base镜像上一层层叠加上去,采用的是一种分层的结构,这样多个容器都可以将这些不同的层次自由拼装,比如现在好几个容器都需要使用CentOS的base镜像,而上面运行的软件不同,此时分层结构就很爽了,我们只需要在本地保存一份base镜像,就可以给多个不同的容器拼装使用,是不是感觉很灵活?
删除镜像命令:
docker rmi <名称>