Dockerfile构建镜像实战

因为想学学kubernetes,所以回头来实战一下使用Dockerfile构建镜像

Dockerfile是构建容器镜像的描述文件,从上到下依次执行。

点击进入之前的Docker笔记

一、常见Dockerfile指令

FROM  # 基于哪个基础镜像构建
MAINTAINER 	# 镜像作者的信息
RUN # 容器镜像构建的时候需要运行的命令
ADD # 在这个镜像中放置的软件压缩包,会自动解压
WORKDIR # 镜像的工作目录
VOLUME # 给镜像指定挂在卷
EXPOSE	# 对外暴露的端口
CMD  # 容器启动后执行的命令,可以被替代,只有最后一个会生效,(通常用于启动我们的应用)
ENTRYPOINT  # 容器启动后执行的命令,可以追加
ONBUILD 
COPY # 和add类似,将压缩包拷贝进镜像中
ENV # 构建时,设置环境变量,如设置mysql的用户名密码

二、编写Centos Dockerfile

2.1、编写Dockerfile

FROM centos
MAINTAINER changwu

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim

EXPOSE 80

CMD /bin/bash

2.2、构建

# 构建镜像 docker build -f dockerfile1 -t 自定义镜像名:[tag] .

自定义的镜像名不能出现大些字母
-t后的自定义镜像名如果没有添加TAG标签的话,默认使用latest
最后的点不能省略


[root@VM-0-15-centos ~]# docker build -f dockerfile1-centos -t mycentos:0.1 .
Sending build context to Docker daemon  19.97kB
Step 1/7 : FROM centos
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
 ---> 0d120b6ccaa8
Step 2/7 : MAINTAINER changwu
 ---> Running in cf9ecee84b06
Removing intermediate container cf9ecee84b06
 ---> 72f5724759c5
Step 3/7 : ENV MYPATH /usr/local
 ---> Running in fc50b2e8d6a3
Removing intermediate container fc50b2e8d6a3
 ---> fe0efcf04175
Step 4/7 : WORKDIR $MYPATH
 ---> Running in 9249bf02b95e
Removing intermediate container 9249bf02b95e
 ---> e76653512fe4
Step 5/7 : RUN yum -y install vim
 ---> Running in bc296c183fd2
CentOS-8 - AppStream                            4.6 MB/s | 5.8 MB     00:01
CentOS-8 - Base                                 826 kB/s | 2.2 MB     00:02
CentOS-8 - Extras                               4.2 kB/s | 7.9 kB     00:01
Dependencies resolved.
================================================================================
 Package             Arch        Version                   Repository      Size
================================================================================
Installing:
 vim-enhanced        x86_64      2:8.0.1763-13.el8         AppStream      1.4 M
Installing dependencies:
 gpm-libs            x86_64      1.20.7-15.el8             AppStream       39 k
 vim-common          x86_64      2:8.0.1763-13.el8         AppStream      6.3 M
 vim-filesystem      noarch      2:8.0.1763-13.el8         AppStream       48 k
 which               x86_64      2.21-12.el8               BaseOS          49 k

Transaction Summary
================================================================================
Install  5 Packages

Total download size: 7.8 M
Installed size: 31 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm        251 kB/s |  39 kB     00:00
(2/5): vim-filesystem-8.0.1763-13.el8.noarch.rp 1.5 MB/s |  48 kB     00:00
(3/5): which-2.21-12.el8.x86_64.rpm             305 kB/s |  49 kB     00:00
(4/5): vim-enhanced-8.0.1763-13.el8.x86_64.rpm  1.5 MB/s | 1.4 MB     00:00
(5/5): vim-common-8.0.1763-13.el8.x86_64.rpm    4.0 MB/s | 6.3 MB     00:01
--------------------------------------------------------------------------------
Total                                           3.0 MB/s | 7.8 MB     00:02
CentOS-8 - AppStream                            1.6 MB/s | 1.6 kB     00:00
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature,key ID 8483c65d: NOKEY
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>"
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : which-2.21-12.el8.x86_64                               1/5
  Installing       : vim-filesystem-2:8.0.1763-13.el8.noarch                2/5
  Installing       : vim-common-2:8.0.1763-13.el8.x86_64                    3/5
  Installing       : gpm-libs-1.20.7-15.el8.x86_64                          4/5
  Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64                          4/5
  Installing       : vim-enhanced-2:8.0.1763-13.el8.x86_64                  5/5
  Running scriptlet: vim-enhanced-2:8.0.1763-13.el8.x86_64                  5/5
  Running scriptlet: vim-common-2:8.0.1763-13.el8.x86_64                    5/5
  Verifying        : gpm-libs-1.20.7-15.el8.x86_64                          1/5
  Verifying        : vim-common-2:8.0.1763-13.el8.x86_64                    2/5
  Verifying        : vim-enhanced-2:8.0.1763-13.el8.x86_64                  3/5
  Verifying        : vim-filesystem-2:8.0.1763-13.el8.noarch                4/5
  Verifying        : which-2.21-12.el8.x86_64                               5/5

