首页 > 其他分享 >二. Dockerfile构建镜像参数详解、Docker镜像分层构建案例 -1

二. Dockerfile构建镜像参数详解、Docker镜像分层构建案例 -1

时间:2022-11-27 13:46:02浏览次数:44  
标签:CMD gz nginx 构建 ENTRYPOINT 镜像 Docker docker

镜像简介:
  docker镜像基于union file system将多个目录合并挂载至一个目录给容器使用。
docker镜像只有rootfs而没有内核、运行使用的是宿主机的bootfs。
   rootfs(root file system),文件系统
   bootfs(boot file system),主要包含 bootloader 和 Kernel
一个镜像是有一层或者多层合并而成,每一层称为是一个layer。
镜像可以基于其它镜像进行重新构建,被引用的镜像称为父镜像。
一个镜像可以同时被创建为多个容器。
镜像是只读的,在容器的任何更改都不会直接修改镜像。
FROM centos:7.9.2009
#在整个dockfile文件中除了注释之外的第一行,要是FROM指令,FROM 指令用于指定当前镜像(base image)引用的父镜像(parent image)
MAINTAINER #(镜像的维护者信息,目前已经不推荐使用)
LABEL “key”=“value” #设置镜像的属性标签
LABEL author="jack [email protected]"
LABEL version="1.0"
ADD [--chown=<user>:<group>] <src>... <dest>
#用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,会自动解压tar.gz格式的压缩包,但不会自动解压zip包
ADD --chown=root:root test /opt/test
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:
ENTRYPOINT ["docker-entrypoint.sh"] #定义一个入口点脚本,并传递mysqld 参数
CMD ["mysqld"]
等于如下一行:
ENTRYPOINT ["docker-entrypoint.sh","mysqld"]
 使用总结:
ENTRYPOINT(脚本) + CMD(当做参数传递给ENTRYPOINT)

例一: 基于ubuntu 构建Nginx镜像
Dockerfile  docker-entrypoint.sh  frontend.tar.gz  nginx-1.22.1.tar.gz  nginx.conf  sources.list

root@docker-server1:/usr/local/src/dockerfile/nginx-ubuntu# cat Dockerfile
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 traceroute iotop unzip zip make

ADD nginx-1.22.1.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.22.1 && ./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 ["/apps/nginx/sbin/nginx","-g","daemon off;"]

##
#ENTRYPOINT ["/apps/nginx/sbin/nginx","-g","daemon off;"]

##
#ENTRYPOINT ["/apps/nginx/sbin/nginx"]

#CMD ["-g","daemon off;"]
##

COPY docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod a+x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]


root@docker-server1:/usr/local/src/dockerfile/nginx-ubuntu# cat docker-entrypoint.sh
#!/bin/bash

/apps/nginx/sbin/nginx  -g "daemon off;"

root@docker-server1:/usr/local/src/dockerfile/nginx-ubuntu# cat nginx.conf



events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

upstream tomcat {
  server 192.168.106.131:8080;
  server 192.168.106.132:8080;
}
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }


        location /myapp {
           proxy_pass http://tomcat;
        }
        
docker build -t  harbor.xxx.com/nginx:v1 .


业务规划及镜像分层构建:
系统base 镜像构建  system-base
Nginx 基础镜像构建 nginx-base
Nginx业务镜像构建  nginx-web1
在kubernetes业务测试环境运行nginx容器并测试
在kubernetes业务生产环境运行nginx容器并测试

nginx-ubuntu 完整镜像
system-base-->nginx-base-->nginx-web1  分层构建
root@docker-server1:/usr/local/src/dockerfile# tree -L 3
.
├── nginx-base
│   ├── Dockerfile
│   └── nginx-1.22.1.tar.gz
├── nginx-ubuntu
│   ├── Dockerfile
│   ├── docker-entrypoint.sh
│   ├── frontend.tar.gz
│   ├── nginx-1.22.1.tar.gz
│   ├── nginx.conf
│   └── sources.list
├── nginx-web1
│   ├── Dockerfile
│   ├── build-command.sh
│   ├── frontend.tar.gz
│   └── nginx.conf
├── system-base
│   └── Dockerfile

标签:CMD,gz,nginx,构建,ENTRYPOINT,镜像,Docker,docker
From: https://www.cnblogs.com/pang-lu/p/16929534.html

相关文章