docker 怎么封装镜像

拥有镜像的三种方式

  1. 官网hub.docker.com提供的docker pull 镜像

一般情况下官网能提供的服务基本已经满足了我们日常所需
在这里插入图片描述在这里插入图片描述

自动会到官网仓库下载镜像,不指定tag版本,默认就是最新的

  1. docker commit 命令(类似ghost系统)

类似自己打包了一个容器,这个需求常见公司内部服务的部署安装

  • 首先是基于基础镜像系统上运行的容器,可以是centos、ubuntu等等
  • 根据需求部署好服务后进行封装成的镜像,命令就是docker commit
  • 基于镜像的系统会有三个权限上问题,一个是用户权限、一个是服务权限、一个是资源权限

举例:

我选择的是centos7.6.1810安装一个http服务,然后进行封装

启动一个centos容器

docker run -d -p 5000:80 --privileged=true centos:centos7.6.1810 /usr/sbin/init

#--privileged=true(用户权限)
#/usr/sbin/init(服务权限)
#可以看我之前写的docker的三个权限问题

额外话题:启动一个基础系统,如果没有加/usr/sbin/init,是需要加-it参数,不然容器会自动关闭

docker容器是以一个进程的形式启动在系统上,而基础系统默认最后是/bin/bash,系统下是没有任何进程启动的,也就是默认容器没有运行任何服务,容器的启动停止都会检测到PID为1的进程,加上it参数模拟一个交互式终端等待用户输入,进程PID1停止容器也就跟着停止
在这里插入图片描述

封装镜像

进入容器系统,安装服务

docker exec -it xxxxx /bin/bash
#xxxxx为容器ID号,docker ps -a查看
yum install httpd -y
systemctl start httpd
systemctl enable httpd

访问默认测试也成功
在这里插入图片描述

docker commit 封装

docker commit xxxxx my_httpd
#xxxxx为容器ID号
#my_httpd为镜像名称

在这里插入图片描述查看封装好的镜像系统
在这里插入图片描述查看docker分层结构,加了一层,大小为144M(还安装了net-tools)
在这里插入图片描述总结:可以看出这样方式就能完成一个镜像,但是有一个问题就是这个镜像系统分层无法判别安装了具体服务是什么,要是安装了病毒或者其他不需要的服务,系统不就是变的不安全了,这个时候就需要透明的模式就是Dockerfile

Dockerfile 构建文件

由于Dockerfile是基于透明的,所以就需要定义各种参数来指定具体每一步的操作

  • FROM
    指定 base 镜像
FROM centos:centos7.6.1810
#根据需求选择系统:版本
  • MAINTAINER
    镜像维护者(地址或人名都可以)
MAINTAINER Y-S-H

  • COPY
    拷贝文件或目录到镜像中
COPY 源目录  容器目录
COPY test /root/
  • ADD
    拷贝文件或目录到镜像中,跟COPY不同之处就是,如果是压缩包,会自动下载或自动解压
COPY 源目录  容器目录
ADD /root/httpd.tar.gz /var/www/html
ADD https://xxx.com/httpd.tar.gz /var/www/html
  • ENV
    设置环境变量
    1、可以用于dockerfile构建内使用,使用以$xxxx
    2、docker run -e 覆盖使用,从而修改变量值
ENV name1=ping name2=on_ip
CMD $name1 $name2
  • EXPOSE
    暴露服务运行的端口号
