4.DockerFile解析 以及 本地镜像发布到阿里云上

DockerFile

DockerFile是什么?

DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本

构建三步骤:1.编写DockerFile 2.docker build 3.docker run

简单的CentOS6.8 DockerFile为例:

FROM scratch    # 源镜像
MAINTAINER The CentOS Project    # 作者加来源
ADD c68-docker.tar.xz /
LABEL name="CentOS Base Image" \   # 说明
    vendor="CentOS" \
    license="GPLv2" \
    build-date="2016-06-02"
    
# Default command
CMD ["/bin/bash"]   # 执行命令

DockerFile构建过程解析

1.Dockerfile内容基础知识

每条保留字指令都必须为大写字母且后面要跟随至少一个参数

指令按照从上到下,顺序执行

表示注释

每条指令都会创建一个新的镜像层,并对镜像进行提交

2.Docker执行DockerFile的大致流程

docker从基础镜像运行一个容器

执行一条指令并对容器作出修改

执行类似docker commit的操作提交一个新的镜像层

docker再基于刚提交的镜像运行一个新容器

执行dockerfile中的下一条指令知道所有指令都执行完成

DockerFile体系结构(保留字指令)

FROM

基础镜像,当前镜像是来源那个镜像

MAINTAINER

镜像维护者的姓名和邮箱

RUN

容器构建时需要运行的命令

EXPOSE

暴露出服务端口号

WORKDIR

指定的创建容器后,终端默认登录的进来工作目录,第一个落脚点

ENV

用来在构建镜像过程中设置环境变量

ENV MY_PATH/usr/mytest
这个环境变量可以在后续的任何RUN指令总使用,这就如同在命令前面指定了环境变量前缀一样;
也可以在其他指令张红直接使用这些环境变量。

比如:WORKDIR $MY_PATH

ADD

将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

ADD centos-7-docker.tar.xz /

COPY

类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中<源路径> 的文件/目录复制到新的一层的镜像内的<目标路径>位置

COPY src dest   
COPY ["src", "dest"]
#      源     目的

VOLUME

容器数据卷,用于数据保存和持久化工作

VOLUME ["/dataVolume1", "/dataVolume2"]

CMD

指定一个容器启动时要运行的命令

CMD指令的格式和RUN相似

  • shell格式: CMD <命令>
  • exec格式: CMD [“可执行文件”, “参数1”, “参数2”]
  • 参数列表格式:CMD[“参数1”, “参数2” …],在指定了ENTRYPOINT 指令后,用CMD指令具体的参数。

DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

ENTRYPOINT

指定一个容器启动时要运行的命令

ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数

ONBUILD

当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

小总结

BUILD Both RUN
FROM WORKDIR CMD
MAINTAINER USER ENV
COPY EXPOSE
ADD VOLUME
RUN ENTRYPOINT
ONBUILD
.dockerignore

案例

Base镜像(scratch)

Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

自定义镜像mycentos

自定义mycentos目的使我们自己的镜像具备如下功能:
1.登录后的默认路径
2.vim编辑器
3.查看网络配置ifconfig支持

FROM centos
MAINTAINER zzyy

ENV MYPATH /usr/local

WORKDIR $MYPATH

RUN yum -y install vim 
RUN yum -y install net-tools

EXPOSE 80

CMD /bin/bash
docker build -it mycontos:1.3 .

查看镜像历史版本
docker history <镜像ID>

CMD/ENTRYPOINT镜像案例

  1. CMD
    Dockerfile
FROM centos
RUN yum install -y curl
CMD [ "curl", "-s", "http://ip.cn" ]   # CMD指令不能手动在运行时添加参数,这个时候可以使用ENTRYPOINT指令
# CMD -i  # 外面添加参数-i  相当于在末尾添加CMD命令

docker build -it myip .

docker run myip -i

  1. ENTRYPOINT
    Dockerfile
FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]

docker build -it myip .

docker run myip -i

  1. ONBUILD
FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
ONBUILD RUN echo "parent onbuild ..."

自定义镜像Tomcat9

FROM centos
MAINTAINER lin
# 把宿主机当前上下文c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
# 把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz
ADD apache-tomcat-9.0.8.tar.gz
# 安装VIM编辑器
RUN yum -y install vim
# 设置工作访问时候的WORKDIR路径,登录落脚点
ENV MY_PATH /usr/local
WORKDIR $MY_PATH
# 配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CLALINA_HOME/lib:$CLALINA_HOME/bin
# 容器运行端口
EXPOSE 8080
# 启动tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh", "run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/logs/catalina.out
docker run -d -p 9080:8080 --name myt9 -v /data/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /data/logs:/usr/local/apache-tomcat-9.0.8/logs --privileged=true zzyytomcat9

本地镜像发布到阿里云流程

镜像的生成方法

将本地镜像推送到阿里云

登录阿里云docker registry
sudo docker login --username=jc_lin registry.cn-shanghai.aliyuncs.com

从registry中拉取镜像
sudo docker pull registry.cn-hangzhou.aliyuncs.com/zzyybuy/mycentos:[镜像版本号]

将镜像推送到registry:

sudo docker login --username=registry.cn-hangzhou.aliyuncs.com
sudo docker tag [ImageID] registry.cn-hangzhou.aliyuncs.com/zzyybuy/mycontos:[镜像版本号]
suro docker push registry.cn-hangzhou.aliyuncs.com/zzyybuy/mycontos:[镜像版本号]





docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
jenkinsci/blueocean   latest              bda3a77bc841        2 days ago          553MB
node                  6-alpine            dfc29bfa7d41        4 months ago        56.1MB
maven                 3-alpine            5435658a63ac        2 years ago         116MB


docker tag bda3a77bc841 registry.cn-shanghai.aliyuncs.com/my-utils/jenkins:beta
suro docker push registry.cn-shanghai.aliyuncs.com/my-utils/jenkins:beta

将阿里云上的镜像下载到本地

你可能感兴趣的:(运维,Docker)