Installed:
  gpm-libs-1.20.7-15.el8.x86_64         vim-common-2:8.0.1763-13.el8.x86_64
  vim-enhanced-2:8.0.1763-13.el8.x86_64 vim-filesystem-2:8.0.1763-13.el8.noarch
  which-2.21-12.el8.x86_64

Complete!
Removing intermediate container bc296c183fd2
 ---> fd7d572c56f9
Step 6/7 : EXPOSE 80
 ---> Running in 9a732d4f6795
Removing intermediate container 9a732d4f6795
 ---> b08191ccdcba
Step 7/7 : CMD /bin/bash
 ---> Running in 4c89c2dfacf0
Removing intermediate container 4c89c2dfacf0
 ---> 23a4dbeeadaf
Successfully built 23a4dbeeadaf
Successfully tagged mycentos:0.1

2.3、查看Docker镜像

image-20200917103219893

Dockerfile中指定From centos,如果本地没有这个镜像的话,他会先去远程仓库拉取镜像。再基于这个镜像构建我们自己的镜像。

2.4、运行镜像

image-20200917105911805

上面配置的workdir工作目录,就是一进入容器我们切换进去的目录

image-20200917110128400

三、CMD和ENTRYPOINT

3.1、CMD的作用

CMD指定容器启动后执行的命令,如果我们再编写上面的dockerfile时,没有使用CMD执行/bin/bash,然后build,构建的过程不会出错,但是当我们直接启动容器时会碰到下面的问题

image-20200917111711157

没有和容器有任何交互,容器启动后会直接退出

所以我们得在启动参数中添加/bin/bash

image-20200917111857130

image-20200917111936372

3.2、CMD和ENTRYPOINT的区别

3.2.1、CMD

在一个Dockerfile中的存在CMD会发生替换,比如下面的Dockerfile

Dockerfile如下:

[root@VM-0-15-centos ~]# cat dockerfile2-centos
FROM centos
MAINTAINER changwu:0.6
CMD ["ls","-a"]

启动容器:

image-20200917113750399

Dockerfile如下:

[root@VM-0-15-centos ~]# cat dockerfile2-centos
FROM centos
MAINTAINER changwu:0.6
CMD ["ls","-a"]
CMD ["ls","-la"]

直接启动容器:发现,只有最后一个CMD执行了。

image-20200917113809900

而且手动指定容器启动后执行的命令:可以发现指定的 ls -a 又把它前面的命令替换掉了

image-20200917114103128

3.2.2、ENTRYPONIT

编写如下的dockerfile,指定启动后的命令是 ls -a

image-20200917134039619

直接启动

image-20200917134147292

携带启动参数启动:可以看到添加的参数和原来的参数同时生效

image-20200917134228058

四、制作Tomcat镜像

准备两份压缩包,jdk、tomcat

image-20200917140254883

编写Dockerfile文件

如果文件名为Dockerfile,那在build 镜像时都可以不使用 -f 执行Dockerfile文件,默认就会找这个Dockerfile文件。

FROM mycentos
MAINTAINER changwu:0.0.1

COPY readme.md /usr/local/readme.md

ADD jdk-8u181-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.38.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

# 先手动解压一下上面的jdk-8u181-linux-x64.tar.gz
# 名字就写它解压后的目录名,因为它解压后的目录名字可不一定是jdk-8u181-linux-x64
# 这里的JAVA_HOME写不对,tomcat中的catalina一定启动不了
ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.38
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.38
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

# 容器对外爆露的端口
EXPOSE 8080

# CMD中可以通过&&添加多个命令
# 比如我可以tail -f打印tomcat的启动日志(当然你想看它的启动日志就别加 -d 这个后台启动的参数)
# 启动tomcat不加这个打印日志,容器会直接退出的
CMD /usr/local/apache-tomcat-9.0.38/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.38/logs/catalina.out 

构建镜像

[root@VM-0-15-centos ~]# docker build -t my-tomcat:0.0.1 .
Sending build context to Docker daemon  191.5MB
Step 1/15 : FROM centos
 ---> 0d120b6ccaa8
Step 2/15 : MAINTAINER changwu:0.0.1
 ---> Running in c3450003f9fc
Removing intermediate container c3450003f9fc
 ---> 25e1b48f3ff1
Step 3/15 : COPY readme.md /usr/local/readme.md
 ---> 2810ef454d5b
Step 4/15 : ADD jdk-8u181-linux-x64.tar.gz /usr/local
 ---> 32cf8aff411b
Step 5/15 : ADD apache-tomcat-8.5.58-src.tar.gz /usr/local
 ---> c36c10a1bc8c
