Dockerfile 构建镜像

1 # 这是一个基础的Dockerfile,用该文件来构建镜像,具体每个命令的用法,下方都有说明
2 FROM ubuntu:latest
3 ENV VERSION=2.0.1
4 RUN tar zxf ipinfo_${VERSION}.tar.gz
5 
6 FROM ubuntu:latest
7 ARG VERSION=2.0.1
8 RUN tar zxf ipinfo_${VERSION}.tar.gz
# docker build(通过dockerfile制作镜像)
# -t label:v1 (指定版本标签)
# -f 1.label (指定dockerfile文件)
# ./ (在当前目录制作)
# --no-cache (重新构建,不使用原有缓存)
docker image build -t label:v1 -f 1.label ./ --no-cache

# 修改镜像名
docker image tag oldname newname

# 上传镜像jspangcom为你的用户名,jspang是你需要上传的镜像名
docker image push jspangcom/jspang

# 引入基础镜像
# 三要素:官方和非官方镜像、使用固定版本的镜像而不是每次都换、功能满值尽量选择体积小的镜像版本
FROM ubuntu:latest

# MAINTAINER (指定镜像创建者信息)  非填
MAINTAINER chad "www.abc.com"

# LABEL (将元数据添加到镜像) 通过标签的方式保存key value
LABEL "name"="Chad"
LABEL version="1.0"
LABEL DESCRIPTION="这里是描述信息,换行的话需要用反斜杠\ 
这样就换行了"
LABEL key1="value1" key2="value2" key3="一行定义多个标签"
LABEL key1="value1" \
    key2="value2" \
    key3="一行定义多个标签,这里利用反斜杠多好定义"

# 执行shell命令,每个RUN都是一个分层
# RUN (软件安装执行命令)
RUN cd /tmp && curl -L 'www.bac.com/abc.tar.gz' | tar -xz
RUN ["/bin/bash", "-c", "echo hello"]

# 利用&& \ 语法来减少分层,从而节省镜像空间
RUN apt-get update && \
apt-get install -y wget && \
apt ...

USER (设置container容器的用户) 默认是root用户
USER daemon = 

# EXPOSE (指定容器需要映射哪些端口到主机)
EXPOSE port1 port2 port3

# 查看详细分层
docker image history [镜像id]  or  docker image history --no-trunc odoo

# ADD (从src复制文件到container的dest路径)
ADD <src> <dest>
# <src>可以是挂载点路劲、也可以是文件目录路径、还可以是一个远程文件的url
# <dest>是container中的文件路劲

# COPY (和ADD区别是,只支持本地文件目录路径下复制文件到container)
COPY <src> <dest>

# WORKDIR (切换目录) 相当于cd命令,对RUN,CMD,ENTRYPOINT生效。并且每次-it进入的目录也是该目录下
WORKDIR /p1 WORKDIR p2 RUN vim a.txt
WORKDIR /app

# 定义变量ARG、ENV,都是${}来引用
# 他们的区别:ENV可以带入到镜像环境中去ARG不行。
# ARG 定义的变量,在构建的时候可以给它赋值
# ARG赋值如:docker image build -f Dockerfile.bad -t ipinfo-arg-2.0.0 --build-arg VERSION=2.0.0 .
FROM ubuntu:latest
ENV VERSION=2.0.1
RUN tar zxf ipinfo_${VERSION}.tar.gz

FROM ubuntu:latest
ARG VERSION=2.0.1
RUN tar zxf ipinfo_${VERSION}.tar.gz

# 删除未启动的容器
docker system prune

# 删除未使用的镜像
docker image prune

# CMD (设置container启动时执行的操作)  该指令只能存在一条,如果写了多条的话,则只有最后一条生效
CMD echo "hello world!"

# ENTRYPOINT (设置container启动是执行的操作)
FROM cetos
CMD ["p in run"]
ENTRYPOINT ["echo"]
# docker run iamge:v1 运行时执行的是 echo p in run
# docker run iamge:v1 p in b 运行时执行的是 echo p in b
# 得出结论:docker run的时候可以修改CMD 

# ONBUILD  (在子镜像中执行)
ADD ./app/src
ONBUILD  RUN rm -rf /root/app/src
# 应用场景:父镜像包含源码,子镜像在构建的时候会执行父镜像的ONBUILD命令(删除源码)。

# STOPSIGNAL signal
# docker容器停止的时候,发送停止信号的级别

# HEALTHCHECK (容器将康状况检查命令)
# HEALTHCHECK [OPTIONS] CMD command
# [options] 
# --intercal=DEFAULT  检查间隔,默认30秒
# --timeout=DEFAULT   命令超时市场
# --retries=N 失败次数,默认3次
# CMD后面跟的命令的返回值,0健康,1容器不工作了,2保留值
HEALTHCHECK NONE  # 取消健康检查

# 容器结束的时候删除容器 --rm
docker container run --rm -it demoimage

# 数据持久化
# 设置容器中的某个目录为持久化目录,
# 那该目录会持久化到本地来,你可以通过docker volume ls来查看本地有哪些持久化目录
# 持久化了之后,哪怕你容器删除了,持久化的目录是依然存在的,
# 并且你启动的时候通过 -v 命令来复用持久化的目录文件
VOLUME ["/app"]

# 查看持久化数据的命令
docker volume ls

# 查看具体的持久化数据详情
docker volume inspect my_data

# 新启动的容器,如何复用持久化数据
# -v 启动时为持久化的目录命名
# my_data:/app 这里指的是,将VOLUME ["/app"]中的"/app"持久化目录命名为my_data
# name在docker volume ls时就可以查询到了
docker container run -d -v my_data:/app image_name

# 将docker中VOLUME ["/app"]设置的持久化目录映射到本地来,
# 这样本地休改了持久化目录的文件,容器中会实时更新
# 好处是,我们可以将容器当做运行环境,在本地编写完代码放到容器中实时运行
# -v ${pwd}:/app ${pwd}路径,这里的pwd指的是当前目录
docker container run -it -v ${pwd}:/app node sh

# 查看容器哪些端口可以映射
# 其实该命令结果是在容器详细信息中查到的
# docker container inspect[容器id] 查询容器详细信息
docker container inspect --format '{{.Config.ExposePorts}}' [容器id]

# 查看容器详细信息
docker container inspect[容器id]

# 构建镜像:从容器构建
# -a :提交的镜像作者;
# -c :使用Dockerfile指令来创建镜像;
# -m :提交时的说明文字;
# -p :在commit时,将容器暂停。
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1 

 

posted @ 2021-10-25 14:51  看一百次夜空里的深蓝  阅读(188)  评论(0编辑  收藏  举报