Docker 镜像制作和管理

2 Docker 镜像制作和管理

2.1 Docker 镜像说明

2.1.1 Docker 镜像中有没有内核

docker run --rm apline uname -r #内核

2.1.2 为什么没有内核

由于容器启动和运行过程中是直接使用了宿主机的内核,不会直接调用物理硬件,所以也不会涉及到硬件驱动,因此也无需容器内拥有自已的内核和驱动。而如果使用虚拟机技术,对应每个虚拟机都有自已独立的内核

2.1.3 容器中的程序后台运行会导致此容器启动后立即退出

Docker容器如果希望启动后能持续运行,就必须有一个能前台持续运行的进程。如果在容器中启动传统的服务,如:httpd,php-fpm等均为后台进程模式运行,就导致 docker 在前台没有运行的应用,这样的容器启动后会立即退出。

对于有一些可能不知道怎么实现前台运行的程序,只需要在你启动的该程序之后添加类似于 tail ,top 这种可以前台运行的程序即可. 比较常用的方法,如 tail -f /etc/hosts 。

2.1.4 docker 镜像生命周期

在这里插入图片描述

2.1.5 制作镜像方式

Docker 镜像制作类似于虚拟机的镜像(模版)制作,即按照公司的实际业务需求将需要安装的软件、相关配置等基础环境配置完成,然后将其做成镜像,最后再批量从镜像批量生成容器实例,这样可以极大的简化相同环境的部署工作

Docker的镜像制作分为手动制作(基于容器)和自动制作(基于DockerFile),企业通常都是基于Dockerfile制作镜像

docker commit #通过修改现有容器,将之手动构建为镜像
docker build  #通过Dockerfile文件,批量构建为镜像

docker commit container —> images run image —>

docker run image —> container

docker exec -it container sh ;apt vim useradd

docker commit container —> image

手工

docler biltd dockerfile ==script

1 镜像启动容器
2 修改容器达到预期的状态,包括:安装工具,用户创建,SELINUX(不开启)
3 基于此容器生成镜像


2.2 将现有容器通过 docker commit 手动构建镜像

2.2.1 基于容器手动制作镜像步骤

docker commit格式

docker commit [OPTIONS] container [repository[:TAG]]

