当前位置:   article > 正文

Dockerfile应用实例_dockerfile例子

dockerfile例子

Dockerfile实践

需求:通过dockerfile,构建nginx镜像,且运行容器后,生成页面:我带你学习docker运行nginx服务

#1. 创建Dockerfile,注意文件名,首字母大写
mkdir Docker_learn
cd Docker_learn
touch Dockerfile
chmod 777 Dockerfile
vim Dockerfile
#在Dockerfile文件中写入以下内容:
FROM nginx
RUN echo '<meta charset=utf8> 我带你学习doker运行nginx服务

#2.构建镜像文件,需进入Docker_learn目录,进行构建
docker build .
#3.修改镜像名的tag
docker tag 镜像ID  镜像名称
docker tag b42 my_nginx
#4运行该镜像文件
docker run -d -p 80:80 my_nginx
#5查看宿主机的80端口

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

COPY命令

#copy指令从宿主机复制文件/目录到新的一层镜像内
copy chaoge.py /home/
#支持多个文件,以及通配符形式复制,语法要满足golang的filepath.match
copy charge* /tmp/cc?.txt. /home/
#COPY指令能够保留源文件的元数据,如权限 访问时间等等,这点很重要


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

ADD

1、特性和COPY基本一致,不过多了些功能
2、源文件是一个URL,此时docker引擎会下载该链接,放入目录路径,且权限自动设为600,若这不是期望结果,还得增加一层RUN指令进行调整
3、源文件是一个URL,且是一个压缩包,不会自动解压,也得单独用RUN指令解压

  • 1
  • 2
  • 3
  • 4

Dockerfile官方更为推进使用COPY,ADD包含了更多复杂的功能,且ADD会使构建缓存失效,导致镜像构建缓慢。

CMD

#1、用法,注意是双引号
CMD ["参数1","参数2"]
#2、在指定了entrypoint指令后,用CMD指定具体的参数
#3、docker不是虚拟机,容器就是一个进程,既然是进程,那么程序在启动的时候需要指定些运行参数,这就是CMD指令作用
#4、例如centos镜像默认的CMD是/bin/bash,直接docker run -it centos cant /etc/os-release
#5、CMD运行shell命令,也会被转化为shell形式
例如 CMD echo $PATH
会被转换为 CMD ["sh","-c","echo $PATH"]
#该容器运行时,执行命令。 等同于命令行的直接操作 docker run -it centos cat /etc/os-release
CMD ["cat","/etc/os-release"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

把宿主机安装,启动nginx的理念放入到dockerfile
1、RUN yum install nginx
2、RUN 配置文件修改 sed
3、RUN systemctl start nginx 这是错误的,容器内程序必须前台运行,你的容器时启动不了的
4、正确的应该是CMD [“nginx”,“-g”,“daemon off;”]

容器内运行程序

这里要注意的是,docker不是虚拟机的概念,虚拟机里的程序运行,基本上都是在后台运行,利用systemctl运行,但是容器内没有后台进程的概念,必须在前台运行。
容器就是为了主进程而存在,主进程如果退出了,容器就失去意义,自动退出。

ENTRYPOINT

和RUN指令一样,分为两者格式

  • exec
  • shell
    作用和CMD一样,都是在指定容器启动程序以及参数。
    当指定了ENTRYPOINT之后,CMD指令的语义就有了变化,而是把CMD的内容当作参数传递给ENTRYPOINT指令。
    1、准备好Dockerfile
FROM centos
RUN rpm --rebuilddb && yum install epel-release -y
RUN rpm --rebuilddb && yum install curl -y
CMD ["curl","-s","http://ipinfo.io/ip"]
  • 1
  • 2
  • 3
  • 4

2、构建Dockerfile的镜像,进入Dockerfile目录
docker build .
2.1 发现如下问题:

Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist
  • 1

2.2 解决方法,centos更换为带appstream的镜像文件,取名centos_app:

#进入centos的容器
docker run -it --name centos_app centos bash

#进入yum的repos 目录
cd /etc/yum.repos.d/
#修改 centos 文件内容
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
#生成缓存更新(第一次更新,速度稍微有点慢,耐心等待两分钟左右)
yum makecache
#运行 yum update
yum update -y
#另外起个链接,安装完成后生产新的镜像
docker commit 容器IT 新镜像名(centos_app)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.3 更新Dockerfile为如下:

FROM centos_app
RUN rpm --rebuilddb && yum install epel-release -y
RUN rpm --rebuilddb && yum install curl -y
CMD ["curl","-s"
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/834539
推荐阅读
  

闽ICP备14008679号