乐趣区

关于前端:Docker中级篇深入探究Docker

简介: 深刻探索 Docker

Docker 镜像了解

Docker 镜像是什么

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

Docker 镜像加载原理

UnionFs:联结文件系统

UnionFs(联结文件系统):Union 文件系统 (UnionFs) 是一种分层、轻量级并且高性能的文件系统,它反对对文件系统的批改作为一次提交来一层层的叠加,同时能够将不同目录挂载到同一个虚构文件系统下,UnionFs 联结文件系统是 Docker 镜像的根底,镜像能够通过分层来进行继承,基于根底镜像(没有父镜像),能够制作各种具体的利用镜像个性:一次同时加载多个文件系统,但从里面看起来,只能看到一个文件系统,联结加载会把各层文件系统叠加起来,这样最终的文件系统会蕴含所有底层的文件和目录

Docker 镜像加载原理

Docker 的镜像实际上由一层一层的 UnionFs 文件系统组成 bootfs:次要蕴含 bootloader 和 Kernel,bootloader 次要是疏导加 kernel,Linux 刚启动时会加 bootfs 文件系统,在 Docker 镜像的最底层是 bootfs,这一层与咱们典型的 Linux/Unix 零碎是一样的,蕴含 bootfs 加载器和内核,当 bootfs 加载实现之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时零碎也会卸载 bootfs。rootfs:在 bootfs 之上,蕴含的就是典型 Linux 零碎中的 /dev、/proc、/bin、/etc 等规范目录和文件,rootfs 就是各种不同的操作系统发行版,比方:Ubuntu,、CentOS 等等

简略了解:

  1. 对于 Docker 装置 OS 来说:就是 Docker 应用了 Linux 自身的 bootfs,只须要装置本人所需的 rootfs
  2. 对于 Docker 装置一般镜像来说:就是 Docker 自身是分层下载镜像,所以能够提取出公共层镜像,进行复用

Docker 镜像的特点

Docker 镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部

这一层就是咱们通常说的容器层,容器之下的都叫镜像层

Commit 镜像

# 提交本地镜像

-a:作者信息 -m:形容信息 容器 ID 镜像名称: 版本信息

docker commit -a=”test” -m=”test” 容器 id tomcat01:1.0

Docker 容器数据卷

什么是容器数据卷

容器之间能够有一个数据共享的技术!Docker 容器中产生的数据,同步到本地!

这就是卷技术!目录的挂载,将咱们容器内的目录,挂载到 Linux 下面!

容器数据卷应用命令

# 命令
docker run -it -v 主机目录: 容器内目录 /bin/bash

挂载 MySQL 数据库到 Liunx 宿主机

# 1. 下载 MySQL
docker pull mysql

2. 启动并挂载 -e:特地留神须要设置明码

docker run -d -p 3344:3306 -v /home/conf:/etc/mysql/conf.d -v /home/logs:/logs -v /home/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql

此时咱们应用近程连贯软件会报错

# 解决报错

1. 进入容器内

docker exec -it 容器 ID /bin/bash

2. 进入 MySQL

mysql -uroot -p123456

3. 受权

mysql> GRANT ALL ON *.* TO ‘root’@’%’;

4. 刷新权限:

mysql> flush privileges;

5. 更新加密规定:

mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘password’ PASSWORD EXPIRE NEVER;

6. 更新 root 用户明码:

mysql> ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123456’;

7. 刷新权限:

mysql> flush privileges;

具名和匿名挂载

-v 容器内门路 # 匿名挂载
-v 卷名: 容器内门路 # 具名挂载
-v 宿主机门路: 容器内门路 # 指定门路挂载

Docker 容器内的卷,在没有指定目录的状况下都在 /var/lib/docker/volumes/xxx/_data 下

拓展:绑定权限

# 通过 -v 容器内门路:ro rw 扭转读写权限
ro # readonly 只读
rw # readwrite 可读可写
docker run -d nginx01 -v nginxdemo:/etc/nginx:ro nginx
docker run -d nginx01 -v nginxdemo:/etc/nginx:rw nginx