Step 6/15 : RUN yum -y install vim
 ---> Running in 8949f3d8e659
CentOS-8 - AppStream                            1.0 MB/s | 5.8 MB     00:05
CentOS-8 - Base                                 1.1 MB/s | 2.2 MB     00:01
CentOS-8 - Extras                               4.4 kB/s | 7.9 kB     00:01
Dependencies resolved.
================================================================================
 Package             Arch        Version                   Repository      Size
================================================================================
Installing:
 vim-enhanced        x86_64      2:8.0.1763-13.el8         AppStream      1.4 M
Installing dependencies:
 gpm-libs            x86_64      1.20.7-15.el8             AppStream       39 k
 vim-common          x86_64      2:8.0.1763-13.el8         AppStream      6.3 M
 vim-filesystem      noarch      2:8.0.1763-13.el8         AppStream       48 k
 which               x86_64      2.21-12.el8               BaseOS          49 k

Transaction Summary
================================================================================
Install  5 Packages

Total download size: 7.8 M
Installed size: 31 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm        371 kB/s |  39 kB     00:00
(2/5): vim-filesystem-8.0.1763-13.el8.noarch.rp 508 kB/s |  48 kB     00:00
(3/5): which-2.21-12.el8.x86_64.rpm             5.3 MB/s |  49 kB     00:00
(4/5): vim-enhanced-8.0.1763-13.el8.x86_64.rpm  825 kB/s | 1.4 MB     00:01
(5/5): vim-common-8.0.1763-13.el8.x86_64.rpm    2.8 MB/s | 6.3 MB     00:02
--------------------------------------------------------------------------------
Total                                           2.4 MB/s | 7.8 MB     00:03
CentOS-8 - AppStream                            1.6 MB/s | 1.6 kB     00:00
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature,key ID 8483c65d: NOKEY
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>"
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : which-2.21-12.el8.x86_64                               1/5
  Installing       : vim-filesystem-2:8.0.1763-13.el8.noarch                2/5
  Installing       : vim-common-2:8.0.1763-13.el8.x86_64                    3/5
  Installing       : gpm-libs-1.20.7-15.el8.x86_64                          4/5
  Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64                          4/5
  Installing       : vim-enhanced-2:8.0.1763-13.el8.x86_64                  5/5
  Running scriptlet: vim-enhanced-2:8.0.1763-13.el8.x86_64                  5/5
  Running scriptlet: vim-common-2:8.0.1763-13.el8.x86_64                    5/5
  Verifying        : gpm-libs-1.20.7-15.el8.x86_64                          1/5
  Verifying        : vim-common-2:8.0.1763-13.el8.x86_64                    2/5
  Verifying        : vim-enhanced-2:8.0.1763-13.el8.x86_64                  3/5
  Verifying        : vim-filesystem-2:8.0.1763-13.el8.noarch                4/5
  Verifying        : which-2.21-12.el8.x86_64                               5/5

Installed:
  gpm-libs-1.20.7-15.el8.x86_64         vim-common-2:8.0.1763-13.el8.x86_64
  vim-enhanced-2:8.0.1763-13.el8.x86_64 vim-filesystem-2:8.0.1763-13.el8.noarch
  which-2.21-12.el8.x86_64

Complete!
Removing intermediate container 8949f3d8e659
 ---> 7cd3b5b3d194
Step 7/15 : ENV MYPATH /usr/local
 ---> Running in 71997b4e7eed
Removing intermediate container 71997b4e7eed
 ---> 2247f3b03469
Step 8/15 : WORKDIR $MYPATH
 ---> Running in bab05a01d8a6
Removing intermediate container bab05a01d8a6
 ---> 43c93cf458c8
Step 9/15 : ENV JAVA_HOME /usr/local/jdk-8u181
 ---> Running in 9b441de5f74d
Removing intermediate container 9b441de5f74d
 ---> 8665de1607de
Step 10/15 : ENV CLASSPATH $JAVA_HOME/lib/rt.jar:$JAVA_HOME/lib/tools.jar:
 ---> Running in 9ef5e5b77b38
Removing intermediate container 9ef5e5b77b38
 ---> 5a3b9626c8c7
Step 11/15 : ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.58
 ---> Running in b933e49bbcc9
Removing intermediate container b933e49bbcc9
 ---> 45c951327a53
Step 12/15 : ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.58
 ---> Running in eb1442c32bdc
Removing intermediate container eb1442c32bdc
 ---> 3653a2916add
Step 13/15 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 ---> Running in d0b53ca7c763
Removing intermediate container d0b53ca7c763
 ---> f44bb4749b4b
Step 14/15 : EXPOSE 8080
 ---> Running in 91ed915a9882
Removing intermediate container 91ed915a9882
 ---> 6d0f3874bf63
