一、Docker镜像原理
镜像是一种轻量级、可执行的独立软件包,用来打包运行坏境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件。
Linux文件系统由bootfs和rootfs两部分组成(不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等)
- bootfs:包含bootloader(引导加载程序)和 kernel(内核)
- rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
- Docker镜像是由特殊的文件系统叠加而成,最底端是 bootfs,并使用宿主机的bootfs,第二层是 root文件系统rootfs,称为base image,然后再往上可以叠加其他的镜像文件。
- 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
思考:
1、Docker 镜像本质是什么?是一个分层文件系统2、 Docker 中一个 centos 镜像为什么只有 200MB ,而一个 centos 操作系统的 iso 文件要几个个 G ?Centos的 iso 镜像文件包含 bootfs 和 rootfs ,而 docker 的 centos 镜像复用操作系统的 bootfs ,只有 rootfs 和其他镜像层3、 Docker 中一个 tomcat 镜像为什么 有 500MB ,而一个 tomcat 安装包只有 70 多 MB ?由于docker 中镜像是分层的, tomcat 虽然只有 70 多 MB ,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的 tomcat 镜像 大小 500 多 MB
二、Docker 镜像制作
1、容器转为镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:版本
docker commit -m=“add webapps” -a=“huangjian” 43de3dfa576a tomcathj:1.0
2、dockerfile
- Dockerfile 是一个文本文件
- 包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
- 对于运维人员:在部署时,可以实现应用的无缝移植
Dochub网址:https://hub.docker.com
三、案例:定义dockerfile,发布springboot项目
1、输入Alt+p命令到传输界面,将springboot的jar包传入到centos新建的docker-files文件夹中
put E:/IdeaProject/springboot-mybatis/target/springboot-mybatis-0.0.1-SNAPSHOT.jar
2、进入springboot_dockerfile
①定义父镜像:FROM java:8
②定义作者信息:MAINTAINER hj <hj@qq.com>
③将jar包添加到容器: ADD springboot-mybatis/target/springboot-mybatis-0.0.1-SNAPSHOT.jar app.jar
④定义容器启动执行的命令:CMD java -jar app.jar
⑤通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本
四、服务编排
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。
- 要从Dockerfile build image 或者去dockerhub拉取image
- 要创建多个container
- 要管理这些container(启动停止删除)
服务编排:按照一定的业务规则批量管理容器
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:
- 利用 Dockerfile 定义运行环境镜像
- 使用 docker-compose.yml 定义组成应用的各服务
- 运行 docker-compose up 启动应用
1、安装Docker Compose
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我们以编译好的二进制包方式安装在Linux系统中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose -`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
2、卸载Docker Compose
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
3、使用docker compose编排nginx+springboot项目
(1)、创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
(2)、编写 docker-compose.yml 文件(vim docker-compose.yml )
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
(3)、创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
(4)、在./nginx/conf.d目录下 编写itheima.conf文件
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
(5)、在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up
(6)、测试访问
五、Docker 私有仓库
Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像 到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜 像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
1、私有仓库搭建
# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
# 4、修改daemon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries":["私有仓库服务器ip:5000"]}
# 5、重启docker 服务
systemctl restart docker
docker start registry
2、将镜像上传至私有仓库
# 1、标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器IP:5000/centos:7
# 2、上传标记的镜像
docker push 私有仓库服务器IP:5000/centos:7
3、从私有仓库拉取镜像
docker pull 私有仓库服务器ip:5000/centos:7
六、docker容器虚拟化与传统虚拟机比较
容器就是将软件打包成标准化单元,以用于开发、交付和部署。
- 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
相同点:容器和虚拟机具有相似的资源隔离和分配优势
不同:容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统