ro:只有看到 ro 就阐明这个门路只能通过宿主机来操作,容器外部是无奈操作

数据卷容器挂载

目标:实现多个容器间的数据同步(多个 MySQL 间共享数据)

# 应用 –volumes-from 容器名称 此命令实现数据卷容器挂载
docker run -d –name mysql02 -p 3345:3306 –volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql

DockerFile

DockerFile 是用来构建 Docker 镜像的文件(命令参数脚本)

DockerFile 构建指令

FROM # 根底镜像,所有从这里开始构建
MAINTAINER # 镜像是谁写的,姓名 + 邮箱
RUN # 镜像构建的时候须要运行的命令
ADD # 步骤,tomcat 镜像,这个 tomcat 压缩包!增加内容 增加同目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最初一个会失效,可被代替
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,能够追加命令
COPY # 相似 ADD,将咱们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!

创立一个本人的 CentOS 镜像

  • 创立 DockerFilevim mycentos
  • 编写 DockerFileFROM centos MAINTAINER MT<1746344046@qq.com> ENV MYPATH /usr/local WORKEDIR $MYPATH RUN yum -y install vim EXPOSE 80 CMD /bin/bash
  • 构建本人的镜像 docker build -f mycentos -t mycentosdemodo:1.0 .
  • 查看镜像生成历史 docker history 镜像 ID

创立 Tomcat 镜像

1. 筹备镜像文件:Tomcat 和 JDK 的压缩包

2. 编写 DockerFile

FROM centos
MAINTAINER fortuneteller<1746344046@qq.com>

COPY README.txt /usr/local/README.txt

ADD jdk-8u251-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.35.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_251
ENV CLASSPATH $JAVA\_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35
ENV CATALINA_BASH /usr/local/apache-toacat-9.0.35
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA\_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD [“/usr/local/apache-tomcat-9.0.35/bin/catalina.sh”, “run”]

3. 打包镜像

# 这里应用的是 Dockerfile 来明确的脚本,所以省略 -f
docker build -t mytomcat .

4. 启动镜像

docker run -d -p 3344:8080 –name mttomcat -v /home/fortuneteller/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/fortuneteller/tomcat/logs:/usr/local/apache-tomcat-9.0.35/logs mytomcat

5. 测试运行

6. 在宿主机的 /home/fortuneteller/tomcat/test 目录下创立 WEB-INF 目录与 mt.jsp

<%@ page contentType=”text/html;charset=UTF-8″ language=”java” %>
<html>
<head>

<title>docker</title>

</head>
<body>
———-welcome————
<%=” 这是一个测试页面 ”%>
</body>
</html>

7. 在 WEB-INF 目录下编写 web.xml 文件

<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app xmlns=”http://xmlns.jcp.org/xml/ns/javaee”

     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app\_3\_1.xsd"
     version="3.1">
<display-name>test</display-name>

</web-app>

8. 测试拜访

本地镜像上传阿里云

1. 登陆阿里云容器镜像服务

2. 创立命名空间

3. 创立仓库

4. 设置固定明码

5. 查看本人的推送命令

6. 应用推送命令实现上传

7. 拉取时同理依据阿里云提醒命令实现即可


Docker 总结

Docker 部署 SpringBoot 我的项目

1. 应用 Maven 构建取得 jar 包

2. 编写 Dockerfile

FROM java:8

COPY *.jar /app.jar

CMD [“–server.port=8080”]

EXPOSE 8080

ENTRYPOINT [“java”, “jar”, “app.jar”]

3. 上传 Docker 与 jar 包到 Linux 服务器

4. 应用命令取得镜像

docker build -t ideatest .

5. 应用命令查看获取到镜像编号

docker images

6. 启动镜像

docker run -d -p 3344:8080 ideatest # 3344 端口须要提前在阿里云放开

7. 测试拜访

在浏览器输出:服务器 ip:3344

原文链接:https://developer.aliyun.com/…

本文为阿里云原创内容,未经容许不得转载。

退出移动版