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 状态

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容