统信服务器操作系统V20 1070e 【dockerfile 构建镜像】

2024-07-04 11:23:17 浏览数 (2)

dockerFile

dockerFile 是一个文本文件,它包含了一系列的指令,这些指令用于自动化构建 docker 镜像的过程。docker 镜像是只读模板,可以用来创建 docker 容器的实例。dockerfile 使得开发者可以定义一个镜像的构建过程,而这个镜像可以被用来批量部署应用程序和服务。

images镜像构建流程图

dockerFile特点

  • 每个指令都必须是大写
  • 执行顺序是从上到下顺序执行
  • # 表示注释
  • 每个指令都会创建提交一个新的镜层,并提交(每个指令都是一个docker commit)
  • dockerFile是面向开发人员的;由开发人员构建镜像,就需要写dockerFile文件,然后将镜像交付给运维直接部署即可;不需要运维配置繁杂的j参数命令;

dickerFile指令介绍

使用dockerFile构建镜像,实际上就是用脚本文件的方式创建

dockerFile参数

代码语言:javascript复制
FROM         指定基础镜像
MAINTAINER   指定作者,一般都是姓名   邮箱
LABEL        指定标签信息
USER         设置容器运行时的用户
RUN          在build过程要运行的命令(例如 yum install xxxx)
ADD          添加文件到镜像中,如果.tar.gz文件的话, 会自动解压
COPY         类似ADD,将文件拷贝到镜像,不会解压压缩文件
ENV          设置环境变量
VOLUME       设置文件挂载,默认是匿名挂载
EXPOSE       暴露端口,指定容器运行时开放的端口 
CMD          容器运行时要执行的命令(在容器内运行的命令),可用来运行默认要运行的程序,只有最后一个CMD才会运行,且只运行一次
ENTRYPOINT   和CMD一样,但可以追加命令;ONBIUILD     当构建一个被继承dockerFile,会运行ONBUILD 指令,属于触发指令
WORKDIR      指定工作目录,也就是登陆后默认进去的目录;

dockerFile指令用法

FROM

 FROM <image>

MAINTAINER

MAINTAINER kevin<xxx@163.com>

USER

指定用户运行,默认使用root用户,在docker run 中可以通过 -u 选项来覆盖USER指令的设置。如果不是内置帐户,则必须首先创建该用户;

USER root

RUN

RUN功能为运行指定的命令,RUN命令有两种格式

代码语言:javascript复制
RUN <command>RUN ["executable", "param1", "param2"]

第一种后边直接跟shell命令

  • 在linux操作系统上默认 /bin/sh -c
  • 在windows操作系统上默认 cmd /S /C

第二种是类似于函数调用

可将executable理解成为可执行文件,后面就是两个参数。

两种写法比对:

  • RUN /bin/bash -c 'source HOME/.bashrc; echo HOME'
  • RUN ["/bin/bash", "-c", "echo hello"]

注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.

多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。

ENV

环境变量可以随便设置,MYPATH为key ,/user/local是值

ENV MYPATH /user/local

EXPOSE

开放单个端口

EXPOSE <port>[<port>...]

开放多个端口

EXPOSE 22 80 8080

ADD

file 宿主机的文件名称/home/app 镜像的目录

ADD file /home/app

COPY

用法与ADD一致,区别是COPY指令不会解压文件

COPY file /root/home

CMD

容器内运行命令,只能运行一个命令

第一种用法

CMD echo 11

第二种用法

CMD ["echo","33"]

ENTRYPOINT

容器内运行命令,用法和CMD一致,区别是可以运行多个命令,定义多个 ENTRYPOINT 就可以运行多个命令

ENTRYPOINT ["ls","-l"]

ENTRYPOINT ["./start.sh"]

ENTRYPOINT ps -ef | grep tomcat

CMD 和 ENTRYPOINT 的区别

CMD 相同的指令只有最后一个会生效

ENTRYPOINT可以追加命令;

dockerFile构建镜像

系统版本

