为什么要构建自定义的镜像?
- 官方镜像使用的都是默认配置,比如mysql容器使用的官网的mysql,需要自己修改mysql的配置文件、设置用户名和密码
- 部署服务,比如在tomcat容器中部署用户服务,把部署好的tomcat容器打包为一个镜像,部署用户服务集群时,直接拉取这个镜像即可,不需要一个一个部署用户服务
docker制作镜像的2种方式
- Docker Commit
- dockerfile 主流方式
Docker Commit方式制作镜像
修改好容器之后:
docker commit -a "chy [email protected]" -m "做了哪些修改" id|name imageName:version
-a指定作者信息,-m指定镜像信息,一般是说明做了哪些修改、这个镜像的功能用途。如果值是不带空格的字符串,可以不引,带了空格就要引起来。
-a、-m均可选,如果配置了,使用docker inspect id|name 查看该镜像创建的容器的信息时会看到这2个参数的值
id|name指定要使用哪个容器制作镜像
imageName:version指定镜像的名称、版本号,版本号任意,可以是test、v1这种字符串,也可以是1、1.1这种数字
dockerfile方式制作镜像
(1)vim dockerfile #文件名必须是dockerfile
(2)在里面写指令:
FROM imageName:version
MAINTAINER chy [email protected]
RUN each "image is building..."
(3)docker build -t mytomcat:v1 . #构建镜像,mytomcat:v1是自定义的镜像名称、版本号,后面是dockerfile文件所在目录,.表示当前目录
dockerfile常用指令
FROM imageName:version #基于哪个镜像构建
MAINTAINER chy [email protected] #作者信息
COPY 1.txt /usr/local/ #将文件从宿主机复制到镜像,宿主机的路径写相对路径,镜像的路径写绝对路径
ADD 1.txt /usr/local/ #和COPY相似,不同点:如果是.tar.gz文件,ADD复制之后会自动解压
WORKDIR /usr/local/tomcat 指定应用的工作目录,如果此目录不存在,会自动创建
ENV JAVA_HOME=/usr/local/jdk #设置环境变量
EXPOSE 8080 #开放防火墙端口
RUN echo "image is building..." #作用于镜像层面,在构建镜像时执行;如果有多条RUN命令,都会执行
ENTRYPOINT yum install xxx -y #作用于容器层,在容器启动的时候执行;如果有多条ENTRYPOINT命令,只执行最后一条ENTRYPOINT命令
CMD yum install xxx -y #作用于容器层,在容器启动的时候执行;如果有多条CMD命令,只执行最后一条CMD命令。
ENTRYPOINT、CMD的区别:
CMD可以在容器启动时传递参数,参数是默认参数,可以被覆盖,ENTRYPOINT不可以传参数。
如果要用CMD传参数,需要搭配ENTRYPOINT使用,示例:
CMD ["-ef"]
ENTRYPOINT ["ps"]
docker run或docker start 启动容器时,可以向ps命令传递参数,eg. docker start id|name -ef
比如传递-ef,比如传递-aux,传递的参数会覆盖默认的-ef,如果不向ps命令传递参数,使用默认的-ef
命令格式
RUN、ENTRYPOINT、CMD运行的命令可以是下面的2种格式
- shell命令格式 RUN echo "....",RUN yum install xxx -y
- exec命令格式 RUN [ "yum","install" ,"xxx" ,"-y"] 命令写成字符串数组
Docker Commit方式要启动镜像的一个容器,对容器进行修改,打包为镜像,再停止、删除这个容器,颇为麻烦;
dockerfile是在宿主机上新建文件dockerfile,在dockerfile文件中写指令,不需要操作容器,更简便,用得也更多;
但dockerfile难度也要大得多,比如制作redis镜像,在dockerfile中修改redis conf中的配置项,记住配置项的名字还是有点麻烦的。
创建镜像时可以基于官方镜像创建,也可以基于CentOS的进行进行创建。
比如tomcat,可以在tomcat官方镜像的基础上改,
也可以在CentOS镜像的基础,自己装jdk、tomcat、配置环境变量。
构建自定义的tomcat镜像
tomcat很常用,包含了jdk环境,运行java -jar、部署war都行。
官方的tomcat镜像包含了jdk环境,但自带的jdk环境往往不符合需求,且tomcat本身的配置也需要修改一下,所以tomcat的镜像一般都要自己构建。
比如docker inspect tomcat:9 | grep jdk 看到tomcat9自带的是jdk11,我们需要的是jdk8。
dockerfile:
-p 8080:8080 #前面是宿主机的端口