Dockerfile应用实例

本文详细介绍了Dockerfile的使用,包括COPY、ADD、CMD、ENTRYPOINT等指令的实践,强调容器内程序必须前台运行。通过示例展示了如何构建和运行一个nginx镜像,并讨论了ARG、ENV、VOLUME等指令。此外,还涵盖了容器操作如后台运行、查看日志、停止和删除容器等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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端口

COPY命令

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


ADD

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

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"]

把宿主机安装,启动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"]

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

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

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)

2.3 更新Dockerfile为如下:

FROM centos_app
RUN rpm --rebuilddb && yum install epel-release -y
RUN rpm --rebuilddb && yum install curl -y
CMD ["curl","-s","http://ipinfo.io/ip"]

2.4 再次构建dockerfile

docker
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值