dockerfile

112 阅读3分钟

Dockerfile 指令

FROM centos:7.9.2009  
#在整个dockfile文件中除了注释之外的第一行,要是FROM ,FROM 指令当前镜像的用于指定父镜像(base image)

ADD [--chown=<user>:<group>] <src>... <dest> #用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,会自动解压tar.gz格式的压缩包,但不会自动解压zip包

MAINTAINER #(镜像的维护者信息,目前已经不推荐使用) LABEL “key”=“value” #设置镜像的属性标签

COPY COPY [--chown=<user>:<group>] <src>... <dest> #用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,不会解压任何压缩包

ENV MY_NAME="John Doe" #设置容器环境变量  
USER <user>[:<group>] or USER <UID>[:<GID>] #指定运行操作的用户

RUN yum install vim unzip -y && cd /etc/nginx #执行shell命令,但是一定要以非交互式的方式执行 VOLUME ["/data/data1","/data/data2"] #定义volume  
WORKDIR /data/data1 #用于定义当前工作目录

EXPOSE <port> [<port>/<protocol>...] #声明要把容器的某些端口映射到宿主机

关于CMD与entrypoint

CMD有以上三种方式定义容器启动时所默认执行的命令或脚本

CMD ["executable","param1","param2"] (exec form, this is the preferred form) #推荐的可执行程序方式 

CMD ["param1","param2"] (as default parameters to ENTRYPOINT) #作为ENTRYPOINT默认参数  

CMD command param1 param2 (shell form) #基于shell命令的  

如:基于CMD #镜像启动为一个容器时候的默认命令或脚本,
 CMD ["/bin/bash"]

ENTRYPOINT

也可以用于定义容器在启动时候默认执行的命令或者脚本,如果是和CMD命令混合使用的时候,会将CMD的命令当做参数传递给

ENTRYPOINT后面的脚本,可以在脚本中对参数做判断并相应的容器初始化操作。

## 案例1:
ENTRYPOINT ["top", "-b"] CMD ["-c"]

## 等于如下一行:  
ENTRYPOINT ["top", "-b", "-c"]

## 案例2:  #定义一个入口点脚本,并传递mysqld 参数 
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["mysqld"]  

## 等于如下一行:  
ENTRYPOINT ["docker-entrypoint.sh","mysqld"]

## 使用总结:  
ENTRYPOINT(脚本) + CMD(当做参数传递给ENTRYPOINT)

使用总结: ENTRYPOINT(脚本) + CMD(当做参数传递给ENTRYPOINT)

demo

FROM ubuntu:22.04  

# ADD sources.list /etc/apt/sources.list

RUN apt update && apt install -y iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev

zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet tracerou  
te iotop unzip zip make

ADD nginx-1.22.0.tar.gz /usr/local/src/  
RUN cd /usr/local/src/nginx-1.22.0 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/bin RUN groupadd -g 2088 nginx && useradd -g nginx -s /usr/sbin/nologin -u 2088 nginx && chown -R nginx.nginx /apps/nginx  
ADD nginx.conf /apps/nginx/conf/  
ADD frontend.tar.gz /apps/nginx/html/

EXPOSE 80 443  
#ENTRYPOINT ["nginx"]  
CMD ["nginx","-g","daemon off;"]

构建

docker build -t test/myapp .

docker images

创建镜像

业务规划及镜像分层构建

设计原则

  • 构建base镜像 (构建 基于官方镜像 自定义的基础镜像(空环境))
  • Nginx 基础镜像构建 (JDK go python等环境)
  • Nginx 业务镜像构建 (组装业务)
  • 在kubernetes业务测试环境运行nginx容器并测试
  • 在kubernetes业务生产环境运行nginx容器并测试

业务镜像规划设计

image.png