Docker入门指南之什么是Dockerfile

电子说

1.3w人已加入

描述

八、Dockerfile**

8.1 什么是Dockerfile

开发

8.1.1 介绍

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像

  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作
  • 对于运维人员:在部署时,可以实现应用的无缝移植

8.1.2 Dockerfile构建步骤

  1. 编写Dockerfile文件
  2. docker build
  3. docker run

8.1.3 Dockerfile文件内容

以熟悉的centos为例:https://hub.docker.com/_/centos/

开发

8.2 DockerFile 构建过程解析

8.2.1 Dockerfile内容基础知识

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

8.2.2 Docker执行Dockerfile大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

8.3 常用命令

开发

开发

8.3.1 FROM

指明构建的新镜像是来自于哪个基础镜像,例如:

FROM centos: latest

8.3.2 MAINTAINER

指明镜像维护着及其联系方式(一般是邮箱地址),例如:

MAINTAINER JC Zhang zhangsan@163.com

不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如

LABEL maintainer=“zhangsan.cn”

8.3.3 RUN

构建镜像时运行的Shell命令,例如:

RUN [“yum”, “install”, “httpd”]
RUN yum install httpd

8.3.4 CMD

启动容器时执行的Shell命令,例如:

CMD ["-C", “/start.sh”]
CMD ["/usr/sbin/sshd", “-D”]
CMD /usr/sbin/sshd -D

8.3.5 EXPOSE

声明容器运行的服务端口,例如:

EXPOSE 80 443

8.3.6 ENV

设置环境内环境变量,例如:

ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45

8.3.7 ADD

拷贝文件或目录到镜像中,PS:如果是URL或压缩包,会自动下载或自动解压,例如:

ADD …

ADD html.tar.gz /var/www/html

ADD https://xxx.com/html.tar.gz /var/www/html

8.3.8 COPY

拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压,例如:

COPY ./start.sh /start.sh

8.3.9 ENTRYPOINT

启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序。

ENTRYPOINT ["/bin/bash", “-C”, “/start.sh”]
ENTRYPOINT /bin/bash -C ‘/start.sh’
PS:Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效。

8.3.10 VOLUME

指定容器挂载点到宿主机自动生成的目录或其他容器,例如:

VOLUME ["/var/lib/mysql"]
PS:一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。

8.3.11 WORKDIR

为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:

WORKDIR /data

**8.4 **使用脚本创建镜像

8.4.1 编写Dockerfile

创建目录

mkdir -p /export/docker/jdk8

将jdk-8u241-linux-x64.tar.gz上传到服务器(虚拟机)中的/export/docker/jdk8目录

创建文件Dockerfile

cd /export/docker/jdk8/
vi Dockerfile
#依赖镜像名称和id
FROM centos:latest
#指定镜像创建者信息
MAINTAINER ITCAST
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV JAR_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

8.4.2 构建镜像

docker build -t=‘jdk1.8’ .

注意后面的空格和点,不要省略,点表示当前目录

8.4.3 查看镜像是否构建完成

开发

8.5 自定义镜像mycentos

8.5.1 编写 Dockerfile

Hub默认centos镜像

开发

准备编写DockerFile文件vim Dockerfile

FROM centos:latest
MAINTAINER zhangjc
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

8.5.2 构建镜像

docker build -t mycentos:1.1 .

开发

开发

8.5.3 运行镜像

docker run -it mycentos:1.1

九、Docker私有仓库

在 Docker 中,当我们执行docker pull xxx的时候 ,它实际上是从 registry.hub.docker.com这个地址去查找,这就是Docker公司为我们提供的公共仓库。

在工作中,不可能把企业项目push到公有仓库进行管理。为了更好的管理镜像,Docker不仅提供了一个中央仓库,同时允许搭建本地私有仓库。介绍registry、harbor两种私有仓库搭建。

9.1 registry搭建

9.1.1 搭建

Docker 官方提供了一个搭建私有仓库的镜像 registry ,只需把镜像下载下来,运行容器并暴露5000端口,就可以使用了。

docker pull registry:2
docker run -di -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2

Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。

浏览器访问http://node1.itcast.cn:5000/v2/_catalog,出现下面情况说明registry运行正常

开发

9.1.2 验证

现在通过push镜像到registry来验证一下。

查看本地镜像

docker images

要通过docker tag将该镜像标志为要推送到私有仓库:

docker tag nginx:latest localhost:5000/nginx:latest

通过docker push命令将nginx镜像push到私有仓库中:

docker push localhost:5000/nginx:latest

开发

访问 http://node1.itcast.cn:5000/v2/_catalog 查看私有仓库目录,可以看到刚上传的镜像了:

开发

  • 下载私有仓库的镜像,使用如下命令:

docker pull localhost:5000/镜像名:版本号

docker pull localhost:5000/nginx:latest

9.2 Docker镜像推送到阿里云镜像仓库

首先需要有一个阿里云的账号

镜像仓库申请地址:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories

开发

9.2.1 容器镜像服务控制台概览

开发

9.2.2 创建镜像仓库

开发

9.2.3 选择本地仓库

开发

9.2.4 点击管理

开发

开发

9.2.5 Docker登录阿里云容器镜像仓库

$ sudo docker login --username=xxx@aliyun.com registry.cn-hangzhou.aliyuncs.com

开发

9.2.6 推送创建的oracle11g_ centos7镜像到阿里云镜像仓库

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分