选项
-a, --author string  Author (e.g., "John Hannibal Smith <hannibal@a-
team.com>")
-c, --change list   Apply Dockerfile instruction to the created image
-m, --message string  Commit message
-p, --pause      Pause container during commit (default true)
#说明:
制作镜像和CONTAINER状态无关,停止状态也可以制作镜像
如果没有指定[REPOSITORY[:TAG]],REPOSITORY和TAG都为<none>
提交的时候标记TAG号: 生产当中常用,后期可以根据TAG标记创建不同版本的镜像以及创建不同版本的容器

基于容器手动制作镜像步骤具体如下:
1. 下载一个系统的官方基础镜像,如: CentOS 或 Ubuntu
2. 基于基础镜像启动一个容器,并进入到容器
3. 在容器里面做配置操作
	安装基础命令
	配置运行环境
	安装服务和配置服务
	放业务程序代码
4. 提交为一个新镜像 docker commit
5. 基于自己的的镜像创建容器并测试访问
ls -l    
.  #代表有没有selinux

groupadd -g 88 www
useradd -g www -u 88 -r -s /sbin/nologin -M -d /home/www www
id www

1 镜像启动为容器
2 修改容器达到预期的状态,包括:安装工具,用户创建
yum -y install bash-completion psmisc git  tree net-tools vim lsof iproute
groupadd -g 88 www;useradd -g www -u 88 -r -s /sbin/nologin -M -d /home/www  www


[root@76fe23c12736 yum.repos.d]# yum clean all
34 files removed
[root@76fe23c12736 yum.repos.d]# rm -rf /var/cache/dnf/
AppStream-f798d3786bbf3003/ epel-dc2badbde5a8c7e2/      extras-d8c673ff7b10cc1e/    
BaseOS-40d9a8d4fa58f690/    expired_repos.json          tempfiles.json              
[root@76fe23c12736 yum.repos.d]# rm -rf /var/cache/dnf/


3 基于此容器生成镜像

 docker commit 
 
 cat /etc/os-release
 docker commit rocky rockylinux:v8.5-2022-07-04
 
 #清理垃圾文件
 yum clean all
 
 rm -rf /var/cache/dnf/*
 
 可以重名,imagesID 不同,更新上面的
 
 

2.3 利用 DockerFile 文件执行 docker build 自动构建镜像

2.3.1 Dockfile 使用详解

2.3.1.1 Dockerfile 介绍

DockerFile 是一种被Docker程序解释执行的脚本,由一条条的命令组成的,每条命令对应linux下面的一条命令,Docker程序将这些DockerFile指令再翻译成真正的linux命令,其有自己的书写方式和支持的命令,Docker程序读取DockerFile并根据指令生成Docker镜像,相比手动制作镜像的方式,

DockerFile

更能直观的展示镜像是怎么产生的,有了DockerFile,当后期有额外的需求时,只要在之前的DockerFile添加或者修改响应的命令即可重新生成新的Docker镜像,避免了重复手动制作镜像的麻烦,类似与shell脚本一样,可以方便高效的制作镜像

Docker守护程序 Dockerfile 逐一运行指令,如有必要,将每个指令的结果提交到新镜像,然后最终输出新镜像的ID。Docker守护程序将自动清理之前发送的上下文

2.3.1.3 Dockerfile文件的制作镜像的分层结构

在这里插入图片描述

mkdir
#按照业务类型或系统类型等方式划分创建目录环境,方便后期镜像比较多的时候进行分类

建立文件夹
mkdir 
mkdir /data/dockerfile/{web/{nginx,apache,tomcat,jdk},system/{centos,rocky,ubuntu,alpine,debian}} -p
root@ubuntu2004:~# tree /data/dockerfile/
/data/dockerfile/
├── {
├── system
│   ├── alpine
│   ├── centos
│   ├── debian
│   ├── rocky
│   └── ubuntu
└── web
    ├── apache
    ├── jdk
    ├── nginx
    └── tomcat


2.3.1.4 Dockerfile 文件格式

Dockerfile 是一个有特定语法格式的文本文件

dockerfile 官方说明: https://docs.docker.com/engine/reference/builder/

from #继承者们
run  #shell command
add  #宿主机加到镜像 (应用配置文件)
workdir 
volume  #持久化保存
expose  #端口映射
run      #进程运行
cmd       #进程运行

Dockerfile 文件说明

  • 每一行以Dockerfile的指令开头,指令不区分大小写,但是惯例使用大写
  • 使用 # 开始作为注释
  • 每一行只支持一条指令,每条指令可以携带多个参数
  • 指令按文件的顺序从上至下进行执行
  • 每个指令的执行会生成一个新的镜像层,为了减少分层和镜像大小,尽可能将多条指令合并成一条指令
  • 制作镜像一般可能需要反复多次,每次执行dockfile都按顺序执行,从头开始,已经执行过的指令已经缓存,不需要再执行,如果后续有一行新的指令没执行过,其往后的指令将会重新执行,所以为加速镜像制作,将最常变化的内容放下dockerfile的文件的后
2.3.1.5 Dockerfile 相关指令

在这里插入图片描述

2.3.1.5.1 FROM: 指定基础镜像

from Rocky

定制镜像,需要先有一个基础镜像,在这个基础镜像上进行定制。

FROM 就是指定基础镜像,此指令通常必需放在Dockerfile文件第一个非注释行。后续的指令都是运行于此基准镜像所提供的运行环境

基础镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry上拉取所需的镜像文件.如果找不到指定的镜像文件,docker build会返回一个错误信息

FROM rockylinuc:8.5.20220308




docker push [options] NAME[:tag]

FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
#说明: 
--platform 指定镜像的平台,比如: linux/amd64, linux/arm64, or windows/amd64
tag 和 digest是可选项,如果不指定,默认为latest


FROM scratch    #空镜像,名义上的镜像。所有镜像的起源
该镜像是一个空的镜像,可以用于构建busybox等超小镜像,可以说是真正的从零开始构建属于自己的镜像
该镜像在构建基础镜像(例如debian和busybox)或超最小镜像(仅包含一个二进制文件及其所需内容,例
如:hello-world)的上下文中最有用

2.3.1.5.2 LABEL: 指定镜像元数据

可以指定镜像元数据,如: 镜像作者等

FROM
LABEL author=m49
LABEL version=v1.0
LABEL maintainer=""
LABEL multi.description="test" mult.date= ""
一个镜像可以有多个label ,还可以写在一行中,即多标签写法,可以减少镜像的的大小
COPY base.repo  /etc/yum.repos.d/

RUN yum clean all && \
	yum -y install    bash-comletion psmisc        #减少层数
	rm -rf /var/cache/dnf/* &&\
	group add



/etc/localtime  -----------
rm -f /etc/localtime && \
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 


制作rocky的镜像

FROM rocklinux:8.5.20220308
LABEL author=ehuo
LABEL version=v1.0
LABEL multi.description="test" multi.date="2022-07-04" multi,class="m49"

RUN rm -f /etc/yum.repos.d/*
COPY base.repo /etc/yum.repos.d/
RUN   yum clean all && \
      yum -y install bash-completion psmisc git  tree net-tools vim lsof iproute && \
      rm -rf /var/cache/dnf/* && \
      groupadd -g 88 www && \                                                                                      
      useradd -g www -u 88 -r -s /sbin/nologin -M -d /home/www www && \
      rm -f /etc/localtime && \
      ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

2.3.1.5.5 COPY: 复制文本
COPY 宿主机   镜像
如果目标文件夹 不存在 会自动创建
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] #路径中有空白字符时,建议使用此格式

范例:
COPY base.repo /etc/yum.repos.d/
  • 可以是多个,可以使用通配符,通配符规则满足Go的filepath.Match 规则
  • 必须是build上下文中的路径(为 Dockerfile 所在目录的相对路径),不能是其父目录中的文件
  • 如果是目录,则其内部文件或子目录会被递归复制,但目录自身不会被复制
  • 如果指定了多个, 或在中使用了通配符,则必须是一个目 录,且必须以 / 结尾
  • 可以是绝对路径或者是 WORKDIR 指定的相对路径
  • 使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等
  • 如果事先不存在,它将会被自动创建,这包括其父目录路径,即递归创建目录
ENV :设置环境变量

ENV 可以定义环境变量和值,会被后续指令(如:ENV,ADD,COPY,RUN等)通过 K E Y 或 KEY或 KEY{KEY}进行引用,并在容器运行时保持

ENV OS_VERSION=rockylinux:8.5

#变量赋值格式1
ENV <key> <value>  #此格式只能对一个key赋值,<key>之后的所有内容均会被视作其<value>的组成
部分
#变量赋值格式2
ENV <key1>=<value1> <key2>=<value2> \  #此格式可以支持多个key赋值,定义多个变量建议使用,
减少镜像层
<key3>=<value3> ...
#如果<value>中包含空格,可以以反斜线\进行转义,也可通过对<value>加引号进行标识;另外,反斜线也
可用于续行
#只使用一次变量
RUN <key>=<value> <command>
 
#引用变量
RUN $key .....
#变量支持高级赋值格式
${key:-word}
${kye:+word

如果运行容器时如果需要修改变量,可以执行下面通过基于 exec 机制实现

注意: 下面方式只影响容器运行时环境,而不影响构建镜像的过程,即只能覆盖docker run时的环境变量,而不会影响docker build时环境变量的值

docker run -e | --env <key>=vlaue
#说明
-e, --env list  #Set environment variables
  --env-file filename   #Read in a file of environment variables
  
 

ADD

2.3.1.5.6 ADD: 复制和解包文件

该命令可认为是增强版的COPY,不仅支持COPY,还支持自动解压缩。可以将复制指定的 到容器中的

说明:

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
----------------------------------------------------------
ADD  增加了自动解压缩
ADD nginx.tar.gz /
  • 可以是Dockerfile所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)
  • 可以是绝对路径或者是 WORKDIR 指定的相对路径
  • 如果是目录,只复制目录中的内容,而非目录本身
  • 如果是一个 URL ,下载后的文件权限自动设置为 600
  • 如果为URL且不以/结尾,则指定的文件将被下载并直接被创建为,如果以 / 结尾,则文件名URL指定的文件将被直接下载并保存为/< filename>
  • 如果是一个本地文件系统上的打包文件,如: gz, bz2 ,xz ,它将被解包 ,其行为类似于"tar -x"命令,但是通过URL获取到的tar文件将不会自动展开
  • 如果有多个,或其间接或直接使用了通配符,则必须是一个以/结尾的目录路径;如果不以/结尾,则其被视作一个普通文件,的内容将被直接写入到
2.3.1.5.7 CMD: 容器启动命令

CMD :容器启动命令
在这里插入图片描述

一个容器中需要持续运行的进程一般只有一个,CMD 用来指定启动容器时默认执行的一个命令,且其运
行结束后,容器也会停止,所以一般CMD 指定的命令为持续运行且为前台命令.

前面介绍过的 RUN 命令是在构建镜像时执行的命令,注意二者的不同之处

  • 每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行
  • 如果用户启动容器时用 docker run xxx 指定运行的命令,则会覆盖 CMD 指定的命令
CMD tail -f /etc/hosts

CMD ["/bin/tail","-f","/etc/hosts"]   #全路径下  ,不支持变量

CMD 一个生效
# 使用 exec 执行,推荐方式,第一个参数必须是命令的全路径,此种形式不支持环境变量
CMD ["executable","param1","param2"]
# 在 /bin/sh 中执行,提供给需要交互的应用;此种形式支持环境变量
CMD command param1 param2
# 提供给 ENTRYPOINT 命令的默认参数
CMD ["param1","param2"]

CMD ["nginx","-g","daemon off;"] #全局配置
docker build -t rockylinux:8.5-20220722 .

2.3.1.5.8 ENTRYPOINT: 入口点

功能类似于CMD,配置容器启动后执行的命令及参数

ENTRYPOINT

CMD 的命令沦为entrypoint 的参数

exec "$@"  #所有的参数
exec #替换命令,继承程序,

# 使用 exec 执行
ENTRYPOINT ["executable", "param1", "param2"...]

# shell中执行
ENTRYPOINT command param1 param2

作用:实现指定环境变量动态生成配置文件内容

高级shell变量赋值

NAME=ehuo
echo ${NAME:-"M49"}

容器的启动不退出

实现前台任务的执行  ,容器就不用退出

范例: 利用脚本实现指定环境变量动态生成配置文件内容

[root@centos nginx]# cat Dockerfile
FROM nginx:1.22.0
LABEL maintainer="ehuo <root@ehuo.com>"
ENV DOC_ROOT='/data/website/'
ADD index.html ${DOC_ROOT}
ADD entrypoint.sh /bin/
EXPOSE 80

#HEALTHCHECK --start-period=3s CMD wget -0 - -q http://${IP:-0.0.0.0}:{PORT:-80}/

CMD ["/usr/sbin/nginx","-g", "daemon off;"]
ENTRYPOINT [ "/bin/entrypoint.sh"]  /usr/sbin/nginx","-g", "daemon off;"]

[root@centos nginx]# cat entrypoint.sh
#!/bin/bash
#
#**********************************************************************************************
#Author:        ehuo
#QQ:            787152176
#Date:          2022-07-06
#FileName:      entrypoint.sh
#URL:           787152176@qq.com
#Description:   The test script
#Copyright (C): 2022 All rights reserved
#*********************************************************************************************
cat > /etc/nginx/conf.d/www.conf <<EOF
server {
    server_name ${HOSTNAME};
        listen ${IP:-0.0.0.0}:${PORT:-80};
            root   ${DOC_ROOT:-/usr/share/nginx/html};
}
EOF
exec "$@"

chmod +x entrypoint.sh
docker  build -t nginx:v1.0 .
docker run --name n1 --rm -P -e "PORT=8080" -e "HOSTNAME=www.ehuo.org" nginx:v1.0



2.3.1.5.11 VOLUME: 匿名卷

VOLUME:匿名卷

在容器中创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等,默认会将宿主机上的目录挂载至VOLUME 指令指定的容器目录。即使容器后期被删除,此宿主机的目录仍会保留,从而实现容器数据的持久保存。

docker rm -fv <容器ID>可以

VOLUME <容器内路径>
VOLUME ["<容器内路径1>", "<容器内路径2>"...]
 
注意:
<容器内路径>如果在容器内不存在,在创建容器时会自动创建
<容器内路径>如果是存在的,同时目录内有内容,将会把此目录的内容复制到宿主机的实际目录

注意:

  • Dockerfile中的VOLUME实现的是匿名数据卷,无法指定宿主机路径和容器目录的挂载关系
  • 通过docker rm -fv <容器ID> 可以删除容器的同时删除VOLUME指定的卷
2.3.1.5.12 EXPOSE: 暴露端口

指定服务端的容器需要对外暴露(监听)的端口号,以实现容器与外部通信。

EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会真正暴露端口,即不会自动在宿主进行端口映射因此,在启动容器时需要通过 -P 或 -p ,Docker 主机才会真正分配一个端口转发到指定暴露的端口才可使用

**注意: 即使 Dockerfile 没有 EXPOSE 端口指令,也可以通过docker run -p 临时暴露容器内程序真正监听的端口,**所以EXPOSE 相当于指定默认的暴露端口,可以通过docker run -P 进行真正暴露

EXPOSE <port>[/ <protocol>] [<port>[/ <protocol>] ..]
 
#说明
<protocol>用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议
2.3.1.5.13 WORKDIR: 指定工作目录

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内WORKDIR指定的默认目录

WORKDIR 指定工作目录(或称当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会自行创建

WORKDIR /path/to/workdir

#两次RUN独立运行,不在同一个目录
RUN cd /app
RUN echo "hello" > world.txt
#如果想实现相同目录可以使用WORKDIR
WORKDIR /app
RUN echo "hello" > world.txt
2.3.1.5.14 ONBUILD: 子镜像引用父镜像的指令

可以用来配置当构建当前镜像的子镜像时,会自动触发执行的指令,但在当前镜像构建时,并不会执行,即延迟到子镜像构建时才执行

2.3.1.5.15 USER: 指定当前用户

指定运行容器的用户名或 UID,在后续dockerfile中的 RUN ,CMD和ENTRYPOINT指令时使用此用户

当服务不需要管理员权限时,可以通过该命令指定运行用户

这个用户必须是事先建立好的,否则无法切换

如果没有指定 USER,默认是 root 身份执行

USER <user>[:<group>]
USER <UID>[:<GID>]
范例
RUN groupadd -r mysql && useradd -r -g mysql mysql
USER mysql
2.3.1.5.18 Dockerfile 构建过程和指令总结
  • Dockerfile 构建过程
  • 从基础镜像运行一个容器
  • 执行一条指令,对容器做出修改
  • 执行类似docker commit的操作,提交一个新的中间镜像层(可以利用中间层镜像创建容器进行调试和排错)
  • 再基于刚提交的镜像运行一个新容器
  • 执行Dockerfile中的下一条指令,直至所有指令执行完毕

Dockerfile 指令总结

在这里插入图片描述

2.3.1.6 构建镜像docker build 命令

docker build命令使用Dockerfile文件创建镜像

docker build [OPTIONS] PATH | URL | -
说明: 
PATH | URL | -   #可以使是本地路径,也可以是URL路径。若设置为 - ,则从标准输入获取Dockerfile的内容
-f, --file string  #Dockerfile文件名,默认为 PATH/Dockerfile
--force-rm  #总是删除中间层容器,创建镜像失败时,删除临时容器
--no-cache  #不使用之前构建中创建的缓存
-q  --quiet=false  #不显示Dockerfile的RUN运行的输出结果
--rm=true  #创建镜像成功时,删除临时容器
-t --tag list  #设置注册名称、镜像名称、标签。格式为 <注册名称>/<镜像名称>:<标签>(标签默认为latest)

例
docker build .
docker build /usr/local/src/nginx
docker build -f /path/to/a/Dockerfile .
docker build -t shykes/myapp .
docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
docker build -t test/myapp .
docker build -t nginx:v1 /usr/local/src/nginx


docker history 镜像ID#查看镜像的构建历史:

nginx ✨✨✔✔ 不变的往前放,变化的往后面;

docker run --name n1 nginx:1.22.0-20220706
dcoker exec -it n1 bash

ls /etc/nginx/conf.d/

nginx -g daemon off; 前台执行

[root@centos nginx]# docker run --name n1 nginx:v1
2022/07/06 15:04:40 [notice] 1#1: using the "epoll" event method
2022/07/06 15:04:40 [notice] 1#1: nginx/1.22.0
2022/07/06 15:04:40 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2022/07/06 15:04:40 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64
2022/07/06 15:04:40 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2022/07/06 15:04:40 [notice] 1#1: start worker processes
2022/07/06 15:04:40 [notice] 1#1: start worker process 8
2022/07/06 15:04:40 [notice] 1#1: start worker process 9

rocky镜像的制作


----------------------------------------------------------------------------------------------------
[root@centos rocky]# cat Dockerfile
FROM rockylinux:8.5.20220308
LABEL maintainer="wangxiaochun <root@wangxiaochun.com>"
LABEL version=v1.0
LABEL multi.description="test" multi.date="2022-07-4" multi.class="M49"
ENV OS_VERSION=rockylinux:8.5
RUN  rm -f /etc/yum.repos.d/* 
COPY base.repo /etc/yum.repos.d/
RUN  yum clean all &&  \
     rm -f  /etc/localtime && \
     ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ 
     yum -y install  procps-ng  bash-completion psmisc git  tree net-tools vim lsof iproute  &&  \
     rm -rf /var/cache/dnf/* && \
     groupadd -g 88 www && \
     useradd -g www -u 88 -r -s /sbin/nologin -M -d /home/www  www 
#CMD  tail -f /etc/hosts
CMD ["/bin/tail","-f","/etc/hosts"]   

----------------------------------------------------------------------------------------------------

[root@centos rocky]# cat base.repo
[BaseOS]
name=BaseOS
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/x86_64/os/
        http://mirrors.163.com/rocky/$releasever/BaseOS/x86_64/os/
        https://mirrors.nju.edu.cn/rocky/$releasever/BaseOS/x86_64/os/
        https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/BaseOS/x86_64/os/
        http://mirrors.sdu.edu.cn/rocky/$releasever/BaseOS/x86_64/os/       
gpgcheck=0

[AppStream]
name=AppStream
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/AppStream/x86_64/os/
        http://mirrors.163.com/rocky/$releasever/AppStream/x86_64/os/
        https://mirrors.nju.edu.cn/rocky/$releasever/AppStream/x86_64/os/
        https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/AppStream/x86_64/os/
        http://mirrors.sdu.edu.cn/rocky/$releasever/AppStream/x86_64/os/
gpgcheck=0

[extras]
name=extras
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/extras/$basearch/os
        http://mirrors.163.com/rocky/$releasever/extras/$basearch/os
        https://mirrors.nju.edu.cn/rocky/$releasever/extras/$basearch/os
        https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/extras/$basearch/os
        http://mirrors.sdu.edu.cn/rocky/$releasever/extras/$basearch/os 
       
gpgcheck=0
enabled=1

[PowerTools]
name=CentOS-$releasever - PowerTools
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/PowerTools/$basearch/os/
        http://mirrors.163.com/rocky/$releasever/PowerTools/$basearch/os/
        http://mirrors.sdu.edu.cn/rocky/$releasever/PowerTools/$basearch/os/
        https://mirrors.sjtug.sjtu.edu.cn/rocky/$releasever/PowerTools/$basearch/os/
        http://mirrors.sdu.edu.cn/rocky/$releasever/PowerTools/$basearch/os/
gpgcheck=0
enabled=0


[epel]
name=EPEL
baseurl=https://mirror.tuna.tsinghua.edu.cn/epel/$releasever/Everything/$basearch
        https://mirrors.cloud.tencent.com/epel/$releasever/Everything/$basearch
        https://mirrors.huaweicloud.com/epel/$releasever/Everything/$basearch
        https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
gpgcheck=0
enabled=1


基于rocky8.5上制作nginx的镜像

--------------------------------------------------------------------------------------------------
docker run -d -P --name nginx-v2 nginx:1.22.0-20220707 #启动容器前台执行
docker exec -it nginx-v2 bash #进入容器
docker inspect nginx-v2 #容器的详细设置



--------------------------------------------------------------------------------------------------
[root@centos nginx2]# cat Dockerfile
FROM rocky:v1
LABEL author=ehuo
ENV NGINX_VERSION=1.22.0
ADD nginx-${NGINX_VERSION}.tar.gz /usr/local
RUN yum -y install gcc make gcc-c++ libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel && \
    rm -rf /var/cache/dnf/* && \
    cd /usr/local/nginx-${NGINX_VERSION} && \
    ./configure --prefix=/apps/nginx && \
    make && make install && \
    rm -rf /usr/local/nginx*
COPY nginx.conf /apps/nginx/conf/
VOLUME ["/data/html"]
EXPOSE 80
CMD /apps/nginx/sbin/nginx -g "daemon off;"
COPY *.html /data/html/

[root@centos nginx2]# cat nginx.conf
user  www;
worker_processes  auto;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

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

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

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

}



工作时候的逻辑制作镜像

1 开发提交代码 gitlab 
2 下载源码
3 maven --> war,jar
4 Dockerfile COPY war.jar --> 镜像
5 build 
6 push harbor
7 pull 
8 docker run 

ion
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

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


# HTTPS server
#
#server {
#    listen       443 ssl;
#    server_name  localhost;

#    ssl_certificate      cert.pem;
#    ssl_certificate_key  cert.key;

#    ssl_session_cache    shared:SSL:1m;
#    ssl_session_timeout  5m;

#    ssl_ciphers  HIGH:!aNULL:!MD5;
#    ssl_prefer_server_ciphers  on;

#    location / {
#        root   html;
#        index  index.html index.htm;
#    }
#}
}
**工作时候的逻辑制作镜像**

```powershell
1 开发提交代码 gitlab 
2 下载源码
3 maven --> war,jar
4 Dockerfile COPY war.jar --> 镜像
5 build 
6 push harbor
7 pull 
8 docker run 





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ehuo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值