1. dockerfile的基本定义
`dockerfile`是一个包含用于组合镜像的命令的文本文档,可以在命令中调用任何命令,
docker通过读取Dockerfile中的指令自动生成镜像
2.dockerfile的基本结构
`dockerfile`一般分为四部分:
基本镜像信息,
维护者信息,
镜像操作指令,
容器启动时的执行指令,
`#`为`dockerfile`中的注释3
3.dockerfile的常用指令
常用指令一般都要大写
FROM:指定基础镜像,必须是第一个命令
#格式:
FROM image
FROM image:tag
FROM image@digest
#如
FROM MySQL:5.7 #如不指定tag或digest,则使用lastest版本
MAINTAINER:维护者信息
#格式
MAINTAINER name+email
MAINTAINER name
MAINTAINER email
#如
MAINTAINER jame 123@gmail.com
RUN:构建镜像时执行的命令
#格式
RUN command
#如
RUN ["executable","param1","param2"]
#RUN指令创建的中间镜像会被缓存,并会下次构建中使用,如果不想使用,可以使用 --no-cache参数,如:
docker build --no-cache
ADD:将本地文件添加到容器中
#格式
ADD src dest
ADD ["src",...,"desc"] #用于支持包含空格的路径
#如
ADD test /mydir
ADD test?.txt /mydir
ADD t* /mydir
COPY功能和ADD类似,区别如下
#区别
ADD 对于添加tar类型文件,可以自动解压
ADD 可以访问网络资源
COPY 不可自动解压也不可访问网络资源
CMD:构建容器这后使用
#格式
CMD ["executable","param1","param2"]
CMD command parma1 param2
#如
CMD echo "hello"
#CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,RUN是用于指定镜像构建时所有使用的执行的命令
ENTRYPOINT:配置容器,与CMD类似
#格式
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param2,param3
#如
ENTRYPOINT ["top","-b"]
#与CMD不同点
#docker run 执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当作参数再次传递给ENTRYPOINT,Dockerfile中只允许有一个ENTRYPOINT命令,多指定会覆盖前面的设置,而只执行最后的ENTRYPOINT指令
LABEL:用于为镜像添加元数据
#格式
LABEL key=value key=value ...
#如
LABEL version=1.0 description="hello world"
#使用LABEL指定元数据时,一条LABEL可以指定一或多条元数据,多条元数据通过空格分格
ENV:设置环境变量
#格式
ENV key value #这种格式的只能设置一个变量
ENV key=value #可以设置成多个
#如
ENV name centos
ENV name=123
EXPOSE:指定与外界交互的端口
#格式
EXPOSE port ...
#如
EXPOSE 80,443
EXPOSE 11211/tcp 11211/udp
#EXPOSE并不会让容器的端口访问到主机,需要在docker run运行时通过 -p 来发布这些端口,或者通过-P参数来发布EXPOSE导出的所有端口
VOLUME:用于指定持久化目录
#格式
VOLUME ["/path/to/dir"]
#如
VOLUME ["/data"]
VOLUME ["/var/www","/var/log/test"]
#一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统
#卷可以容器间共享和重用
#容器并不一定要和其它容器共享卷
#修改卷后会立即生效
#对卷的修改不会对镜像产生影响
#卷会一直在,直到没有容器使用它
WORKDIR:工作目录,类似于CD命令
#格式
WORKDIR /path
#如
WORKDIR /a #这时工作目录为/a
#设置WORKDIR工作目录里,Dockerfile中其后的命令,RUN,CMD,ENTRYPOINT,ADD,COPY等命令都会在这个目录执行
USER:指定运行容器时的用户名或UID,后面的RUN也会使用指定用户,当服务不需要管理员权限时,可以通过该命令指定运行用户
#格式
USER user
USER user:group
USER uid
USER gid
USER uid:gid
USER uid:group
#如
USER www
#使用USER指定用户后,Dockerfile中其后的命令RUN,CMD,ENTRYPOINTf都将使用这个用户
ARG:用于指定传递给构建运行时的变量
#格式
ARG name
ARG name=valuue
#如
ARG site
ARG name=123
ONBUILD:用于设置镜像触发器
#格式
ONBUILD [INSTRUCTION]
#如
ONBUILD ADD ./App
#当所构建的镜像被用作其它镜像的基础镜像,该镜像中的触发器会被触发
由于官方centos里没有vim ,ficonfig等工具,先来个简单点的学习一下,从打包到发布的流程,后面再构建Nginx,php,mysql,redis各自的dockerfile文件,搭建自己的开发环境 !
编写dockerfile文件
#dockerfile文件如下
FROM centos #基础镜像
#MAINTANER 123 123@gmail.com 现在官方推荐使用 LABEL标签使用
LABEL maintaner=123@gmail.com
#设置环境变量
ENV PATH=/usr/local
#设置工作目录
WORKDIR $PATH
#创建容器时执行的命令
RUN yum install -y vim && yum -y net-tools
#暴露端口
EXPOSE 80
# 镜像构建完成后执行的命令
CMD echo "===success======="
#以/bin/bash运行
CMD /bin/bash
通过dockerfile构建镜像
#使用命令 docker build 命令
#常用参数如下:
-f #指定dockerfile文件
-t #指定镜像标签
#打包命令如下,注意最后那个点别丢了,代表当前目录
docker bulid -f mydockerfile -t mycentos:1.0 .
查看镜像构建的过程,可以使用docker history 镜像id来查看
#查看一下nginx的构建过程
docker history nginx
发布地址: Dockerhub,阿里云
#使用 docker login 命令登录
#使用 docker push 发布镜像
使用 docker login -u 用户名 -p 密码
登录成功如下:
使用 docker push 命令发布镜像到dockerhub,结果报错
denied: requested access to the resource is denied
#解决办法:
在build自己的镜像的时候添加tag时必须在前面加上自己的dockerhub的username,然后再push就可以了
#我这里使用 docker tag 命令修改标签
#命令如下:
docker tag mycentos:1.0 lnssm/mycentos:1.0
#再push就可以了
docker push lnssm/mycentos:1.0
创建完命名空间后,打开镜像仓库,创建镜像仓库,选择本地仓库
根据官方给的文档开始提交就可以,这里就不截图了