EXPOSE 80
  • VOLUME
    将文件或目录声明为 volume数据持久化,一般还是在run启动容器中指定 -v(

好处为了防止使用者忘记使用参数启动容器从而导致容器变得很大(jenkins就是默认添加了,因为插件会非常的大)

在这里插入图片描述

VOLUME /var/www/html
#默认存储位置/var/lib/docker/volumes/xxxxx
#具体的ID号可以通过docker inspect c809bdc2787e(容器ID)

在这里插入图片描述

  • WORKDIR
    为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录
WORKDIR /test
#cd /test
#就是cd命令的作用
  • RUN
    构建镜像时运行的Shell命令
RUN yum install httpd -y
  • CMD
    启动容器时执行的Shell命令,docker run -it [image] 默认最后不加参数就运行CMD

对于系统来说一个容器就是一个进程,那么在启动容器的时候,需要指定所运行的程序及参数,CMD为默认参数,一般都是运行服务或者脚本

CMD /usr/sbin/httpd -D FOREGROUND
#启动httpd服务

重点:为什么需要 -D FOREGROUND

前面说了容器是以进程形式存在,而容器的状态是同容器里PID为1的进程同步的,/usr/sbin/httpd默认是以守护进程的方式启动web服务器,也就不会是PID为1进程存在,不加 -D FOREGROUND现象就是docker永远无法UP
在这里插入图片描述

  • ENTRYPOINT
    作用和CMD一样,不同之处就是命令一定会被执行,不会被覆盖

当指定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令,ENTRYPOINT CMD

  1. 不会被docker run命令行指定的参数所覆盖
  2. 命令行参数会被当作参数传递给ENTRYPOINT指定的程序

好处就是CMD命令可以变成一个变量进行传参,便于程序的扩展
详细参考:https://www.cnblogs.com/reachos/p/8609025.html

推荐阅读CloudMan编写的docker容器学习,便于深刻理解

RUN vs CMD vs ENTRYPOINT

#重点:
1.ADD拷贝的文件必须在构建文件目录下
2.构建文件名词默认为:Dockerfile(可以通过-f指定)
3.CMD xxx,不带中括号,docker执行命令在login shell,也可以写成CMD [“bin/bash”,”-c”,”/usr/local/bin/checkout.sh”],但是建议ENTRYPOINT和CMD配合使用

举例:

编写dockerfile文件

vi Dockerfile

FROM centos:centos7.6.1810
MAINTAINER Y-S-H
COPY test.txt /root/
VOLUME /var/www/html
RUN yum install httpd -y && echo 'ServerName  localhost:80'>>/etc/httpd/conf/httpd.conf
EXPOSE 80
CMD /usr/sbin/httpd -D FOREGROUND

通过file文件构建镜像

docker build -t http_dockerfile .
#http_dockerfile 为镜像名
#最有有一个点,说明dockerfile文件在当前目录下

启动容器

docker run  -itd -p 22222:80 http_dockerfile

在这里插入图片描述
在这里插入图片描述

如果遇到容器启动失败,可以尝试不要加d,这样便于交互式查看具体是哪个步骤导致的错误,也会有相关错误提示,方便解决

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CDimage 是一款镜像制作工具,出自微软。它是微软内部“专用的”ISO 封装工具,不向外提供;所以,我们平时所看到的、使用的都是从微软内部泄露出来的~!!CDimage是系统整合不可少的利器,大大节省了光盘存放空间;我们平时见的"N合1”光盘大都是由CDimage(或内置CDimage内核的光盘工具,如Easyboot等)创建的。 但是我想网友们最关心的或许并不是以上问题,而是“CDimage到底能不能封装出SHA1值和官方一致的ISO镜像?”。下面我们就来说说CDimage的用法--其实你英文好的话用help命令查看即可!以下是常用参数[2.47版]的中文说明: -l 卷标,无空格(例如:-lMYLABEL) -t 所有目录和文件的时间标记,无空格,任意分隔符(例如:-t12/31/2000,15:01:00) -g 把文件时间从本地时间转换为GMT时间 -h 包含隐藏的文件和目录 -n 允许长文件名(比DOS的8.3文件名长) -nt 允许长文件名,与NT3.51兼容(-nt与-d不能同时使用) -d 不强制转换文件名的小写字母为大写字母 -c 使用ANSI文件名,不用源OEM文件名 -b "El Torito"光盘启动文件,无空格(例如:-bc:\location\cdboot.bin) -p "El Torito"启动目录的平台ID -e 在El Torito启动目录中不要设置软盘模拟方式 -s 在镜像文件中签上数字签名(无空格,给出RPC服务器名和结束点名称,像这样-sServerName:EndPointName) -x 在镜像中计算并制作"AutoCRC"值 -o 优化容量:重复的文件只制作一次 -y 试验选项,跟一个数字(例如:-y1),为试验的目的而产生ISO-9660的非标准变化: 1 在文件名后续加版本号';1'(7.5.1) 2 圆整目录大小为2K的倍数(6.8.1.3) 5 先写\i386目录,逆序 6 允许目录记录正好排到扇区结束点(符合ISO-96606.8.1.1但是突破了MSCDEX) 7 产生NT4.0下的16位应用程序时报警 -oc 更慢的重复文件探测方式:二进制比较而不是MD5哈西值 -oi 比较文件时忽略diamond压缩时间标记 -os 建立镜像时显示重复的文件(-o选项可以组合,像这样:-ocis) -k (keep)即使某些源文件打开失败也生成镜像 -m 忽略镜像文件最大681,984,000bytes的限制 -a 《分配概要》显示文件和目录的大小 -q 只扫描源文件,不建立镜像文件
微软内部镜像封装工具:CDIMAGE_2.52 参数: CDIMAGE 2.46 CD-ROM and DVD-ROM Premastering Utility Copyright (C) Microsoft, 1993-2000. All rights reserved. For Microsoft internal use only. Usage: CDIMAGE [參數] 來源目錄 目標影像檔 -l 光碟標籤,不含空白鍵 (e.g. -lMYLABEL) -t 將所有檔案和目錄都設為同一日期,不含空白鍵和任何特殊符號 (e.g. -t12/31/2000,15:01:00) -g 將時間設為 GMT 時間而非本地時間 -h 包含隱藏檔和隱藏目錄 -n 允許長檔名 (超過 8.3 檔名) -nt 允許長檔名,但受限於 NT3.51 相容性 (-nt 和 -d 不可同時使用) -d 不強制將小寫檔名改為大寫檔名 -c 使用 ANSI 檔名以對應原始目錄中的 OEM 檔名 -j1 編碼為 Joliet Unicode 檔名並在 ISO-9660 名稱空間中產生相容於 DOS 的 8.3 檔名格式. (可在 Joliet 系統或其他一般的 ISO-9660 系統中被讀取, 但某些檔名在 ISO-9660 名稱空間中可能會被改變, 以遵守 DOS 8.3 與 ISO-9660 命名限制) -j2 編碼為 Joliet Unicode 檔名而不遵守 ISO-9660 檔名規則 (必須在 Joliet 作業系統從 CD 讀取檔案) 當使用 -j1 或 -j2 參數時, -n, -nt, 和 -d 參數無法生效 並且不可使用. -js 以 -j2 參數將影像檔中的非 Joliet 檔案 "readme.txt" 編碼. (e.g. -jsc:\location\readme.txt). 這樣可以讓這張光碟的這個唯一的檔案在不支援 Joliet 格式的系統中 (Windows 3.1, NT 3.x...等)被看見. -u1 編碼為 "UDF-Bridge" 媒體 -u2 編碼為 "UDF" 檔案系統而不對映 ISO-9660 檔案系統 (必須有 UDF 相容作業系統才可讀取檔案) -ur 以 -u2 參數將影像檔中的非 UDF 檔案 "readme.txt" 編碼. (e.g. -usc:\location\readme.txt). 這樣可以讓這張光碟的這個唯一的檔案在不支援 UDF 格式的系統中 被看見. -us 分散 UDF 檔案 -ue embed file data in UDF extent entry -uf embed UDF FID entries -uv UDF Video Zone compatibility enforced -b "El Torito" 開機區段檔案,不佔檔案空間 (e.g. -bc:\location\cdboot.bin) -p Platform ID for the "El Torito" boot catalog -e 在 El Torito 開機記錄中設置不模擬軟碟。 -s 在影像檔中加入數位簽章 (不佔空間, 必須提供 RPC 伺服器與終點名稱如下 -sServerName:EndPointName) -x 在影像檔中計算與編碼 "AutoCRC" 值 -o 處理重複檔名以將影像檔大小最佳化 (譯註:縮小影像檔容量,即本程式之精華所在) -oc 使用二進位比對代替 MD5 雜湊值, 這會以較慢的速度比對重複的檔案. -oi 比對檔案時忽略高度壓縮的時間戳記 -os 建立影像檔時顯示重複的檔名 (-o 等類似參數不可簡寫為 -ocis) -w 依照數字提供不同的警告等級 (e.g. -w4) 1 回報非 ISO 或非 Joliet 相容檔名或路徑 2 回報非 DOS 相容檔名 3 回報長度為零的檔案 4 回報每一個加入影像檔中的檔名 -y 依照數字提供不同的測試選項 (e.g. -y1),用於測試用途, 可產生不遵守 ISO-9660 的變體影像檔 1 encode trailing version number ';1' on filenames (7.5.1) 2 round directory sizes to multiples of 2K (6.8.1.3) 5 write \i386 directory files first, in reverse sort order 6 allow directory records to be exactly aligned at ends of sectors (ISO-9660 6.8.1.1 conformant but breaks MSCDEX) 7 warn about generated shortnames for 16-bit apps under NT 4.0 b blocksize 512 bytes rather than 2048 bytes d suppress warning for non-identical files with same initial 64K l UDF - long ads used in file entries instead of short ads r UDF - number of ad's is random w open source files with write sharing t load segment in hex for El Torito boot image (e.g. -yt7C0) f use a faster way to generate short names -k (保留) 即使開啟部分來源檔案失敗時也強制建立影像檔 -m 忽略 681,984,000 bytes 的影像檔限制,以便產生 650MB 以上的影像檔 -a allocation summary shows file and directory sizes -q 只掃描來源檔案,不建立影像檔 NOTE: 大部分選項允許您建立不依循 ISO-9660 的影像檔, 並且也可能和一個或多個作業系統不相容。 若您想嚴格的依循 ISO 標準或 DOS, 使用 -w2 警告層級並更正任何不一致的報告 YOU are responsible for insuring that any generated CDs are compatible with all appropriate operating systems. Also note that Microsoft company information is placed in the image volume header, so don't use this program to generate CDs for companies other than Microsoft.
实现一个docker封装postgresql集群镜像可以按照以下步骤进行: 1. 安装Docker,如果已经安装Docker可以跳过这一步。 2. 下载postgresql镜像,可以使用以下命令: ``` docker pull postgres ``` 3. 创建docker-compose.yml文件,可以使用以下代码: ``` version: "3" services: db1: image: postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: mydatabase volumes: - ./data/db1:/var/lib/postgresql/data ports: - "5432:5432" db2: image: postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: mydatabase volumes: - ./data/db2:/var/lib/postgresql/data ports: - "5433:5432" db3: image: postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: mydatabase volumes: - ./data/db3:/var/lib/postgresql/data ports: - "5434:5432" ``` 上述代码中,我们创建了三个postgresql容器,并将它们绑定到不同的端口。同时,我们还定义了数据库的用户名、密码和数据库名称,并将数据保存在本地目录的data文件夹中。 4. 运行docker-compose.yml文件,可以使用以下命令: ``` docker-compose up -d ``` 上述命令将启动三个postgresql容器,并将它们绑定到不同的端口。 5. 验证postgresql集群是否正常工作,可以使用以下命令: ``` docker-compose ps ``` 上述命令将显示三个postgresql容器的状态,如果状态为“Up”,则表示集群正常工作。 以上就是一个基本的docker封装postgresql集群镜像的步骤,可以根据实际需要进行修改和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值