参考学习地址
- Docker测试开发之路(一)- 序
- Docker测试开发之路(二)- Docker文件系统
- Docker测试开发之路(三)- Docker网络原理
- Docker测试开发之路(四)- 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
镜像
- 镜像组成:
repo(仓库的ip/域名+端口号)/路径/镜像名称:tag
- 为什么有些镜像名只有一个单独的镜像名称,没有前面的repo和路径?
- 这是本地镜像,不属于任何的镜像仓库
- 此镜像为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
:查看私有仓库的镜像
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]
- 制作过程:
- 把用户指定的工作目录(context)中的所有文件加载到docker的进程中
- 读取
FROM
指令,然后根据FROM
指定的基础镜像,启动一个临时容器 - 在临时容器中,执行Dockerfile剩下的所有的指令内容
- 会用
docker commit
命令将临时容器制作成一个镜像后,删除临时容器 - 给镜像打上一个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指令
-
打包过程
- 多
FROM
指令文件,上方的FROM
为编译镜像过程,下方的FROM
为运行镜像。-
FROM centos:6.9 as builder
:为镜像取别名 -
RUN echo "this is a test" > insane.tar
:输出字符串并打包 -
FROM busybox
:指定继承的镜像 -
WORKDIR /root
:指定工作目录 -
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
状态