原创作者:田超凡(程序员田宝宝)
版权所有,引用请注明原作者,严禁复制转载
Docker 镜像原理
基于docker安装tomcat服务器 是否需要配置jdk环境变量呢?
docker安装tomcat:8 --jdk8 配置环境变量
docker安装tomcat:9 --jdk9 配置环境变量
如何封装配置环境依赖的呢?
Dockerfile---文件
Tomcat 100mb
1.依赖于我们JDK 200mb
2.Linux服务器centos 200mb
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
镜像文件的组成通过 Union fs运行tomcat镜像文件
tomcat镜像文件
- 依赖于JDK
- Linux服务器
为什么运行tomcat镜像文件,不需要配置jdk环境变量。
- tomcat镜像文件包含jdk依赖镜像 tomcat8-----jdk8镜像文件
- 底层dockerfile -----描述配置jdk环境
镜像加载的原理
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会在镜像上面加载一个可读可写的文件系统作为容器运行。
Docker Commit
主要作用:根据当前容器制作为镜像文件
流程:
- 从docker hub中下载一个tomcat8镜像文件;
- 运行tomcat8镜像文件 在tomcatwebapps 目录中新增 tcf文件夹 index.html
- 将当前容器内容根据模板制作为镜像文件
docker commit提交容器副本使之成为一个新的镜像
命令:docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
- 安装一个tomcat8
docker run -p 8081:8080 tomcat:8
- docker exec -it 3a06b4c779a8 bash
- cd webapps
- mkdir tcf
- touch index.html
- echo "tcf" >>index.html
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
1.根据当前容器作为模板制作为镜像文件
docker commit -m="tcf tomcat" -a="tcf" 3a06b4c779a8 tcf-tomcat:1.0
2.在以当前自己制作的镜像文件运行
docker run -p 8088:8080 tcf-tomcat:1.0
Docker数据卷
基本的概念
数据卷就是宿主机上的一个文件或目录
当容器目录和数据卷(宿主机)目录绑定,双方修改会立即同步操作
一个数据卷可以被多个容器同时挂载
数据卷作用:容器数据的持久化 外部机器和容器间接通信 容器之间数据交换
使用 -v命令。
数据卷添加的方式
容器内与宿主机实现数据的共享
数据卷--添加两种方式
- 直接命令形式添加 docker run -it -v 宿主机绝对路径目录:容器内目录 镜像文件名称
- Dockerfile方式添加
安装Nginx实现负载均衡
挂载nginx html文件
- 创建挂载目录
mkdir -p /data/nginx/{conf,conf.d,html,logs}
- 启动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目录
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实战部署软件
安装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 tcf-tomcat -p 8081:8080 -d tomcat:8
--name: 指定容器名称
-p:指定容器端口号
-d:指定容器后台运行
docker run --name tcf-tomcat tomcat
docker run --name tcf-tomcat1 -p 8081:8080 tomcat
8081(容器外部或者linux虚拟机访问的端口号 宿主机)
8080 容器内部的端口号
docker run --name tcf-tomcat2022 -p 8081:8080 -d tomcat:8
-d 后台启动
前台启动与后台启动的区别
前台启动会打印启动日志信息
后台启动不会打印启动日志信息
安装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-tcf -p 8080:80 nginx 默认前台启动
docker run --name nginx-tcf -p 8080:80 -d nginx 后台启动方式
前台与后台启动区别:
前台启动:会展示容器启动的日志信息-----
后台启动:不会展示启动日志信息
8080:80 8080 虚拟机本地端口 ---浏览器访问 80 容器内部端口
Elk+kafka---
systemctl stop firewalld
安装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
- 启动容器
docker start mysql3308
- 进入到容器
docker exec -it mysql3308 bash
- mysql连接
mysql -uroot –p
Docker运行底层原理
- 首先启动docker systemctl start docker
- Docker是一个CS架构的系统,docker守护进程运行在主机上,让后通过socket连接
从客户端访问,守护进程从客户端接收命令管理运行在主机上的容器。
ps aux | grep 'docker'
数据卷volumes-from
容器间传递共享数据volumes-from
启动容器报错了如何解决?
先改为前台启动如果没有问题的情况下,在修改为后台启动。
本文部分素材转载自蚂蚁课堂