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 用户名

相关推荐
Java陈序员2 天前
轻量强大!一款现代化的 Kubernetes 集群管理与监控工具!
云原生·容器·kubernetes
Sheffield3 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield4 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
马艳泽4 天前
win10下运行Start Broker and Proxy报错解决
docker
齐生14 天前
iOS 知识点 - 渲染机制、动画、卡顿小集合
笔记
用户13573999256605 天前
Windows 从 0 搭建 WSL2 原生 AI 开发环境:Codex + Docker + VSCode
docker
用户962377954485 天前
VulnHub DC-1 靶机渗透测试笔记
笔记·测试
vi_h5 天前
在 macOS 上通过 Docker 安装并运行 Ollama(详细可执行教程)
macos·docker·ollama
黑心老魔5 天前
通过 Docker 创建开发环境
docker·开发环境
冬奇Lab5 天前
一天一个开源项目(第41篇):Workout.cool - 现代化开源健身教练平台,训练计划与进度追踪
docker·开源·资讯