Docker虚拟化技术入门(Dockerfile编写)(五)

1.什么是Dokcerfile

Dockerfile是一个文本文件,其中包含了一组指令,用于自动化构建Docker镜像。通过Dockerfile,可以定义镜像的基础、安装的软件包、环境变量、工作目录、暴露的端口、启动命令等。


在这里我们来整理一下docker容器、dockerfile、docker镜像的关系:

dockerfile是面向开发的,发布项目做镜像的时候就要编写dockerfile文件。
dockerfile:构建文件,定义了一切的步骤,源代码。
dockerImanges:通过dockerfile构建生成的镜像,最终发布和运行的产品。
docker容器:容器就是镜像运行起来提供服务的。

Dockerfile指令
指令说明示例备注
FROM指定基础镜像FROM centos7
MAINTAINER指定镜像的作者和邮箱MAINTAINER 安徽小刘<anhuixiaoliu@qq.com>
RUN镜像构建的时候需要执行的命令RUN ["/bin/bash", "-c", "echo hello"]
CMD类似于RUN指令,用于运行程序(只有最后一个会生效,可被替代)CMD ["executable","param1","param2"]
EXPOSE告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。EXPOSE [80]
ENV设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量ENV MYPATH /usr/local
ADD步骤:tomcat镜像,这个tomcat压缩包。添加内容(从宿主机添加到镜像中)ADD tomcat.tar.gz tomcat.tar.gz
COPY复制指令,将文件拷贝到镜像中COPY home.txt /mydir/
VOLUME创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等VOLUME ["/data"]
USER指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户USER daemon
WORKDIR为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录WORKDIR /path/to/workdir
ENTRYPOINT配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖ENTRYPOINT ["executable", "param1", "param2"]或ENTRYPOINT command param1 param2(shell中执行)。
ONBUILD当构建一个被继承的Dockerfile,就会运行ONBUILD指令。ONBUILD [INSTRUCTION]

注:

ONBUILD
格式为 ONBUILD [INSTRUCTION]。

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。

例如,Dockerfile 使用如下的内容创建了镜像 image-A。

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

如果基于 image-A 创建新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行ONBUILD 指令内容,等价于在后面添加了两条指令。

FROM image-A

#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild。

实例(构建镜像)

基于centos7操作系统,编写一个含有nginx的镜像并开放80端口

FROM centos:7

# 给基础镜像centos安装必备的环境
# 加上“rpm --rebuilddb &&”是为了防止数据库损坏而影响yum安装。
# 注意,比较保险的做法是有多少个yum命令,就加多少个“rpm --rebuilddb &&”在yum前面。
RUN rpm --rebuilddb && yum install -y autoconf automake make wget proc-devel net-tools zlib zlib-devel make gcc  g++ openssl-devel pcre pcre-devel tar

# 在线安装nginx(也可以在本地先下载压缩包,再用ADD命令将包加入到基础镜像/usr/src目录中)
RUN wget http://nginx.org/download/nginx-1.17.1.tar.gz

# 解压到当前目录
RUN tar -zxvf nginx-1.17.1.tar.gz


# 配置nginx
RUN cd nginx-1.17.1 && ./configure --prefix=/usr/local/nginx && make && make install

# 在线安装jdk1.8
RUN cd ~ && yum install -y java-1.8.0-openjdk-devel.x86_64

# 安装MySQL(仓库地址:http://repo.mysql.com/)
RUN wget http://repo.mysql.com/mysql80-community-release-el7.rpm
RUN yum install -y mysql80-community-release-el7.rpm
RUN yum install -y mysql-server mysql-devel

# 设置工作目录
WORKDIR /usr/local/nginx/sbin

# 将nginx添加到环境变量
ENV PATH $PATH:/usr/local/nginx/sbin

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
构建镜像
docker build -t  harbor.test.com/library/nginx:centos7  .

运行结构


使用镜像(创建容器)

FROM harbor.test.com/library/nginx:centos7
COPY /home/index.html /usr/local/nginx/html/
#支持中文环境,不设置亦可
RUN yum install kde-l10n-Chinese glibc-common unzip -y && \
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8  && ln -sf /usr/local/nginx/conf /etc/nginx && mkdir -p /var/log/nginx/ /usr/share/nginx && ln -sf /usr/local/nginx/html /usr/share/nginx/html
ENV LC_ALL zh_CN.UTF-8   
ENV LANG zh_CN.UTF-8 
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
COPY aaa.conf /usr/local/nginx/conf/conf.d/aaa.conf
COPY ssl/* /usr/local/nginx/conf/conf.d
EXPOSE 8089

使用镜像实例二(创建容器)

jar包发布

FROM openjdk:8-jre
MAINTAINER byft liuhao@qq.com

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone

VOLUME /tmp

ADD target/ums-boot.jar mall-ums.jar

ENTRYPOINT ["java", "-Xmx512m", "-Djava.security.egd=file:/dev/./urandom","-jar","/mall-ums.jar"]

EXPOSE 8601

三、Docker进阶

3.2 Docker Compose

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过编写一个Compose文件,您可以方便地启动和管理多个相互依赖的容器。这对于构建复杂的微服务架构非常有用。

3.3 容器网络和存储

Docker提供了灵活的网络和存储解决方案,如Docker网络、Docker卷等。了解如何配置容器网络和存储,可以实现容器间的通信和数据持久化。

四、Docker精通

4.1 容器技术原理

要精通Docker,您需要深入了解容器技术的原理。了解Linux内核的cgroups和namespaces等特性,以及Docker如何利用这些特性实现容器的隔离和安全性,将帮助您更好地理解Docker的工作原理。

4.2 镜像构建与优化

精通Docker还需要学习如何构建和优化Docker镜像。了解镜像的层次结构、如何减小镜像大小、提高镜像安全性等技巧,将帮助您构建更高效、更可靠的Docker镜像。

4.3 容器编排与集群管理

对于大型应用程序,单个Docker主机可能无法满足需求。这时,您需要学习如何使用Docker Swarm或Kubernetes等容器编排工具,将多个Docker主机组合成一个集群,实现容器的自动化部署、扩展和管理。

五、总结与展望

从入门到精通,Docker的学习过程是一个不断挑战和成长的过程。通过掌握Docker的基础知识、高级功能和底层原理,您将能够更好地利用容器技术,提高应用程序的开发、部署和运维效率。随着容器技术的不断发展和创新,未来Docker将继续发挥重要作用,推动软件行业的进步。

  • 36
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安徽小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值