docker笔记3-dockerfile定制镜像

dockerfile的组成

1.基础镜像信息,指定发行版本 FROM centos

2.制作镜像操作指令 RUN yum install openssh-server -y

3.容器启动指令执行 CMD [/bin/bash]

dockerfile常用指令

|------------|----------------------------------------------------------|
| 指令 | 含义 |
| FROM | 指定基础镜像 |
| MAINTAINER | 指定维护人信息,可省略 |
| RUN | 基于基础镜像执行命令,docker内每执行一条命令都是run开头 |
| ADD | 添加宿主机文件到容器内,会识别压缩格式并且自动解压 |
| COPY | 作用和ADD一致,但是不会自动解压 |
| WORKDIR | 设置当前工作目录 |
| VOLUME | 设置卷,挂载主机目录 |
| EXPOSE | 指定对外端口 |
| CMD | 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令, 如果指定多条则只能最后一条被执行 |
| | |
| ENV | 设置环境变量,会被后面的run使用 |
| ENTRYPOINT | 容器启动后执行的命令 |

一个简单的dockerfile运行实例

需求:通过dockerfile,构建nginx镜像,运行容器后nginx的访问首页显示"hello hello,这是docke运行的nginx!!!"
实现:

1.创建Dockerfile

文件名必须是Dockerfile

执行vi Dockerfile 创建Dockerfile 文件录入以下内容

#基于nginx镜像
FROM nginx
# 把内容重定向输入到nginx的欢迎页面中
RUN echo '<meta charset=utf8> hello hello,这是docke运行的nginx!!!' >/usr/share/nginx/html/index.html

2.构建dockerfile

在Dockerfile文件目录执行 docker build . 注意哈后边有个点
​docker build -t '镜像名称' . 在构建镜像是时指定镜像的名称
-- no-cache 不使用当前docker已有的镜像缓存,重新下载新的,跟在 ​docker build 后边

点是在当前目录寻找Dockerfile

3.修改镜像名称

docker tag 52496b401a3d my_nginx

4.运行镜像并验证

docker run -d -p 80:80 my_nginx

访问宿主机的80端口

常用指令的具体用法

COPY

1.COPY:添加宿主机文件到容器内

示例 COPY aaa.txt /home 复制宿主机的aaa.txt到容器的home目录
2.支持多个文件、通配符复制,语法要满足Golang的filepath.Match

示例 COPY aaa* /tmp/cc?.txt. /home 把 aaa开头 和/tmp下cc开头的txt文件都复制到容器的home中
3.COPY指令会保留源文件的原数据,如权限、访问时间等等

ADD

特性和copy一致,不过多了些功能

1.源文件是一个url,docker会下载该链接放入目标路径,权限设置为600,如需修改权限增加一层run指令
2.源文件是一个url且是一个压缩包,docker会下载该链接放入目标路径,不会解压,如需解压需要单独使用run指令解压
3.源文件是一个压缩文件,且是gzip、bzip2、xz、tar的,ADD会自动解压该文件到目标路径

CMD

作用: 用于启动容器后指定具体运行参数,docker不是虚拟机,容器就是一个进程,所以需要在启动的时候需要指定运行参数,在指定了entrypoint之后,用CMD指定具体参数,

语法: CMD ["参数1","参数2"]

例如:执行了docker run -it centos 就等于执行了 docker run -it centos bash 可以看出centos的cmd参数是 CMD ["/bin/bash"]

docker run -it centos cat /etc/os-release 就等同于 CMD ["cat","/etc/os-release"]

注意:CMD指定容器内的应用启动,必须是前台启动,否则容器在启动后会直接停掉

ENTRYPOINT

作用和cmd一样,都是指定容器启动程序以及参数。

当指定了ENTRYPOINT之后,CMD的语义就有了变化,是把CMD的内容当做参数传递给ENTRYPOINT指令。

我们创建一个dockerfile

#指定基础镜像 centos

FROM centos:7.8.2003

#修改yum源

RUN rpm --rebuilddb && yum install epel-release -y

#安装curl

RUN rpm --rebuilddb && yum install curl -y

#请求一个地址

CMD ["curl","-s","http://ipinfo.io/ip"]

运行之后我们拿到一个结果

在这个镜像的基础上,我想启动的时候加个 -I 获取一下请求头信息,发现直接报错了,无法直接传参,会覆盖CMD的参数。

docker run centos_curl -I

解决方案使用ENTRYPOINT,修改Dockerfile 把CMD 改为ENTRYPOINT

#指定基础镜像 centos

FROM centos:7.8.2003

#修改yum源

RUN rpm --rebuilddb && yum install epel-release -y

#安装curl

RUN rpm --rebuilddb && yum install curl -y

#请求一个地址

ENTRYPOINT["curl","-s","http://ipinfo.io/ip"]

修改重新构建镜像之后,在后边添加参数运行成功

ARG 和 ENV

**作用:**设置环境变量

ARG 和 ENV一样都是设置环境变量

ENV设置的环境变量在镜像构建或容器运行时都可以使用

ARG只用于构建镜像,容器运行时就消失了

语法:ENV 变量名="xxxxx"

定义以后我们就可以使用 $变量名获取变量值操作,维护dockerfile是更友好

VOLUME

容器在运行时,应该保证在存储层不写入任何数据,运行在容器内产生的数据我们推荐是挂载写入到宿主机上。

VOLUME /宿主机的目录

在容器运行时,该目录自动挂载为匿名卷,任何向该目录中写入数据的操作都不会被容器记录

VOLUME ["xxx","xxx"....] 挂载多个

创建一个dockerfile 生成两个目录挂载到宿主机上

FROM centos:7.8.2003

MAINTAINER xiaoqiang

VOLUME ["/data1","/data2"]

构建运行使用 docker inspect 容器id 可以看到 data1 被挂载到了宿主机的 /var...目录

EXPOSE

指定容器运行时的对外端口

WORKDIR

拥有在dockerfile中的目录切换,更改工作目录

WORKDIR 容器目录

USER

用于改变环境切换用户

USER 用户名

相关推荐
怡雪~4 分钟前
K8s的水平自动扩容和缩容HPA
云原生·容器·kubernetes
史努比.7 分钟前
HPA - k8s自动伸缩机制
云原生·容器·kubernetes
DDDiccc23 分钟前
JAVA题目笔记(二十)Stream流综合练习+方法引用
笔记
大筒木老辈子28 分钟前
Linux笔记---进程:进程状态
笔记
开心就好13145201 小时前
uniapp 开发微信小程序笔记
笔记·微信小程序·uni-app
运维&陈同学1 小时前
【kafka01】消息队列与微服务之Kafka详解
运维·分布式·后端·微服务·云原生·容器·架构·kafka
蜗牛丨2 小时前
Go Vue3 CMS管理后台(前后端分离模式)
mysql·docker·go·vue3·axios·gin·jwt·分页·跨域·ant design vue·log·gorm·otp动态码登录·validator·模型绑定·权限判断
澜世2 小时前
2024小迪安全基础入门第七课
网络·笔记·安全·网络安全
weixin_478689762 小时前
【二叉树】【2.1遍历二叉树】【刷题笔记】【灵神题单】
笔记
菜鸟小灰灰2 小时前
搭建私有docker仓库
运维·docker·容器