Docker与微服务

镜像下载、域名解析、时间同步请点击阿里云开源镜像站

一、镜像

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件

1.镜像分层

以tomcat镜像为例,我们发现在pull的过程中镜像好像一层一层的在下载

Docker与微服务

(1). Docker镜像加载原理:

docker镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是联合文件系统(UnionFS)

(2). UnionFS(联合文件系统)

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

(3). 具体细节

  • bootfs(boot file sysytem)

主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层时引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs

  • rootfs(root file system)

在bootfs之上,包含的就是典型Linux系统中的/dev, /proc, /bin,/etc等标准目录和文件,rootfs就是各种不同操作系统发行版,比如Ubuntu,Centos等

(4). 镜像分层的好处

共享资源以促进复制、迁移和重复使用

[En]

Sharing resources to facilitate replication, migration and reuse

比如说多个镜像都是从相同的一份base镜像构建而来(更详细的讲 假如base镜像共有十层,而A镜像是base镜像的前三层,B镜像是base镜像的后三层),那么我们只需要在磁盘上保存一份base镜像,在内存中加载一份base镜像,就可以为所有由base镜像构建而来的镜像的实例容器服务了。

一般来说,大学图书馆分为工程、文学、医学等几个层次,每个层次都可以细分为许多不同的子领域,虽然我们学校的学生专业很多,但你可以在图书馆找到自己专业的书籍。这样,我们就不必因为不同的学科而建立多个图书馆。

[En]

Generally speaking, the university library is divided into several layers, such as engineering, literature, and medicine, each of which can be subdivided into many different sub-fields, and although the students in our school have many majors, but you can find books of your own major in the library. In this way, we don’t have to build multiple libraries because of different disciplines.

(5). 容器层、镜像层

当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为 ” 容器层” , “容器层 ” 之下的都叫 ” 镜像层 ” 。Docker镜像层都是只读的,容器层是可写的。

这很容易理解。图书馆里的书可以外借,但图书馆的地基和整栋建筑都不能随便挪动。

[En]

This is easy to understand. Books in the library can be borrowed, but the foundation and the whole building of the library must not be moved casually.

在docker上运行Ubuntu容器实例,使用vim编辑文件,发现报错了,找不到vim

Docker与微服务

原因

这是由于镜像是简易版的Linux,仅包括Linux内核等一些重要的。

但是我们进行配置文件的修改,需要用到vim编辑器,这时候就需要镜像加强了

apt update 更新包管理工具(ubuntu)

Docker与微服务

apt install vim 下载vim

使用vim编辑器,新建文件a.txt 并写入hello docker,保存退出。读取a.txt文件

Docker与微服务

ctrl+q+p 退出容器 docker ps 查看正在运行的容器

Docker与微服务

第一个就是我们刚才使用的带vim编辑器的ubuntu容器

docker commit -m=”提交的描述信息” -a=”作者” 容器ID 要创建的目标镜像名:[标签名]

Docker与微服务

commit 带vim编辑器的ubuntu容器到本地,查看本地镜像发现带vim的大小多了近100MB,这就是为什么镜像文件小的原因所在,只是按需下载

Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。

2.本地镜像发布到阿里云

在阿里云控制台 -> 容器镜像服务 -> 个人实例(创建一个用于测试)

Docker与微服务

Docker与微服务

Docker与微服务

(1). 创建命名空间

Docker与微服务

(2) 创建镜像仓库

Docker与微服务

Docker与微服务

(3) 阿里云会自动生成操作指南

Docker与微服务

(3)讲镜像推送到Registry

(4)登录

docker login –username=用户名 registry.cn-shanghai.aliyuncs.com

Docker与微服务

(5)设置镜像版本号

docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[镜像版本号]

Docker与微服务

(6)推送

docker push registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[镜像版本号]

Docker与微服务

(7)测试

删除本地Ubuntu1.3的镜像

Docker与微服务

(8)从阿里云Registry中拉取镜像

docker pull registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[镜像版本号]

Docker与微服务

测试成功!

Docker与微服务

二、容器数据卷

1.作用

