自定义镜像-Dockerfile

简介:自定义镜像:(给一镜像盖楼)

[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无误
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