Docker 镜像

19 阅读5分钟

四、Docker 镜像

1、安装nginx

#示例
[root@localhost ~]# docker run -d --name nginx01 -p 3344:80 nginx
8c45d1f247c518d0281815b9f9d133c0a2eb1db16549a35fa7c30531c668e249
[root@localhost ~]# crul 192.168.100.3:3344
-bash: crul: command not found
[root@localhost ~]# curl 192.168.100.3:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

#进入容器
[root@localhost ~]# docker exec -it nginx01 /bin/bash
root@8c45d1f247c5:/# cd /etc/nginx
root@8c45d1f247c5:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params

2、安装tomcat

#官方的使用
docker run -it --rm tomcat
#我们之前的启动都是后台,停止了容器之后,容器还是可以查到的, docker run -it --rm 一般用来测试

#启动
[root@localhost ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat
#测试没有问题

#进入容器
[root@localhost ~]# docker exec -it tomcat01 /bin/bash

#发现问题:1、liunx命令少了 2、没有webapps。 阿里云镜像原因,默认是最小的镜像,所有不必要的都剔除掉
#保证最小可运行的环境

3、部署es+kibana

#es 暴露的端口很多
#es 十分耗内存
#es 的数据一般需要放置到安装目录!挂载
#安装
[root@localhost ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-none" elasticsearch:7.6.2

#查看CPU服务器
docker stats
#增加内存限制,修改配置文件 -e修改配置文件
[root@localhost ~]# docker run -d --name elasticsearch04 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-none" -e ES_JAVA_OPTS="-Xms64m -Xmx128m"  elasticsearch:7.6.2

4、可视化

①portainer
docker run -d -p 8088:9000 --restart=always -v /var/run/docker:sock:/var/run/docker.sock --privileged=true portainer/portainer

②Rancher(CI/CD再用)

什么是portainer? Docker图形化界面管理工具!提供一个后台面板供我们操作 测试访问:外网:8080

5、Dokcer镜像讲解

①镜像是什么

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

所有的应用,直接打包docker镜像,就可以直接跑起来!

②docker镜像加载原理

UnionFS(联合文件系统) Union文件系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像

③dacker镜像加载原理

Docker设计时,就充分利用Union FS的技术,将其设计为分层存储的架构。 镜像实际是由多层文件系统联合组成,这种层级的文件系统UnionFS,在内部又分为2部分:

1) bootfs(boot file system):docker镜像的最底层是bootfs,主要包含bootloader(加载器)和kernel(内核)。bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统。当bootfs加载完成后,整个内核就在内存中了,此时内存的使用权已由bootfs转交给了内核,此时系统也会卸载bootfs。
这里的加载,可以理解为,我们windows电脑开机时候,从黑屏到进入操作系统的过程。

2)rootfs(root file system):在bootfs之上,包含的就是典型linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。不同的 Linux 发行版, boots 基本是一致的, rootfs 会有差別。

image.png

以图为例,从左到右,分为3个过程:
1、docker镜像的最底层是bootfs,然后是一个Base Image的基础镜像,这个基础镜像是Centos。

2、执行安装mysql操作,那么Docker会在Centos基础镜像之上又加了一层mysql镜像。

3、执行安装tomcat,那么在之前的mysql镜像上在继续加一层tomcat镜像。
就像叠积目一样,一层一层往上。也说明了docker的镜像实际上是由层一层的文件系统组成的。对于不同的的linux发行版本,bootfs基本是一致的,rootfs会有差别,所以不同的发行版可以共用bootfs。

另外,平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M? 因为底层直接用主机的内核,自己只需要提供rootfs就行了,所以rootfs可以很小,只需要包含最基本的命令、工具和程序库即可。这样一来,启动速度也快了,因为最浪费时间的引导加载过程没了。

特点

docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部 这一层就是我们所说的容器层,容器之下都叫镜像层

如何提交一个自己的镜像

docker commit 提交一个容器成为一个新的副本
#命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

测试

#启动一个默认的tomcat

#发现默认的tomcat是没有webapps应用,镜像原因

#提交
[root@localhost ~]# docker commit -a="yanghang" -m="add webapps app" cc37cc34fd1d  tomcat02:1.0
sha256:4b39229cea77468866301f5307c649e99c8d764ada69818297cff1576ee98354
[root@localhost ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat02              1.0       4b39229cea77   6 seconds ago   430MB
redis                 latest    39ac5829bade   5 hours ago     138MB
tomcat                latest    d0ed0a728666   5 days ago      426MB
hello-world           latest    9c7a54a9a43c   4 months ago    13.3kB
portainer/portainer   latest    5f11582196a4   9 months ago    287MB
nginx                 latest    605c77e624dd   20 months ago   141MB
elasticsearch         7.6.2     f29a1ee41030   3 years ago     791MB