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