试想一下:我们的docker容器很容易被自己误删或者被别人恶意删除,那我们容器中的重要数据不就丢失了吗?

docker采用容器数据卷的方式解决此类问题。

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,不属于联合文件系统,可以绕过联合文件系统提供一些用于持久化和共享数据的特性。

容器数据卷设计的目的就是数据的持久化,它完全独立于容器的生存周期,因此Docker不会再容器删除时删除其挂载的数据卷

注意事项

Docker挂载主机目录访问如果出现cannot open directory:Permission denied解决办法:在挂载目录后多加一个–privileged=true参数即可

作用: 扩大容器的权限解决挂载目录没有权限的问题,使得容器中root拥有所有权限,否则root只是外部一个普通的用户

2.特点

  • 数据卷可以在容器之间共享或重复使用
    [En]

    data volumes can be shared or reused between containers*

  • 音量变化可直接实时生效
    [En]

    changes in the volume can take effect directly in real time*

  • 数据卷的更改不会包括在重新镜像的更新中
    [En]

    changes in data volumes will not be included in re-mirrored updates*

  • 数据卷的生命周期一直持续到没有容器使用
    [En]

    the life cycle of a data volume continues until no container uses it*

3.测试

docker run -it –privileged=true -v/宿主机绝对路径目录:/容器内目录 镜像名

Docker与微服务

(1). 在容器docker_data目录中创建文件

Docker与微服务

(2). 在本地host_data目录下发现 dockerin.txt文件已共享

Docker与微服务

(3). 在本地host_data目录下新建文件并写入数据 hello docker

Docker与微服务

(4). 在容器docker_data目录中发现hostin.txt文件 并读取到共享过来的数据

Docker与微服务

(5). docker inspect 容器ID 查看容器内部细节

Docker与微服务

假设容器停止,主机上的新文件可以共享吗?

[En]

Assuming that the container stops, can the new files on the host be shared?

(6). 停止容器

Docker与微服务

(7). 在主机创建文件c.txt

Docker与微服务

(8). 重启容器

Docker与微服务

(9). 进入容器docker_data目录下发现c.txt文件已共享

Docker与微服务

4.容器卷的读写规则

容器数据卷的读写规则默认 rw 可读可写,就如同上述的例子

Docker与微服务

ro:容器实例内部被限制,只能读取不能写

docker run -it –privileged=true -v/宿主机绝对路径目录:/容器内目录:ro 镜像名

(1). 创建只读的Ubuntu容器实例

Docker与微服务

(2). 在本地主机上创建a.txt文件 并写入数据 xueyueqing

Docker与微服务

(3). 这容器中只能读文件,其他操作被限制

Docker与微服务

5.容器卷的继承

docker run -it –privileged=true –volumes-from 父类 –name u2 ubuntu

Docker与微服务

(注意:向将之前的u2容器删除,docker rm 容器ID)

(1). u2继承u1的docker_data目录及目录下的文件

Docker与微服务

(2). 在u2中创建文件,u1中也会共享数据

Docker与微服务

Docker与微服务

当u1停止了,u2会共享本地主机数据吗? 会

Docker与微服务

(3). u2容器共享了主机的数据

Docker与微服务

容器卷的继承本质是继承了容器之间的规则与容器本身没有关系,因此u1容器停止不影响u2容器与本地主机数据共享

如果启动u1容器,那么u1中会有之前本地主机创建的文件吗? 会

Docker与微服务

三、docker上安装常用软件

总体步骤:

  • 搜索镜像
  • 拉取镜像
  • 查看镜像
  • 启动镜像
  • 停止镜像
  • 移除容器

补充:

netstat -tunlp | grep 端口号 查看端口使用情况

ps – ef | grep 端口号 查看端口使用情况

kill – 9 进程号 杀进程

1.Tomcat

(1).搜索镜像 docker search tomcat

Docker与微服务

(2).拉取镜像,一般都是使用第一个 docker pull tomcat

Docker与微服务

(3).查看tomcat镜像是否下载成功 docker images tomcat

Docker与微服务

(4).使用tomcat镜像创建容器实例 docker run -d -p 8080:8080 –name t1 tomcat

