Docker 中级篇

Stella981
• 阅读 313

公众号关注“ 杰哥的IT之旅 ”,

选择“ 星标 ”, 重磅干货,第一时间送达!

Docker 中级篇

来自:阿里云开发者社区

作者:Fortuneteller

链接:https://developer.aliyun.com/article/769273

=======================================================================================================

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镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部

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

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. 下载MySQLdocker 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

此时我们使用远程连接软件会报错

Docker 中级篇

# 解决报错# 1. 进入容器内docker exec -it 容器ID /bin/bash# 2. 进入MySQLmysql -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 nginxdocker 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镜像

  • 创建DockerFile

    vim mycentos

  • 编写DockerFile

    FROM centosMAINTAINER MT1746344046@qq.comENV MYPATH /usr/localWORKEDIR $MYPATHRUN yum -y install vimEXPOSE 80CMD /bin/bash

  • 构建自己的镜像

    docker build -f mycentos -t mycentosdemodo:1.0 .

  • 查看镜像生成历史

    docker history 镜像ID

创建Tomcat镜像

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

2.编写DockerFile

FROM centosMAINTAINER fortuneteller<1746344046@qq.com>COPY README.txt /usr/local/README.txtADD jdk-8u251-linux-x64.tar.gz /usr/localADD apache-tomcat-9.0.35.tar.gz /usr/localRUN yum -y install vimENV MYPATH /usr/localWORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_251ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35ENV CATALINA_BASH /usr/local/apache-toacat-9.0.35ENV 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来明白的脚本,所以省略-fdocker 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.测试运行

Docker 中级篇

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.测试访问

Docker 中级篇

本地镜像上传阿里云

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

  2. 创建命名空间

  3. 创建仓库

  4. 设置固定密码

Docker 中级篇

  1. 查看自己的推送命令

Docker 中级篇

  1. 使用推送命令完成上传

Docker 中级篇

  1. 拉取时同理根据阿里云提示命令完成即可

Docker总结

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


如果您觉得这篇文章对您有点用的话,麻烦您为本文来个四连:转发分享、点赞、点在看、留言,因为这将是我写作与分享更多优质文章的最强动力!


本公众号全部博文已整理成一个目录,请在公众号后台回复「m」获取!

推荐阅读:

1、 10 个冷门但又非常实用的 Docker 使用技巧!
2、 Docker 入门终极指南:边学边用
3、 高中生也能读懂的Docker入门教程
4、 Docker 入门看这一篇就够了!
5、 IT运维面试问题总结-运维工具、开源应用(Ansible、Ceph、Docker、Apache、Nginx等)

关注微信公众号「 杰哥的IT之旅」,后台回复「 1024」查看更多内容,回复「 加群备注:地区-职业方向-昵称 即可加入读者交流群。

===============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

Docker 中级篇

               点个[在看],是对杰哥最大的支持! 
               
             
      
            
            
            
     
           
           
           
    
          
          
          
   
         
         
         
  
        
        
        

      
      
      

本文分享自微信公众号 - 杰哥的IT之旅(Jake_Internet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(
可莉 可莉
2年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这