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镜像创建与发布 - 图1

Commit镜像

  1. # 提交本地镜像
  2. # -a:作者信息 -m:描述信息 容器ID 镜像名称:版本信息
  3. docker commit -a="test" -m="test" 容器id tomcat01:1.0

Docker容器数据卷

容器数据卷

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

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

容器数据卷使用命令

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

挂载MySQL数据库到Liunx宿主机

  1. # 1. 下载MySQL
  2. docker pull mysql
  3. # 2. 启动并挂载 -e:特别注意需要设置密码
  4. docker run -d -p 3306: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镜像创建与发布 - 图2

  1. # 解决报错
  2. # 1. 进入容器内
  3. docker exec -it 容器ID /bin/bash
  4. # 2. 进入MySQL
  5. mysql -uroot -p123456
  6. # 3. 授权
  7. mysql> GRANT ALL ON *.* TO 'root'@'%';
  8. # 4. 刷新权限:
  9. mysql> flush privileges;
  10. # 5. 更新加密规则:
  11. mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
  12. # 6. 更新root用户密码:
  13. mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  14. # 7. 刷新权限:
  15. mysql> flush privileges;

具名和匿名挂载

  1. -v 容器内路径 # 匿名挂载
  2. -v 卷名:容器内路径 # 具名挂载
  3. -v 宿主机路径:容器内路径 # 指定路径挂载
  4. Docker容器内的卷,在没有指定目录的情况下都在/var/lib/docker/volumes/xxx/_data

拓展:绑定权限

  1. # 通过 -v 容器内路径:ro rw 改变读写权限
  2. ro # readonly 只读
  3. rw # readwrite 可读可写
  4. docker run -d nginx01 -v nginxdemo:/etc/nginx:ro nginx
  5. docker run -d nginx01 -v nginxdemo:/etc/nginx:rw nginx
  6. # ro:只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作

数据卷容器挂载

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

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

DockerFile

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

DockerFile构建指令

  1. FROM # 基础镜像,一切从这里开始构建
  2. MAINTAINER # 镜像的作者, 姓名+邮箱
  3. RUN # 镜像构建的时候需要运行的命令
  4. ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
  5. WORKDIR # 镜像的工作目录
  6. VOLUME # 挂载的目录
  7. EXPOSE # 保留端口配置
  8. CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
  9. ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
  10. COPY # 类似ADD,将文件拷贝到镜像中
  11. ENV # 构建的时候设置环境变量!

创建一个自己的CentOS镜像

A、创建DockerFile

  1. vim mycentos

B、编写DockerFile

  1. FROM centos
  2. MAINTAINER Fcant<fcscanf@outlook.com>
  3. ENV MYPATH /usr/local
  4. WORKEDIR $MYPATH
  5. RUN yum -y install vim
  6. EXPOSE 80
  7. CMD /bin/bash

C、构建自己的镜像

  1. docker build -f mycentos -t mycentosdemodo:1.0 .

D、查看镜像生成历史

  1. docker history 镜像ID

创建Tomcat镜像

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

2、编写DockerFile(文件名为Dockerfile)

注意ADD命令后面的文件可以从绝对路径或者相对路径读取,如果无路径则表明从当前目录读取添加的文件

  1. FROM centos
  2. MAINTAINER Fcant<fcscanf@outlook.com>
  3. COPY README.txt /local/dev/README.txt
  4. ADD jdk-8u161-linux-x64.tar.gz /local/dev/java
  5. ADD apache-tomcat-9.0.37.tar.gz /local/dev/tomcat
  6. RUN yum -y install vim
  7. ENV MYPATH /usr/local
  8. WORKDIR $MYPATH
  9. ENV JAVA_HOME /usr/local/jdk1.8.0_161
  10. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  11. ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
  12. ENV CATALINA_BASH /usr/local/apache-toacat-9.0.37
  13. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
  14. EXPOSE 8080
  15. CMD ["/usr/local/apache-tomcat-9.0.37/bin/catalina.sh", "run"]

3、打包镜像

  1. # 这里使用的是Dockerfile文件来构建的脚本,所以可以省略-f参数对Dockerfile文件进行指定
  2. docker build -t tomcat .

打包执行步骤

Docker镜像创建与发布 - 图3Docker镜像创建与发布 - 图4

4、启动镜像

  1. docker run -d -p 8080:8080 --name mttomcat -v /home/fortuneteller/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/test -v /home/fortuneteller/tomcat/logs:/usr/local/apache-tomcat-9.0.37/logs mytomcat

5、测试运行

Docker镜像创建与发布 - 图5

6、在宿主机的/home/fortuneteller/tomcat/test目录下创建WEB-INF目录与index.html

  1. <!DOCCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Tomcat From Docker</title>
  7. </head>
  8. <body>
  9. <h2>Hello, I'm Form Docker</h2>
  10. </body>
  11. </html>

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">
  6. <display-name>test</display-name>
  7. </web-app>

8、测试访问

Docker镜像创建与发布 - 图6

本地镜像上传阿里云

  1. 登陆阿里云容器镜像服务
  2. 创建命名空间

Docker镜像创建与发布 - 图7

  1. 创建仓库

Docker镜像创建与发布 - 图8

  1. 设置固定密码

Docker镜像创建与发布 - 图9

  1. 查看自己的推送命令

Docker镜像创建与发布 - 图10

Docker镜像创建与发布 - 图11

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

Docker镜像创建与发布 - 图12

Docker镜像创建与发布 - 图13

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

Docker总结

Docker镜像创建与发布 - 图14

Docker部署SpringBoot项目

  1. 使用Maven构建获得jar包
  2. 编写Dockerfile
  1. FROM java:8
  2. COPY *.jar /app.jar
  3. CMD ["--server.port=8080"]
  4. EXPOSE 8080
  5. ENTRYPOINT ["java", "jar", "app.jar"]
  1. 上传Docker与jar包到Linux服务器
  2. 使用命令获得镜像
  1. docker build -t ideatest .
  1. 使用命令查看获取到镜像编号
  1. docker images
  1. 启动镜像
  1. docker run -d -p 3344:8080 ideatest # 3344端口需要提前在阿里云放开
  1. 测试访问

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