-p 小写,主机端口:docker容器端口 -d 后台运行

-P 大写,随机分配端口

(5). 启动成功

Docker与微服务

Docker与微服务

(6). 访问不到tomcat首页

Docker与微服务

首先检查防火墙端口8080是否开启,使用云服务器还需要检查云服务器安全组中的8080端口规则是否添加

检查tomcat中webapps目录下是否有tomcat首页

(7). 进入tomcat容器,发现tomcat中webapps目录下为空

Docker与微服务

(8). 删掉webapps,将webapps.dist 改为webapps

Docker与微服务

成功了!!!

Docker与微服务

(原因是因为新版tomcat 默认访问路径webapps目录是空的,默认配置在webapps.dist目录中 ,需要修改下)

(9). 停止、删除容器一气呵成

Docker与微服务

2.MySQL

(1). 简易版

  • 搜索镜像 docker search mysql

Docker与微服务
  • 拉取镜像,使用5.7版本的 docker pull mysql:5.7

Docker与微服务
  • 查看mysql镜像是否下载成功 docker images mysql

Docker与微服务
  • 使用tomcat镜像创建容器实例 docker run -d -p 8080:8080 –name t1 tomcat

先检查Linux本地主机是否启动了MySQL,防止端口冲突

Docker与微服务
  • 启动容器 docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Docker与微服务
  • 进入容器,登录root用户

Docker与微服务
  • 简单测试下MySQL

Docker与微服务

Docker与微服务
  • 使用SQLyog测试 连接成功

Docker与微服务

问题一:测试中文数据,发现乱码

Docker与微服务

问题二:mysql容器如果被误删了,那么我的数据该怎么办

Docker与微服务

解决方案:请看实战版

(2). 实战版

  • 创建一个mysql目录保存数据

Docker与微服务
  • 使用容器卷保存数据 docker run -d -p 3306:3306 –privileged=true -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 –name mysql mysql:5.7

Docker与微服务
  • 在本地主机/mysql/conf目录下新建my.cnf 文件利用容器卷共享,将文件共享到mysql容器解决乱码
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

Docker与微服务
  • 进入容器,登录mysql

Docker与微服务
  • 查看mysql编码 show variables like ‘character%’

Docker与微服务
  • 测试

Docker与微服务
  • 成功解决中文乱码问题

Docker与微服务
  • mysql容器被删了😂😂😂

Docker与微服务

此时,我们并不害怕数据丢失,因为我们之前使用的是集装箱卷来保存数据。

[En]

At this time, we are not afraid of data loss, because we used container volumes to save data before.

  • 再次创建mysql容器 数据卷宿主机绝对路径就是之前设置的

Docker与微服务
  • 数据库中的数据从本地主机共享,您不再害怕删除数据库并逃离🤣🤣🤣。
    [En]

    the data in the database is shared from the local host, and you are no longer afraid to delete the database and run away from 🤣🤣🤣.*

Docker与微服务

3.Redis

  • 搜索镜像 docker search redis

Docker与微服务
  • 拉取镜像, docker pull redis

Docker与微服务
  • 查看tomcat镜像是否下载成功 docker images redis

Docker与微服务
  • 进入容器,连接客户端

Docker与微服务

这样肯定是不行的,因为redis需要保存数据,还要修改配置文件

  • 在本地主机新建目录 /app/redis

Docker与微服务
  • 将一个redis.conf 文件模板拷贝进 /app/redis 目录下

Docker与微服务
  • 修改redis.conf配置文件

Docker与微服务
  • .将daemonize yes改为 no ,因为该设置何docker run中-d参数冲突,会导致容器一直启动失败

Docker与微服务
  • 再次创建redis容器(记得先把之前6379端口停了)

docker run -p 6379:6379 –name myredis –privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf

Docker与微服务
  • 测试连接成功

Docker与微服务

本文转自:https://blog.csdn.net/qq_52595134/article/details/124460846

Original: https://www.cnblogs.com/helong-123/p/16351020.html
Author: 萌褚
Title: Docker与微服务

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/523435/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球