这就是你日日夜夜想要的docker!!!---------Docker镜像制作与私有仓库建立
文章目录
一、docker镜像介绍
1、什么是Docker镜像
Docker 镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引 导系统,即 bootfs,这很像典型的 Linux/Unix 的引导文件系统。Docker 用户几乎永远不会和 引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系 统则会被卸载,以留出更多的内存供磁盘镜像使用。Docker 容器启动是需要一些文件的, 而这些文件就可以称为 Docker 镜像。
如何得到镜像:
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作一个镜像DockerFile
2、Docker镜像加载原理
我们下载的时候一层一层的就是这个 UnionFS ( 联合文件系统) UnionFS (联合文件系统) : Union文件系统( UnionFS)是-种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来-层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union 文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像) , 可以制作各种具体的应用镜像。
特性: 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker的镜像实际_上由一层一层的文件系统组成,这种层级的文件系统UnionFS.
- bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是弓|导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boo加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs.
- rootfs (root file system) , 在bootfs之上。包含的就是典型Linux 系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G ,为什么Docker这里才200M ? 对于一个精简的OS , rootfs 可以很小,只需要包含最基本的命令, 只具有程序库就可以了,因为底层直接用Host的kernel ,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。
4、镜像构建原理
4、构建镜像有三种方式:
1、基于Dockerfile(最常用)创建
2、基于已有的镜像容器进行创建镜像
3、基于本地模板进行构建
二、创建镜像
1、Dockerfile简介?
Dockerfile是由一组指令组成的文件
Dockerfile结构分成四个部分:
- 1、基础镜像信息
- 2、维护者信息
- 3、镜像操作指令
- 4、容器启动时指定指令
(1)Dockerfile常用操作指令
(2)Dockerfile创建镜像
使用Dockerfile创建一个httpd镜像并运行 1、编写Dockerfile文件
[root@docker ~]# mkdir apache
[root@docker ~]# cd apache/
[root@docker apache]# vim Dockerfile
##基于的基础镜像
FROM centos
##维护镜像的用户信息
MAINTAINER The porject <CN-TangZheng>
##镜像操作指令安装Apache软件
RUN yum -y update
##安装Apache服务
RUN yum -y install httpd
##开启80端口
EXPOSE 80
##复制网址首页文件
ADD index.html /var/www/html/index.html '//此命令可以结合上图理解'
##将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
##启动容器时执行脚本
CMD ["/run.sh"]
2、编写执行脚本与首页内容
[root@docker apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/* '//清除缓存'
exec /usr/sbin/apachectl -D FOREGROUND '//启动apache'
[root@docker apache]# echo "this is test web" > index.html
3、生成镜像
[root@docker apache]# ls
Dockerfile index.html run.sh
[root@docker apache]# docker build -t httpd:centos . '//最后的一个"."要注意,-t:镜像的名字:标签'
'//每一个缓存层都会生成一个临时容器来执行命令,然后删除'
[root@docker apache]# docker images '//查看镜像,已经生成了两个'
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos d2010670b33a 19 seconds ago 434MB
centos latest 470671670cac 3 months ago 237MB
4、新镜像运行容器
[root@docker apache]# docker run -d -p 1111:80 httpd:centos '//-p 指定端口号,-P 随机端口号'
04b0f0f1bda36a4857f8d48e044cd17f442be19f4d32dee4cf3183827b451b55
[root@docker apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04b0f0f1bda3 httpd:centos "/run.sh" 4 seconds ago
2、基于已有的镜像容器创建
创建容器
[root@docker apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos d2010670b33a 23 minutes ago 434MB
centos latest 470671670cac 3 months ago 237MB '//使用此镜像创建容器'
[root@docker apache]# docker create -it centos /bin/bash
[root@docker apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
325c28cc9349 centos "/bin/bash" 42 seconds ago Created infallible_poitras
04b0f0f1bda3 httpd:centos "/run.sh" 21 minutes ago Up 21 minutes 0.0.0.0:1111->80/tcp nostalgic_greider
创建镜像
[root@docker apache]# docker commit -m "ceshi" -a "tang" 325c28cc9349 tang:centos '//-m:说明文字,-a:提交的作者'
sha256:a49089651887dee9c9168532466542ca7ea0c9113da078230694ac30aebe064c
[root@docker apache]# docker images '//镜像创建成功'
REPOSITORY TAG IMAGE ID CREATED SIZE
tang centos a49089651887 14 seconds ago 237MB
httpd centos d2010670b33a 30 minutes ago 434MB
centos latest 470671670cac 3 months ago 237MB
3、基于本地模板创建
下载本地模板 通过导入系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载 地址为:https://wiki.openvz.org/Download/template/precreated 或者使用wget下载:wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz 模板下载后直接导入即可
[root@docker opt]# ls
debian-7.0-x86-minimal.tar.gz
[root@docker opt]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new
[root@docker opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daoke new 487145d2411f 8 seconds ago 215MB
二、Docker私有仓库建立
Docker Registry工具目前最新为2.0系列版本,这一版本与一些类库、工具一起被打包为负责容器内容分发的工具集:Docker Distribution。目前其核心的功能组件仍为负责镜像仓库的管理。新版本的Registry基于Golang进行了重构,提供更好的性能和扩展性,并且支持Docker 1.6+的API,非常适合用来构建私有的镜像注册服务器。官方仓库中也提供了Registry的镜像,因此用户可以通过容器运行和源码安装两种方式来使用Registry。
1、私有仓库设置步骤
1、下载registry镜像 2、客户端设置daemon.json文件,指定私有仓库位置 3、生成registry容器,开放5000端口 4、镜像打标签 5、上传镜像,docker push 6、下载镜像,docker pull
2、建立私有仓库
(1)服务端下载registry镜像
[root@docker apache]# docker pull registry
(2)指定镜像仓库的地址
[root@docker apache]# vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.233.133:5000"], '//添加此段'
"registry-mirrors": ["https://yu1vx79j.mirror.aliyuncs.com"]
}
[root@docker apache]# systemctl restart docker
(3)生成registry容器,开放5000端口
registry必须要是up状态才能提供服务
[root@docker apache]# docker create -it registry /bin/bash
87db162017924493a4dadefd1f58ff2fdf5a62921a9f4233c84143340e36e1e5
[root@docker apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87db16201792 registry "/entrypoint.sh /bin…" 12 seconds ago Created agitated_darwin
[root@docker apache]# docker start 87db16201792
[root@docker apache]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry '共享目录 宿主机的data共享到docker的tmp下'
60e04d648d5116ceb369eee810e8ed85f2043aa2f573b0ebf1e1233e8e13e2f6
(4)镜像打标签
[root@docker apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tang centos a49089651887 38 minutes ago 237MB
httpd centos d2010670b33a About an hour ago 434MB
registry latest 708bc6af7e5e 2 months ago 25.8MB
centos latest 470671670cac 3 months ago 237MB
[root@docker apache]# docker tag tang:centos 192.168.233.133:5000/httpd '要打上镜像仓库ip地址端口的tag'
(5)上传镜像测试
[root@docker apache]# docker push 192.168.233.133:5000/httpd
The push refers to repository [192.168.233.133:5000/httpd]
0683de282177: Pushed
latest: digest: sha256:7a6f34c22ab081c96ee0b676244300691d7a2f63fe4aedd22f150f17fe4aa5a9 size: 529
(6)下载镜像测试
curl 查看镜像目录
[root@docker apache]# curl -XGET http://192.168.233.133:5000/v2/_catalog
{"repositories":["httpd"]}
[root@docker apache]# docker pull 192.168.233.133:5000/httpd '从本地下载镜像'
- ofbiz实体引擎(二) delegator实例化具体方式
- ofbiz实体引擎(一) 获取Delegator
- 12个非常实用的JavaScript小技巧
- 关于PHP浮点数精度损失问题
- FreeMarker与JSP 2.0 + JSTL组合进行比较
- 从零开始学设计模式(1):基础编程模式
- 机器学习实战 | 第四章:模型验证和选择
- ofbiz中FreeMarkerWorker的makeConfiguration方法
- 后台进程(守护进程)自动备份PostgreSQL数据库
- 了解这些PHP小技巧吗?
- 结构体字节对齐
- 在Atom中设置Python开发环境
- Assignment 3 (神经网络) | 斯坦福CS231n-深度学习与计算机视觉课程
- ofbiz view渲染处理机制
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- django-haystack ImportError: cannot import name 'six' from 'django.utils' in django 3.x
- Thanos 与 VictoriaMetrics,谁才是打造大型 Prometheus 监控系统的王者?
- 阅读大型开源软件的四个技巧
- Tomcat NIO(7)-Poller
- python 求解线性规划问题
- Netty高性能之道
- 关于im-live-sells自定义群组字段的使用
- 浅谈CAP与Kafka
- windows下查看进程(进阶)
- Salesforce LWC学习(二十二) 简单知识总结篇二
- 初识Netty
- SpringCloud微服务项目实战 - 缓存详解及高效缓存接入
- Vue + Flask 实战开发系列(十)
- 【CS学习笔记】17、登录验证的难点
- CS学习笔记 | 18、密码哈希散列设置信任