Docker镜像构建实战

参考学习地址

目录

  • 使用docker commit和dockerfile构建镜像
  • 使用多from指令构建镜像
  • 讲述镜像系统的原理

一、搭建私有仓库

  • docker pull registry:2
  • docker run -d -p 5000:5000 -v /usr/local/registry:/var/lib/registry --restart=always --name registry registry:2
    • --restart=always:当docker发现容器挂掉后会自动重启此容器
  • docker pull busybox
  • docker tag busybox localhost:5000/busybox:v1.0
  • docker push localhost:5000/busybox:v1.0:将镜像推到本地仓库上
  • curl http://localhost:5000/v2/_catalog
image.png

镜像

  • 镜像组成:repo(仓库的ip/域名+端口号)/路径/镜像名称:tag
  • 为什么有些镜像名只有一个单独的镜像名称,没有前面的repo和路径?
    1. 这是本地镜像,不属于任何的镜像仓库
    2. 此镜像为docker hub默认路径的镜像,比如busybox等

二、制作镜像

  • docker commit
  • Dockerfile

docker commit

  • docker commit registry localhost:5002/myregistry:v2.0:制作镜像
  • docker push localhost:5002/myregistry:v2.0:推送镜像到私有仓库
  • curl http://localhost:5002/v2/_catalog:查看私有仓库的镜像
    image.png

Dockerfile(颠覆云原生的状态)

Dockerfile简介
  • docker只是容器的一种方式,但是Dockerfile的出现颠覆了云原生的状态。
  • 但是Dockerfile制作镜像的过程本质上与docker commit没有区别,因为使用Dockerfile制作镜像的过程中也会执行docker commit命令,区别就在于Dockerfile是自动化去构建镜像。相当于一个自动化制作镜像的脚本或框架
  • 它提供了极其方便并且可编程的方式去制作镜像。
  • 镜像制作过程自动化:利于迭代。
  • 以dockerfile形式制作的镜像把镜像的制作过程保存了下来,易于追踪和维护 ,作者和其他人都可以通过查看dockerifle的方式去知晓这个镜像的所有内容。
  • docker提供了缓存功能,比如之前执行过某一Dockerfile,再次执行时会使用缓存,从而实现快速构建。
Dockerfile指令
  • From指令:指定继承哪个镜像
    • 第一个镜像官方制作的
  • ADD:将工作目录下的某个目录或者文件copy到镜像的某个路径下
  • RUN:执行shell 命令
  • ENTRYPOINT:指定容器启动脚本,在执行Dockerfile前执行
  • ENV:指定容器启动时的环境变量(注意,只有在容器启动时,启动脚本能读取到,如果希望其他用户登录到容器也生效的话,需要写入.bashrc)
  • USER:容器启动时使用的用户
  • WORKDIR:容器启动时的工作目录

尽量将RUN指令分开写,这样可以利用缓存。比如 a为RUN yum install -y openssl vim,b为RUN yum install -y vim openssl,c为RUN yum install -y openssl,如果Dockerfile替换a、b、c,都会重新下载openssl或vim,就利用不到缓存。

Dockerfile制作镜像
  • docker build -t [image_name]:tag [dockerfile_path]
  • 制作过程:
    1. 把用户指定的工作目录(context)中的所有文件加载到docker的进程中
    2. 读取FROM指令,然后根据FROM指定的基础镜像,启动一个临时容器
    3. 在临时容器中,执行Dockerfile剩下的所有的指令内容
    4. 会用docker commit 命令将临时容器制作成一个镜像后,删除临时容器
    5. 给镜像打上一个tag

Dockerfile所在目录下不要放其他无关文件,因为执行build命令会将工作目录的所有文件传送给docker进程。一旦目录下有其他文件,便会安装其他跟Dockerfile无关的东西,从而影响镜像制作的速度。

Dockerfile样式
FROM centos:7

ADD entrypoint.sh /root
ADD requirements.txt /root
WORKDIR /root
USER root

RUN yum install -y epel-release \
    && yum install -y python34 git python34-setuptools python34-devel.x86_64 \
    && easy_install-3.4 pip \
    && yum install -y gcc \
    && yum install -y soci-mysql-devel.x86_64 \
    && ln -s /usr/local/mysql/bin/mysql /usr/bin \
    && pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

ENTRYPOINT ["/root/entrypoint.sh"]

上面的脚本,RUN指定在迭代时可以分开写,发布时可以合在一起写。因为Dockerfile指令是分层执行的,发布时合在一起写可以提升容器的IO性能。

  • 启动脚本entrypoint.sh
#!/bin/bash

mkdir -p /opt/web
cd /opt/web
git clone https://github.com/ycwdaaaa/holmes.git
cd holmes
pip3 install -r requirement.txt -i https://mirrors.aliyun.com/pypi/simple/
/usr/bin/python3.4 app.py


while true
do
   sleep 10
done
Dockerfile多FROM指令
  • 打包过程


    image.png
  • FROM 指令文件,上方的FROM为编译镜像过程,下方的FROM 为运行镜像。
    1. FROM centos:6.9 as builder:为镜像取别名
    2. RUN echo "this is a test" > insane.tar:输出字符串并打包
    3. FROM busybox:指定继承的镜像
    4. WORKDIR /root:指定工作目录
    5. COPY --from=builder insane.tar .:从bulider这个取了别名的镜像下复制insane.tar文件到当前的镜像中
FROM centos:6.9 as builder

# 下载基础工具
RUN echo "this is a test" > insane.tar


FROM busybox

WORKDIR /root

COPY --from=builder insane.tar .

使用多FROM 省略了打包过程中的FTP 状态

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容