一、镜像加载的原理
(一)docker底层结构
1.Linux文件系统由bootfs和rootfs两部分组成
bootfs:包含bootloader(引导加载程序)和 kernel(内核)
rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
Docker镜像底层实际上是有多个不同的联合文件系统组成的
最底层:bootfs,并使用宿主机的bootfs-复用
第二层:root文件系统rootfs,称为base image
Union fs
然后再往上可以叠加其他的镜像文件
统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,隐藏多层的存在,我们看来只是存在一个文件系统。
所以当我们安装的tomcat镜像大小是600多MB 是因为里面还包含了jdk和centos的镜像
而centos镜像复用了宿主机的bootfs 下载的只有rootfs 所以小很多
所以tomcat>jdk(父镜像)->centos> 所以整个向外暴露就是600MB
镜像只读 当从一个镜像启动容器时, 所以docker会在镜像上面加载一个可读可写的文件系统作为容器运行。
https://hub.docker.com/_/tomcat
(二)Docker Commit
主要作用:根据当前容器制作为镜像文件
流程:
- 从docker hub中下载一个tomcat8镜像文件;
- 运行tomcat8镜像文件 在tomcatwebapps 目录中新增 boyatop文件夹 index.html
- 将当前容器内容根据模板制作为镜像文件
1.安装一个tomcat8
docker run -p 8081:8080 tomcat:8
2.docker exec -it 3a06b4c779a8 bash
3.cd webapps
4.mkdir boyatop
5.touch index.html
6.echo "boyatop" >>index.html
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
1.根据当前容器作为模板制作为镜像文件
docker commit -m="boyatop tomcat" -a="boyatop" 3a06b4c779a8 boyatop-tomcat:1.0
2.在以当前自己制作的镜像文件运行
docker run -p 8088:8080 boyatop-tomcat:1.0
(三)docker数据卷
数据卷就是宿主机上的一个文件或目录
当容器目录和数据卷(宿主机)目录绑定,双方修改会立即同步操作
一个数据卷可以被多个容器同时挂载
数据卷作用:容器数据的持久化 外部机器和容器间接通信 容器之间数据交换
使用 -v命令。
1.数据卷添加的方式
容器内与宿主机实现数据的共享
数据卷--添加两种方式
(1)直接命令形式添加 docker run -it -v 宿主机绝对路径目录:容器内目录 镜像文件名称
(2)Dockerfile方式添加
2.安装Nginx实现负载均衡
(1)挂载nginx html文件
https://hub.docker.com/search?q=nginx&type=image
1.创建挂载目录
mkdir -p /data/nginx/{conf,conf.d,html,logs}
2.启动docker容器
docker run --name nginx81 -d -p 81:80 -v /data/nginx/html:/usr/share/nginx/html nginx
-v /data/nginx/html 虚拟机目录 --挂载 容器目录 /usr/share/nginx/html
上传一个 html 放入到 /data/nginx/html
docker run --name nginx81 -d -p 81:80 -v /data/nginx/html:/usr/share/nginx/html nginx
-v /data/nginx/html: linux虚拟机目录
/usr/share/nginx/html 容器中html目录
(2)nginx .conf文件和日志文件
docker run --name nginx81 -d -p 81:80 -v /data/nginx/html:/usr/share/nginx/html \
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/logs:/var/log/nginx nginx
\反斜杠 表示换行
/usr/share/nginx/html
/usr/share/nginx/conf
/usr/share/nginx/log
(三)docker实战部署软件
1.安装tomcat 服务器
docker run -p 8081:8080 tomcat:8 -p 8081 :8080
容器外部(linux虚拟机访问端口8081):8080(容器端口号)
docker ps 获取tomcat正在运行的容器id 进入到中
docker exec -it 1210e05f1a59 bash
docker run -p 8081:8080 tomcat:8
-p 8081:8080 8081(linux虚拟机访问的端口号):8080(容器内部中端口号)
docker run -p 8081:8080 -d tomcat:8 后台启动 ---每次运行都会创建一个新的容器
docker run --name boyatop-tomcat -p 8081:8080 -d tomcat:8
--name: 指定容器名称
-p:指定容器端口号
-d:指定容器后台运行
docker run --name boyatop-tomcat tomcat
docker run --name boyatop-tomcat1 -p 8081:8080 tomcat
8081(容器外部或者linux虚拟机访问的端口号 宿主机)
8080 容器内部的端口号
docker run --name boyatop-tomcat2022 -p 8081:8080 -d tomcat:8
-d 后台启动
前台启动与后台启动的区别
前台启动会打印启动日志信息
后台启动不会打印启动日志信息
2.安装Nginx实现静态服务
Docker run 运行容器
--name nginx-test:容器名称。
-p 8080:80 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
-d nginx: 设置容器在在后台一直运行。
docker ps --- 正在运行的容器
docker ps -a 显示所有的容器 包括为运行的容器
docker ps 容器id
docker run --name nginx-boyatop -p 8080:80 nginx 默认前台启动
docker run --name nginx-boyatop -p 8080:80 -d nginx 后台启动方式
前台与后台启动区别:
前台启动:会展示容器启动的日志信息-----
后台启动:不会展示启动日志信息
8080:80 8080 虚拟机本地端口 ---浏览器访问 80 容器内部端口
3.安装mysql5.7
1.查询mysql版本
docker search mysql
2.下载MySQL5.7版本
docker pull mysql:5.7 (这里选择的是第一个mysql镜像, :5.7选择的5.7版本)
3.等待下载完成、创建MySQL容器
docker create --name mysql3308 -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 mysql:5.7
创建容器名称为mysql3308,密码为root
1.启动容器
docker start mysql3308
2.进入到容器
docker exec -it mysql3308 bash
3.mysql连接
mysql -uroot –p
(四)docker运行底层原理
- 首先启动docker systemctl start docker
- Docker是一个CS架构的系统,docker守护进程运行在主机上,让后通过socket连接
从客户端访问,守护进程从客户端接收命令管理运行在主机上的容器。
ps aux | grep 'docker'
网站为bs
数据卷volumes-from
容器间传递共享数据volumes-from
启动容器报错了如何解决?
先改为前台启动如果没有问题的情况下,在修改为后台启动。
容器与容器局域网
(五)DockerFile 解析
一个镜像文件到底是如何创建?
- dockerfile 描述出镜像文件需要的一些依赖配置和环境变量 执行命令
- 将我们dockerfile 文件打包成一个镜像文件
- 直接使用我们的容器运行到该镜像文件。
- 需要手动编写一个dockerfile文件
- 将该dockerfile docker build 自定义成一个镜像文件
- docker run 运行容器
Centos镜像文件
docker run -it centos
DockerFile编写规范
A.#描述注释
B.指令必须要大写,后面至少需要带至少一个参数;
C.指令是按照从上到下,顺序执行;
DockerFile指令
- FROM 指定父镜像: 基于哪个镜像image构建 指定基础镜像,必须为第一个命令
- MAINTAINER :维护者
- RUN: 容器创建的时候执行一段命令 构建镜像时执行的命令
- ADD: 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
- COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
- CMD:构建容器后调用,也就是在容器启动时才进行调用。 .sh执行文件
- ENV: 设置环境变量
- EXPOSE: 指定于外界交互的端口
- VOLUME 用于指定持久化目录
- WORKDIR 设置进入容器时的路径
-
Tomcat docker File:
https://github.com/docker-library/redis/blob/231905d0841f52ee4f3a5b8b42d62cd6d14a1a93/6.2/Dock
DockerFile案例
Base镜像(scratch) docker hub中的镜像都是通过base镜像中安装和配置需要的软件构建的。
构建自己centos镜像
docker run -it centos
- 需求定制修改centos根目录;
- 实现支持vim插件;
yum -y install vim
需要自己制作一个dockerfile文件
继承docker hub中的centos
在docker hubcentos 上加入以下两个功能
A.进入容器中 默认访问目录/usr
B.实现支持vim插件
需要将该dockerfile文件打包成一个镜像文件 交给我们容器执行
定制cenos镜像
FROM centos
MAINTAINER boyatop-yushengjun
ENV MYPATH /usr
WORKDIR $MYPATH
RUN yum -y install vim
EXPOSE 80
CMD /bin/bash
Dockerfile→使用docker 将该Dockerfile实现打包成镜像文件→容器运行该镜像文件。
docker build---将该Dockerfile实现打包成镜像文件
将该dockerfile文件上传到linux服务器中
使用docker build -f Dockerfile -t mycs:1 .
Dockerfile ------配置文件
mycs----打包镜像文件名称
1 tag 版本号码
docker run -it mycs:1
将springboot项目打包部署
1.基于docker原生方式 部署我们的springboot项目
Dockerfile
2.dockercompose----- 容器编排技术
springboot项目----变成镜像文件---容器运行
1.将我们springboot项目---打成一个jar包
2.定义dockerfile文件-----描述出springboot项目 配置依赖和环境变量
JDK
注意:springboot内置嵌入我们的tomcat服务器 所以不需要额外的tomcat容器来
运行。
原生方式运行我们的jar包
Java- jar指令
2.需要先将我们外部jar,拷贝到容器中
3.容器运行成功执行java -jar
2.将该dockerfile文件打包成镜像文件-
1.将springboot项目打包;
2.制作dockerfile文件;
A.继承我们的jdk环境
B.将我们本地的jar包拷贝到容器中
C.Java -jar
3.将dockerfile文件打包成镜像文件;
4.运行该镜像文件即可;
将springboot项目打包
mvn clean package
制作dockerfile文件
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER www.boyatop.com
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为boyatop.jar
ADD boyatop-thymeleaf-1.0-SNAPSHOT.jar boyatop.jar
# 运行jar包
RUN bash -c 'touch /boyatop.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/boyatop.jar"]
#暴露8080端口
EXPOSE 8080
打包成镜像文件
docker build -f Dockerfile -t boyatop-member:1 .
docker build -f Dockerfile -t boyatop-member:1 .
启动容器
docker run -p 8070:8080 boyatop-member:1