镜像简介:
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