简介: 深入探究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,只需要安装自己所需的rootfs2. 对于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.txtADD jdk-8u251-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.35.tar.gz /usr/localRUN yum -y install vimENV MYPATH /usr/local
WORKDIR $MYPATHENV 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/binEXPOSE 8080CMD ["/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:8COPY *.jar /app.jarCMD ["--server.port=8080"]EXPOSE 8080ENTRYPOINT ["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/article/769273

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

Docker中级篇|深入探究Docker相关推荐

  1. 《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis

    文章目录 8.Docker常规安装简介 8.1 docker常规安装总体步骤 8.2安装tomcat 8.3 安装mysql 8.3.1 docker hub上面查找mysql镜像 8.3.2 从do ...

  2. 玩转Docker实战篇!使用Docker搭建Sinatra Web程序,附加介绍容器关联(Docker Networking、Docker链接)

    一.本文目的 前面一篇文章,我们在Docker中搭建了Nginx服务器,并访问了Nginx服务器:https://blog.csdn.net/qq_41453285/article/details/1 ...

  3. 玩转Docker实战篇!使用Docker与Jenkins进行持续集成测试,附加介绍Docker-in-Docker

    一.本文目的 在前面的文章中,所有的测试例子都是本地的.围绕着单个开发者的(就是说,如何让本地开发者使用Docker来测试本地网站或者引用程序).现在来看看在多开发者的持续集成测试场景中如何使用Doc ...

  4. 『中级篇』docker容器安装wordpress(37)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker容器安装wordpress(37) 第一节的时候我就部署过wordpress,可能很多老铁一头雾水不知道 ...

  5. 『中级篇』docker之CI/CD持续集成-项目生成镜像(76)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之CI/CD持续集成-项目生成镜像(76) 开始想用docker registry做私有镜像库,后来放弃 ...

  6. 『中级篇』docker之wordpress容器SSL(番外篇)(78)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之wordpress容器SSL(番外篇)(78) 搞了2天终于搞定了,现在分享给大家. apache2 ...

  7. 『中级篇』阿里云安装Docker企业版UCP和DTR(59)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』阿里云安装Docker企业版UCP和DTR(59) 前面一节讲到了如何在阿里云使用容器服务的方式,本节主要讲讲如何在 ...

  8. 『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81) 之前一直用的原生的centos7的源镜像安装虚拟机,然 ...

  9. 『中级篇』Docker Cloud自动构建 Docker image(55)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』Docker Cloud自动构建 Docker image(55) 一步一步的接近下面这个图,来通过时间的方式git ...

最新文章

  1. Bzoj3530: [Sdoi2014]数数
  2. C++中 gets()函数
  3. 阿里开源分布式事务解决方案 Fescar
  4. 微服务、SOA 和 API对比与分析
  5. VUE全局导航守卫、 请求、响应拦截器 的设置
  6. 通过Github创建Android库供其他项目依赖引用
  7. 【Java中级篇】Dom4j解析xml数据
  8. 我的第二个开源库SuperTextView——中文文档
  9. 介绍计算机课程英语作文,关于电脑课的英语作文
  10. DWORD winapi java_DWORD WINAPI?stdcall?
  11. 企信下载的文件在哪里_Foobar2000(无损音乐播放器下载)(软件篇)
  12. 目录扫描暴力破解网站管理员密码
  13. 计算机无法从usb启动不了,无法从u盘启动【设置思路】
  14. java 假币问题_假币问题-题解(Java代码)
  15. 使用DNSLog进行盲打
  16. 红米10a和12c哪个好 红米10a和红米12c区别
  17. 如何看待哔哩哔哩(B站)的后端代码主仓库被上传至了GitHub?
  18. android电子书App、自定义图表、仿腾讯漫画App、仿淘宝优惠券、3D选择容器等源码...
  19. vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置
  20. 全国首个海洋大数据交易服务平台交易额破百万

热门文章

  1. element tree不刷新视图_Vue项目布署后,刷新页面404的真正原因找到了
  2. python中可通过()实现代码的复用_(  )是可复用的,提供明确接口完成特定功能的程序代码块。...
  3. 响应文件是不是标书_标书的编制
  4. 执行公式_一学就会,一吃就瘦,超简单又好执行的减肥食谱公式!
  5. adb native raact 夜神_React-Native安装及环境搭建(夜神模拟机运行)
  6. java 标准输入流 关闭 打开_java--标准输入输出流
  7. vim复制粘贴_打造一款高逼格的Vim神器
  8. python import如何使用_python之import引用
  9. 武未转变服务器tp,未转变者怎么tp别人 | 手游网游页游攻略大全
  10. 三甲医院his系统源码_三甲医院科研管理系统是什么,科研成果包括哪些