Step 15/15 : CMD  /usr/local/apache-tomcat-8.5.58/bin/startup.sh && tail -f /usr/local/apache-tomcat-8.5.58/bin/logs/catalina.out
 ---> Running in a5baeca60b88
Removing intermediate container a5baeca60b88
 ---> e1aa0ad30a8f
Successfully built e1aa0ad30a8f
Successfully tagged my-tomcat:0.0.1

启动:并将tomcat的webapp目录、日志目录挂载到宿主机上

docker run --name my-tomcat -d -p 9999:8080  -v /home/mytomcat/test:/usr/local/apache-tomcat-9.0.38/webapps/test -v /home/mytomcat/tomcatlog:/usr/local/apache-tomcat-9.0.38/logs 2b3ce00d3bed

将服务器的安全组中相应的端口打开,通过浏览器通过ip+port是可以访问到tomcat的,如果访问不到可以容果日志去排查错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


最近一直在开发Apworks框架的案例代码,同时也在一起修复Apworks框架中的Bug和一些设计上的不足。遇到的一个普遍问题是,代码的调试过程需要依赖很多外部系统,比如MongoDB、PostgreSQL、RabbitMQ等。当然可以在本机逐一安装这些服务,然后对服务进行配置,使其满足自己开发调试
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。在文本发布和处理微服务中,我打算使用微软的SQL Server for Linux来做演示,于是也就在自己的docker-compose中加入了MS SQL Server的服务。其实在Docker中运行SQL Server是非常容
在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,我快速介绍了Kubernetes中分布式存储Rook-Ceph的部署过程,这里介绍如何在部署于Kubernetes的ASP.NET Core MVC的应用程序中使用Rook-Ceph所创建的存储对象。 构建ASP.NET C
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也抽空多了解了一些。项目主要基于Rook-Ceph运行,考虑到Rook-Ceph部署也不那么简单,官方文档的步骤起点也不算低,因此,在整合官方文档的某些步骤的基础上,写篇文章简单总结一下。 Rook-Ceph是Kubernetes中分布
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
构建镜像最具挑战性的一点是使镜像大小尽可能的小。Dockerfile中的每条指令都为图像添加了一个图层,您需要记住在移动到下一层之前清理任何不需要的工件。对于多阶段构建,您可以在Dockerfile中使用多个FROM语句。每个FROM指令可以使用不同的基础,并且每个指令都开始一个新的构建。您可以选择
本文介绍compose配置文件参数的使用,熟练编写compose文件 [root@docker lnmp]# cat lnmp.yaml version: &#39;3&#39; services: nginx: build: /root/docker_demo/nginx/ ports: - &q
环境 docker-machine主机:192.168.1.9 docker主机:192.168.1.10 步骤: 安装docker-machine 创建ssh密钥对,实现两主机无密登录 创建docker主机,命名host1 变更docker环境变量 运行容器查看两端是否同步 镜像容器同步测试成功
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
https://blog.csdn.net/wanglei_storage/article/details/77508620 实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行。然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容
1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理,然后再介绍多容器应用的部署问题。 2. Why Need Nginx .NET Core中默认的Web Server为Kestrel。 Kestrel is grea
docker rm `docker ps -a | grep Exited | awk &#39;{print $1}&#39;` 删除异常停止的docker容器 docker rmi -f `docker images | grep &#39;&lt;none&gt;&#39; | awk &#3
什么是Docker Compose 在微服务盛行的今天,我们通常是这么定义Compose的:对容器的统一启动和关闭的编排工具。 但是我以前还是有个疑惑,谁会用Compose在一台服务器上部署多个服务呢?干脆直接用单体服务就行了!直到我遇到了以下的一个需求,让我明白了在一台服务器上不得不用多个服务的时
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.netcore(二) 之 Dockerfile CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose CentOS下Docker与.netcore(四)之 三剑客之一D
很多时候,我们在本地开发过程中程序运行很正常,但是发布到线上之后由于环境的原因,可能会有一些异常。通常我们会通过日志来分析问题,除了日志还有一种常用的调试手段就是:附加进程。 VS中的附加进程非常强大,目前提供了9种常用的附加方式。 在当前.Net Core支持跨平台的大背景下,其中Linux环境和
https://www.cnblogs.com/bigberg/p/8867326.html 一、简介 Docker有个编排工具docker-compose,可以将组成某个应该的多个docker容器编排在一起,同时管理。同样在Swarm集群中,可以使用docker stack 将一组相关联的服务进行
.Net6中想实现对某个网址截屏,可通过Selenium模拟访问网址并实现截图。 实现 安装Nuget包 &lt;PackageReference Include=&quot;Selenium.Chrome.WebDriver&quot; Version=&quot;85.0.0&quot; /&g
原文&#160;https://www.cnblogs.com/gispathfinder/p/5871043.html 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host指定。 co