暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Docker镜像和容器相关操作及docker镜像原理和核心架构

程序媛小庄 2021-11-02
747

HAPPY

HALLOWEEN


docker成功安装并且知道了docker的架构之后,就需要操作docker为我们服务了,接下来就来看看这些有(ku)趣(zao)的命令吧


docker引擎命令


docker info

用来展示docker的各种信息,包括版本 状态等等。会出现client、server两种信息,说明docker是CS架构。docker的服务端是用来接收客户端命令,并执行。。

docker version

用来展示docker客户端和服务端的版本号。

docker --help(docker)

查看docker所有帮助命令,docker执行命令的格式为docker [options] command


docker镜像的相关命令


docker images [options]

该命令可以添加选项。

-a:列出所有镜像,和不加是一致的

-q: 只显示镜像id

docker docker pull 镜像名称:TAG

从远程仓库下载镜像。在下载之前建议去docker hub上查看一下是否有自己需要的版本,并且可以直接复制下载命令。下图是mysql镜像。

docker search 镜像名:TAG

由于dockerhub打开速度有时非常慢,因此可以通过该命令直接在命令行上查询是否存在某个镜像。OFFICIAL表示是否是官方版本。

docker image rm 镜像名:TAG(镜像ID)

删除镜像,可以通过镜像名+版本号,也可以通过镜像ID进行删除。

docker image rm -f 镜像名:TAG(镜像ID)

如果有对应镜像的容器在运行,无法通过上述命令进行删除镜像,可以通过强制删除参数-f进行删除,但是很危险哦~

docker rmi [-f] 镜像名:TAG(镜像ID)

删除镜像命令的简化写法,可以删除一个或者多个镜像。

docekr rmi [-f] $(docker images -aq)

删除多个镜像,将docker images -q产生的值(所有的镜像)赋值给$,然后进行删除。


运行容器的相关命令


ps:关于容器操作的命令以tomcat为例进行操作。

docker pull tomcat  # 下载tomcat镜像


docker run 镜像名:TAG(镜像id)

最简单的通过镜像运行容器的方式,容器与容器之间是互相隔离的,此时无法通过外界访问到tomcat服务,因此需要在该命令后添加一系列的参数运行。通过docker run --help可以查看docker run命令的选项,非常多哦~

-p 宿主机端口:容器内服务监听端口

宿主机端口与容器中的端口进行映射,可以映射多个端口。实现在宿主机上访问tomcat服务的需求。再次启动tomcat服务,就可以在宿主机上访问tomcat服务了。但是通过该方式可以启动N多个tomcat服务,但是需要注意的是宿主机的8080端口已经被占用,不能再使用宿主机上的8080端口与docker容器进行映射,可以选择其他端口。


# docker run -p(端口映射参数) 宿主机端口:容器内服务端口 镜像名称:TAG


docker run -p 8080:8080 tomcat:latest

docker run -p 8081:8080 tomcat:latest

...


-d

启动容器进行端口映射并且后台运行服务。如果只进行端口映射的话还有问题,如果使用快捷键ctrl + c就会停止容器,-d选项可以让服务后台启动。


# docker run -d(后台运行) -p(端口映射参数) 宿主机端口:容器内服务端口 镜像名称:TAG


docker run -d -p 8082:8080 tomcat:latest

--name 唯一的名字

启动容器,给当前容器指定名称,端口映射,后台启动。在运行容器时为容器指定名称,容器名是唯一的。


# docker run -d(后台运行) -p(端口映射参数) 宿主机端口:容器内服务端口 --name(容器名称参数) 容器名唯一 镜像名称:TAG


docker run -d -p 8083:8080 --name tomcat01 tomcat:latest


查看容器的相关命令


docker ps

查看当前正在运行的容器。下表显示结果中每个“字段”的意思。该命令也有选项。

docker ps -a

查看所有的容器,包括运行的容器和没有运行的容器。

docker ps -q

查看所有正在运行的容器id。

docker ps -aq

查看所有的容器id.

docker ps 结果字段


停止|重启容器相关命令


docker start 容器名或者容器id

开启容器

docker restart  容器名或者容器id 

重启容器

docker stop 容器名或者容器id

正常停止容器

