简介:自定义镜像:(给一镜像盖楼)
[root@docker1 docker_images]# docker start 8d07ecd7e345 //可以简写为8d,要保证唯一性
[root@docker1 docker_images]# docker commit 8d07ecd7e345 docker.io/myos:latest 另存为另一个镜像名字为(docker.io/myos:latest)
使用Dockerfile文件创建一个新的镜像文件
语法: FROM:基础镜像 MAINTAINER:镜像说明 EXPOSE:开放的端口 ENV:设置环境变量 ADD:复制文件到镜像 RUN:制作镜像时执行的命令,WORKDIR:定义容器工作目录
CMD:容器启动时执行的命令,仅可以有一条CMD。
1.基础操作
创建一个Apache镜像文件1
命令 : docker build -t 新镜像名字 Dockerfile所在的路径 例如: docker build -t php:7.1.22-fpm-alpine .
创建Dockerfile
[root@docker1 ~]# mkdir bulid [root@docker1 ~]# cd bulid [root@docker1 ~]# vim index.html //创建容器里面的index文件 [root@docker1 bulid]# touch Dockerfile //Dockerfile文件第一个字母要大写 [root@docker1 bulid]# vim Dockerfile FROM docker.io/myos:latest //选定基础镜像 RUN yum -y install httpd //选择安装时的命令 ENV EnvironmentFile=/etc/sysconfig/httpd //设置环境变量 WORKDIR /var/www/html/ //定义工作目录 ADD index.html index.html //复制本机文件(当前路径)到容器工作目录 EXPORT 80 //声明开放的端口 EXPOST 443 CMD ["/usr/sbin/httpd","-DFOREGROUND"] //容器启动的命令
通过build命令打包成myos:http
[root@docker1 bulid]# docker build -t docker.io/myos:http .
运行刚制作的容器
[root@docker1 bulid]# docker run -d docker.io/myos:http d9a5402709b26b42cd304c77be442559a5329dc784ec4f6c90e4abac1c88e206 [root@docker1 bulid]# docker inspect d9 [root@docker1 bulid]# curl 172.17.0.7
2.多阶段构建优化
在一些多阶段操作的时候,例如二进制编译安装,可以采用构建分层操作,此操作可以极大减小容器镜像的容量。
案例一:需要编译一个go语言文件并输出
[root@k8s-master01 mnt]# vim main.go //输出为hello的go文件 package main import "fmt" func main() { fmt.Println("helleword") }
上文件需要运行的话,linux需要进行二进制编译,才能运行。
1.不用多阶段构建Dockerfile:
[root@k8s-master01 mnt]# vim Dockerfile FROM golang:1.14.4-alpine //官方提供的go-alpine镜像 WORKDIR /opt //工作目录 COPY main.go /opt //复制本地刚写的main.go到容器的/opt下 RUN go build /opt/main.go //对go文件进行二进制编译 CMD "./main" //输出编译后的文件
测试其是否能运行,发现其能正常运行。
[root@k8s-master01 mnt]# docker run -it --rm go:hello sh //加--rm可以使用后docker会自动清理空间 /opt # ls main main.go /opt # ./main hellword
看看镜像大小:发现其为372M
[root@k8s-master01 mnt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE go hello 04d6796b430d 4 minutes ago 372MB
2.多阶段构建Dockerfile:
只编译一个文件就有372M镜像,太占用资源了,所以可以使用docker多阶段来构建:
[root@k8s-master01 mnt]# vim Dockerfile FROM golang:1.14.4-alpine as builder //前面编译和之前一样,加上as builder用于第二层镜像引用。 WORKDIR /opt COPY main.go /opt RUN go build /opt/main.go CMD "./main" # create real app image FROM alpine:3.8 //alpine:3.8 为空镜像 COPY --from=builder /opt/main / //调用上一层的builder镜像编译到的main文件复制到目标路径中 CMD "./opt/main" //输出结果
测试结果,发现第二次多阶段构建的镜像只有6.48M,极大的减少了容量。
[root@k8s-master01 mnt]# docker build -t go:hello2 . ... [root@k8s-master01 mnt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE go hello2 ad17c75aed1b 39 seconds ago 6.48MB go hello 04d6796b430d 19 minutes ago 372MB [root@k8s-master01 mnt]# docker run -it --rm go:hello2 sh / # ls bin dev etc home lib main media mnt proc root run sbin / # ./main hellword //输出helloword无误