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镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部
这一层就是通常说的容器层,容器之下的都叫镜像层
image.png

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

此时使用远程连接报错
image.png

  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 .

打包执行步骤
image.pngimage.png

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.测试运行

image.png

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

image.png

本地镜像上传阿里云

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

image.png

  1. 创建仓库

image.png

  1. 设置固定密码

image.png

  1. 查看自己的推送命令

image.png
image.png

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

image.png
image.png

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

    Docker总结

    image.png

    Docker部署SpringBoot项目

  2. 使用Maven构建获得jar包

  3. 编写Dockerfile

    1. FROM java:8
    2. COPY *.jar /app.jar
    3. CMD ["--server.port=8080"]
    4. EXPOSE 8080
    5. ENTRYPOINT ["java", "jar", "app.jar"]
  4. 上传Docker与jar包到Linux服务器

  5. 使用命令获得镜像

    1. docker build -t ideatest .
  6. 使用命令查看获取到镜像编号

    1. docker images
  7. 启动镜像

    1. docker run -d -p 3344:8080 ideatest # 3344端口需要提前在阿里云放开
  8. 测试访问

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