docker  kill 容器名或者容器id

立即停止容器运行

容器删除


docker rm 容器名称|容器id

删除一个停止的容器,如果删除正在运行的容器会报错

docker rm -f 容器名称|容器id

强制删除容器,可以是运行的容器

docker rm -f  $(docker ps -aq)

删除所有的容器

查看容器内服务运行日志


docker logs 容器名称|容器id

后台运行的服务无法实时查看日志,因此可以通过该命令查看日志,没有实时展示的效果

docker logs -f 容器名称|容器id

对日志进行实时监听

docker logs -tf 容器名称|容器id

实时展示日志的同时加入时间

docker logs --tail N 容器名称|容器id

N是任意数字,查看容器日志的最后N行

查看容器内的进程


docker top 容器名称|容器id

查看容器内的所有进程

与容器内部进行交互


docker exec -it 容器名称|容器id bash

表示以交互模式(-it)进入容器并与容器内的命令终端进行交互。bash代表容器内的终端,类似于linux系统中的命令行。

exit

退出容器

操作系统与容器的文件交互(互相传输文件)


docker  cp 容器名或者容器id:容器内的资源路径 操作系统的路径

将容器内的文件复制到操作系统。


docker cp tomcat01:/usr/local/RUNING.txt ./RUNING.txt  # 复制文件

docker cp tomcat01:/usr/local/webapps ./webapps   # 复制目录


docker cp 操作系统路径 容器ID|容器名:容器内目标路径

宿主机上资源复制到容器中。


docker cp a.txt tomcat01:/usr/local/

查看容器内部的细节


docker inspect 容器ID|容器名

可以查看容器内部的信息,比如数据卷挂载、网络信息、端口信息。


容器打包成镜像


docker commit -m "描述信息" -a "作者信息" 被打包的容器ID|名称 新的镜像名称:tag

根据已有的容器打包成镜像


docker commit -m "my tomcat" -a "author" tomcat01 mytomcat:1.0

备份镜像


docker save 镜像名称:TAG -o 文件名

将镜像进行备份到某个文件中并保存在当前目录中。


docker save mytomcat:1.0 -o mytomcat:1.0.tar

将打包的tar镜像文件导入到本地docker仓库


docker load -i xxx.tar

将打包好的tar文件加载到本地的docker仓库


docker load -i mysql.tar


镜像分层原理


前面介绍了docker镜像和容器的基本操作,可能会有小伙伴有疑问,docker是一个轻量级的,那为啥有些镜像特别的大呢?就需要了解docker镜像的分层原理。在使用docker pull的命令时,会首先在本地仓库中寻找,找不到才去远程仓库中下载,但是可以发现在下载过程中并不是只下载一个镜像 。


首先看一下镜像的比较官方的定义,镜像是一种轻量级的可独立的软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含某个软件所需的所有内容,包括代码、运行时所需要的库、环境变量和配置文件。

容器是属于操作系统级别的隔离,容器是镜像运行得到的,如果按照这种思路构建镜像的话,每个镜像都需要自己封装一个基础的操作系统依赖,如下图所示,就会导致每个镜像都非常的大,非常占用系统资源。

因此docker将镜像尽可能的将镜像的公共部分单独抽取出来进行分层,并且尽可能的划分的更加细致,最底层的就是最公共的那一部分镜像。上图就可以简单转换为下面这样:当然在操作系统层面上可能还会进一步分层。

所以总结来说一个镜像非常大的原因就是一个镜像不仅仅是原来的软件包,还包含软件包所需要的操作系统依赖、团建自身以来以及自身软件包组成。

docker在设计镜像时每一个镜像都是由N个镜像进行组成的,这样会最大程度的复用基础的重复的镜像,从而减少仓库的整体体积。这也是镜像分层原理,这种原理也叫UnionFs联合文件系统。


docker核心架构


在了解了镜像和容器的相关操作之后,可以总结出docker的核心架构图,该核心架构可以帮助我们更加清楚的对docker进行学习。(dockerfile在后面的文章中会介绍,欢迎大家关注哦)

小庄卖瓜


如果想要了解更多python知识,欢迎关注小庄微信公众号,我们一起学(zi)习(kua)吧~




文章转载自程序媛小庄,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论