代码语言:javascript复制
[root@localhost ~]# cat   /etc/os-release 
PRETTY_NAME="UOS Server 20"
NAME="UOS Server 20"
VERSION_ID="20"
VERSION="20"
ID=uos
HOME_URL="https://www.chinauos.com/"
BUG_REPORT_URL="https://bbs.chinauos.com/"
VERSION_CODENAME=fuyu
PLATFORM_ID="platform:uel20"
[root@localhost ~]# uosinfo 
#################################################
Release:  UOS Server release 20 (fuyu)
Kernel :  5.10.0-74.uel20.x86_64
Build  :  UOS Server 20 (1070e) 20240423 amd64
#################################################

docker 版本

代码语言:javascript复制
[root@localhost ~]# docker --version
Docker version 26.1.4, build 5650f9b

下载openEuler 容器镜像

代码语言:javascript复制
wget -P /opt https://repo.openeuler.org/openEuler-24.03-LTS/docker_img/x86_64/openEuler-docker.x86_64.tar.xz

加载openEuler 容器镜像

代码语言:javascript复制
docker load -i /opt/openEuler-docker.x86_64.tar.xz

查看镜像

代码语言:javascript复制
[root@localhost opt]# docker  images
REPOSITORY            TAG       IMAGE ID       CREATED       SIZE
openeuler-24.03-lts   latest    e823457615a1   4 weeks ago   172MB

下载nginx 源码包

代码语言:javascript复制
wget http://nginx.org/download/nginx-1.22.1.tar.gz

创建dockerfile_nginx文件

vim dockerfile_nginx

代码语言:javascript复制
# 基础镜像 
FROM openeuler-24.03-lts:latest
# 维护人员、开发人员
MAINTAINER ZMDZ
# 设置上海时区,即北京时间
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
# 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.22.1.tar.gz /usr/local/
# 安装依赖包
RUN dnf -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
RUN mkdir /usr/local/nginx
WORKDIR /usr/local/nginx-1.22.1
RUN  ./configure --prefix=/usr/local/nginx/ 
        --with-http_ssl_module 
        --with-http_flv_module 
        --with-http_stub_status_module 
        --with-http_gzip_static_module 
        --with-pcre 
        && make 
        && make install

EXPOSE 80 443
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

docker build 构建镜像

代码语言:javascript复制
docker  build  -f dockerfile_nginx -t openeuler24.03-nginx:v1.22.1 .

docker build 参数说明

  • -f 需要构建的脚本文件
  • -t tag的缩写,构建后的镜像名称:版本号

查看镜像

代码语言:javascript复制
[root@localhost ~]# docker images
REPOSITORY                   TAG             IMAGE ID            CREATED            SIZE
openeuler24.03-nginx         v1.22.1        5f65a9b4c9df        9 minutes ago       551MB
openeuler-24.03-lts          latest         e823457615a1        3 weeks ago         172MB

运行nginx容器

代码语言:javascript复制
docker run -d -it --name euler_nginx -p 80:80  -p 443:443 openeuler24.03-nginx:v1.22.1

创建测试文件

代码语言:javascript复制
echo "hello dockerfile" >>docker.html
docker cp  docker.html  euler_nginx:/usr/local/html/

curl访问测试

代码语言:javascript复制
curl  127.0.0.1/docker.html
hello dockerfile

访问容器

代码语言:javascript复制
docker exec  -it  euler_nginx /bin/bash

执行命令

代码语言:javascript复制
docker exec  -it  euler_nginx   pwd
/usr/local/nginx-1.22.1
docker exec  -it  euler_nginx   /bin/bash -c 'pwd'
/usr/local/nginx-1.22.1

镜像保存

docker save 镜像id/镜像名称 -o /本地目录/文件名称

代码语言:javascript复制
docker save openeuler24.03-nginx:v1.22.1 -o /opt/euler_nginx.tar

加载镜像

代码语言:javascript复制
docker load -i /opt/euler_nginx.tar

镜像命名、版本号

使用tag命令对镜像命名和修改版本号

代码语言:javascript复制
docker tag  openeuler24.03-nginx:v1.22.1   euler24.03-nginx:1.22.1

0 人点赞