目录
一、使用dockerfile构建镜像
1.1、dockerfile指令
1.FROM
2.RUN
3.CMD
4.ENTRYPOINT
5.EXPOSR
编辑
6.ADD和COPY
编辑7.volume
8.USER
二、案例1:dockerfile构建httpd镜像
构建一个指定挂载点的httpd镜像
三、案例2:构建tomcat镜像
三、案例3:构建mariadb镜像
第一步:准备一个脚本初始化并启动mysql
第二步:创建dockerfile文件
一、使用dockerfile构建镜像
除了使用docker commit把自定义容器提交成镜像外,还可以使用Dockerfile来构建自定义镜像。
什么是Dockerfile?
答: Dockerfile把构建镜像的步骤都写出来,然后按顺序执行实现自动构建镜像。就类似于脚本文件,ansible的playbook,saltstack的sls文件等。
1.1、dockerfile指令
1.FROM
FROM指令用于指定其后构建新镜像所使用的基础镜像。FROM指令必是Dockerfile文件中的首条命令。
FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库,优先本地仓库。
2.RUN
RUN指令用于在构建镜像中执行命令,有以下两种格式:
注意:按优化的角度来讲:当有多条要执行的命令,不要使用多条RUN,尽量使用&&符号与\符号连接成一行。因为多条RUN命令会让镜像建立多层(总之就是会变得臃肿了).
3.CMD
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令。
4.ENTRYPOINT
ENTRYPOINT与CMD非常类似
相同点:
一个Dockerfile只写一条,如果写了多条,那么只有最后—条生效都是容器启动时才运行
不同点:
如果用户启动容器时候指定了运行的命令,ENTRYPOINT不会被运行的命令覆盖,而CMD则会被覆盖
5.EXPOSR
用于指定容器在运行时监听的端口
上述运行的端口还需要使用docker run运行容器时通过-p参数映射到宿主机的端口.
6.ENV
用于指定环境变量
6.ADD和COPY
用于把宿主机上的文件拷贝到镜像中
COPY的源文件只能是本地文件
7.volume
VOLUME指令用于把宿主机里的目录与容器里的目录映射.
只指定挂载点,docker宿主机映射的目录为自动生成的。
8.USER
USER指令设置启动容器的用户(像hadoop需要hadoop用户操作,oracle需要oracle用户操作),可以是用户名或UID
注意:如果设置了容器以daemon用户去运行,那么RUN,CMD和ENTRYPOINT都会以这个用户去运行镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户
9.WORKDIR
WORKDIR指令设置工作目录,类似于cd命令。不建议使用RUN cd /root ,建议使用WORKDIR
二、案例1:dockerfile构建httpd镜像
1、创建一个目录(自定义)
例如mkdir /dockerfile
2、编写dockerfile
#cd /dockerfile
#vim dockerfile_httpd
CMD指定容器运行时执行的参数或者命令
3、构建dockerfile镜像
通过dockerfile_httpd文件构建镜像(my_httpd:v1)在当前目录
拓展:如果公网源速度特别慢,可以尝试自建httpd的yum源
配置本地yum源
使用Alias别名配置 参数Indexes是以列表显示(要访问的资源)
构建一个指定挂载点的httpd镜像
使用本地yum源的构建速度明显加快
构建完成之后可以先查看镜像是否存在之后docker run 启动阿帕奇镜像 curl访问一下
可以使用docker inspect 容器id 查看是否挂载
正常的容器信息中Mounts中是没有信息的
三、案例2:构建tomcat镜像
准备好tomcat需要的jdk,tomcat等软件包,还有配置好环境变量的startup.sh和shutdown.sh文件
最好是先解压tomcat安装包之后把里面的shutdown.sh和startup.sh文件拷贝出来
编写dockerfile文件即可
注意:使用这种方式启动容器是错误的,必须使用凯特琳那启动Tomcat
优化之后的dockerfile 上面这个是拷贝格式错了
拷贝目录必须加上后面的名称 例如tomcat 必须最后加上 /usr/local/tomcat
使用docker build 命令构建镜像
先使用lsof -i 命令查看端口占用情况 之后启动容器使用端口映射,映射容器的8080 端口到物理机
三、案例3:构建mariadb镜像
第一步:准备一个脚本初始化并启动mysql
使用脚本而不直接使用dockerfile里的RUN指令的原因是:启动mysql服务需要使用&放到后台,但把后台符号放在RUN里会造成RUN命令有问题(&命令把任务放到后台会限制,导致任务跳过),所以单独使用脚本来做
sleep 3秒是因为初始化和启动服务需要一定的时间,等待3秒缓冲一下
第二步:创建dockerfile文件
第三步:docker build
启动容器之前先用lsof -i 命令查看端口是否被占用
最后用build的镜像启动容器 docker run -d -p 3306:3306 --name mariadb mymariadb:v1