• Day03-数据卷与Dockerfile


    a)案例17:挂载代码目录,配置文件目录

    • 用数据卷挂载:代码目录

    • 用数据卷挂载:配置文件,配置文件目录

    • 用数据卷挂载:数据目录(数据库)

    • 还可以用于日志

    nginx:alpine镜像
    配置文件子: /app/docker/restart/conf/nginx/conf.d/ /etc/nginx/conf.d/ 
    配置文件主: /app/docker/restart/conf/nginx/nginx.conf /etc/nginx/nginx.conf
    站点目录:   /app/docker/restart/code/  /app/code/restart/
    
    mkdir  -p /app/docker/conf/nginx/conf.d/ /app/docker/code/restart/
    
    docker run -d --name "oldboy_restart_volume_v1" -p 80:80 \
    -v /app/docker/restart/conf/nginx/conf.d/:/etc/nginx/conf.d/ \
    -v /app/docker/restart/conf/nginx/nginx.conf:/etc/nginx/nginx.conf \
    -v /app/docker/restart/code/:/app/code/restart/ \
    --restart=always \
    nginx:alpine
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 修改了配置文件 增加js,css缓存功能
    server {
       listen      80;
       listen [::]:80;
       server_name localhost;
       location / {
           root   /usr/share/nginx/html;
           index index.html index.htm;
       }
       error_page   500 502 503 504 /50x.html;
       location = /50x.html {
           root   /usr/share/nginx/html;
       }
       location ~* \.(js|css)$ {
         expires 30d;
         }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    b)案例18: 创建数据卷空间

    • 应用场景:只关注容器中的数据不丢,不关注数据具体放在哪里
    1. 创建数据卷
    docker volume create oldboylogdata
    oldboylogdata
    [root@docker01 ~]# docker volume create oldboy_data
    oldboy_data
    
    2. 查看数据卷
    [root@docker01 ~]# ll /var/lib/docker/volumes/
    总用量 24
    brw------- 1 root root  8, 3 2024-04-18 08:27 backingFsBlockDev
    -rw------- 1 root root 32768 2024-04-18 09:04 metadata.db
    drwx-----x 3 root root    19 2024-04-18 09:04 oldboy_data
    [root@docker01 ~]# ll /var/lib/docker/volumes/oldboy_data/
    总用量 0
    drwxr-xr-x 2 root root 6 2024-04-18 09:04 _data
    [root@docker01 ~]# docker volume ls
    DRIVER    VOLUME NAME
    local     oldboy_data
    
    3. 挂载数据卷
    [root@docker01 ~]# docker run -d --name "oldboy_volume_space" -v oldboy_data:/var/log/nginx/ nginx:alpine
    811963109e713eab0066ab9e359741a6bd728372e643d8ca4230b4c38585cdde
    [root@docker01 ~]# ll /var/lib/docker/volumes/oldboy_data/_data/
    总用量 0
    lrwxrwxrwx 1 root root 11 2021-12-30 03:29 access.log -> /dev/stdout
    lrwxrwxrwx 1 root root 11 2021-12-30 03:29 error.log -> /dev/stderr
    
    [root@docker01 ~]# docker logs oldboy_volume_space 
    /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    /docker-entrypoint.sh: Configuration complete; ready for start up
    2024/04/18 01:08:38 [notice] 1#1: using the "epoll" event method
    2024/04/18 01:08:38 [notice] 1#1: nginx/1.21.5
    2024/04/18 01:08:38 [notice] 1#1: built by gcc 10.3.1 20211027 (Alpine 10.3.1_git20211027) 
    2024/04/18 01:08:38 [notice] 1#1: OS: Linux 3.10.0-1160.108.1.el7.x86_64
    2024/04/18 01:08:38 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
    2024/04/18 01:08:38 [notice] 1#1: start worker processes
    2024/04/18 01:08:38 [notice] 1#1: start worker process 32
    2024/04/18 01:08:38 [notice] 1#1: start worker process 33
    2024/04/18 01:08:38 [notice] 1#1: start worker process 34
    2024/04/18 01:08:38 [notice] 1#1: start worker process 35
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    ⚠ 注意:

    nginx容器的日志默认是输出到docker标准输出和标准错误输出的,而不是存放在文件中

    未来查看日志的时候,不用进入到容器,然后tail/less使用命令查看

    直接使用 docker logs 容器id或名字 就可以看日志.,相当于查看access.log或error.log

    [root@docker01 ~]# docker logs -h
    Flag shorthand -h has been deprecated, please use --help
    
    Usage:  docker logs [OPTIONS] CONTAINER
    
    Fetch the logs of a container
    
    Aliases:
      docker container logs, docker logs
    
    Options:
          --details        Show extra details provided to logs
      -f, --follow         Follow log output
          --since string   Show logs since timestamp (e.g. "2013-01-02T13:23:37Z") or relative (e.g. "42m" for 42 minutes)
      -n, --tail string    Number of lines to show from the end of the logs (default "all")
      -t, --timestamps     Show timestamps
          --until string   Show logs before a timestamp (e.g. "2013-01-02T13:23:37Z") or relative (e.g. "42m" for 42 minutes)
    [root@docker01 ~]# docker logs -f -n 100 oldboy_volume_space 
    /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    /docker-entrypoint.sh: Configuration complete; ready for start up
    2024/04/18 01:08:38 [notice] 1#1: using the "epoll" event method
    2024/04/18 01:08:38 [notice] 1#1: nginx/1.21.5
    2024/04/18 01:08:38 [notice] 1#1: built by gcc 10.3.1 20211027 (Alpine 10.3.1_git20211027) 
    2024/04/18 01:08:38 [notice] 1#1: OS: Linux 3.10.0-1160.108.1.el7.x86_64
    2024/04/18 01:08:38 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
    2024/04/18 01:08:38 [notice] 1#1: start worker processes
    2024/04/18 01:08:38 [notice] 1#1: start worker process 32
    2024/04/18 01:08:38 [notice] 1#1: start worker process 33
    2024/04/18 01:08:38 [notice] 1#1: start worker process 34
    2024/04/18 01:08:38 [notice] 1#1: start worker process 35
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    容器时区问题:

    apk update \
    && apk add tzdata \
    && cp /usr/share/zoneinfo/Asia/shanghai /etc/localtime \
    && echo "Asia/Shanghai" >/etc/timezone
    
    • 1
    • 2
    • 3
    • 4

    c)案例19:随机数据卷(较少使用)

    docker run -d --name "nginx_vol_oldboylogdatav2" -p :80 -v :/var/log/nginx/ nginx:1.20.2-alpine
    
    • 1

    更多数据卷用法:https://docs.docker.com/storage/volumes/

    3)数据卷使用与容器架构

    在这里插入图片描述

    4)小结

    • 熟练掌握挂载指定的目录或文件到容器中即可

    • -v

    • docker volume

    2. 容器架构自动化部分

    • docker 镜像,容器,端口映射,数据卷挂载

    • 目标:创建一个tengine镜像(手动),自动(Dockerfile)

    2.1 案例20:手动实现创建tengine镜像

    • 目标:手动根据Ubuntu20.04镜像,编译安装tengine并部署bird代码

    1)流程说明

    在这里插入图片描述

    2)手动编译安装tengine

    1. 下载并启动ubuntu:20.04 容器 叫 ubt_tengine_2.3.3 
    2. 配置apt源
    3. 下载软件包
    4. 编译安装3步曲 ./configure ; make ; make install 
    5. 启动与测试
    6. 清理痕迹
    7. 生成镜像
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    a) 1. 下载并启动ubuntu:20.04 容器 叫ubt_tengine_2.3.3
    docker run -itd --name "oldboy_tengine_bird_v1" ubuntu:20.04 /bin/bash
    docker exec -it oldboy_tengine_bird_v1 /bin/bash
    
    • 1
    • 2
    b) 2. 配置apt源
    ll /etc/apt/sources.list
    sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list
    apt update #生成apt缓存
    
    • 1
    • 2
    • 3
    c) 3. 下载软件包
    1.安装常用软件
    apt install -y vim curl
    2.下载软件包(手动下载然后从docker cp到容器中)
    http://tengine.taobao.org/download/tengine-2.3.3.tar.gz
    [root@docker01 ~]# docker cp tengine-2.3.3.tar.gz oldboy_tengine_bird_v1:/tmp/
    Successfully copied 2.85MB to oldboy_tengine_bird_v1:/tmp/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    d) 4. 编译安装3步曲
    安装依赖
    ./configure    #进行编译安装的配置-->Makefile 用于编译.
    make           #编译(根据Makefile配置进行编译) 
    make install   #创建目录,复制文件ՎՎʢ
    1. 安装依赖
    apt install -y libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev
    #openssl-devel 
    2. 进行配置(指定用户,指定安装目录,添加或开启模块)
    解压源码包,进入解压目录()
    #--prefix=/app/tools/tengine-2.3.3/ tengine的安装目录,安装到系统的那个目录中,自动创建.
    
    ./configure --prefix=/app/tools/tengine-2.3.3/ \
    --user=nginx \
    --group=nginx \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_stub_status_module \
    --with-http_mp4_module \
    --with-stream \
    --with-stream_ssl_module \
    --with-stream_realip_module \
    --add-module=modules/ngx_http_upstream_check_module/ \
    --add-module=modules/ngx_http_upstream_session_sticky_module
    
    echo $? #上一个命令的执行结果 ,如果是0表示成功,非0就是失败
    3. make编译
    make -j 1
    4. make install编译安装
    make install 
    5. 检查
    /app/tools/tengine-2.3.3/sbin/nginx -V
    6. 创建软连接
    ln -s /app/tools/tengine-2.3.3/ /app/tools/tengine
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    温馨提示: 如何知晓编译安装的依赖? 李导答:你别安装然后直接去编译.

    温馨提示: echo $? #上一个命令的执行结果 ,如果是0表示成功,非0就是失败

    e) 5. 收尾,启动,测试
    1. 添加用户nginx 
    2. 创建安装目录软连接
    3. nginx命令软连接到/sbin/下面.
    4. 启动与本地测试.
    
    1. 添加用户nginx 
     groupadd nginx
     useradd -s /sbin/nologin -g nginx nginx
    2. 创建安装目录软连接
    ln -s /app/tools/tengine-2.3.3/ /app/tools/tengine
    3. nginx命令软连接到/sbin/下面.
    ln -s /app/tools/tengine/sbin/nginx /sbin
    nginx -V
    4. 启动与本地测试.
    nginx   #启动后会在后台运行.
    echo docker-teninge.oldboylinux.cn >/app/tools/tengine/html/index.html
    curl localhost 
    显示:
    docker-teninge.oldboylinux.cn
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    f) 6. 清理镜像(略)
    1. 清理代码包,解压目录
    rm -fr /tmp/*
    2. 清理apt/yum缓存
    rm -fr /var/cache/*
    3. 其他的清理,逐步测试
    
    • 1
    • 2
    • 3
    • 4
    • 5
    g) 7. 生成镜像
    docker commit ubt_tengine_2.3.3 tengine:2.3.3-v1_not_you
    [root@docker01 ~]# docker commit oldboy_tengine_bird_v1 tengine:oldboy_bird_v1
    sha256:82245c5b67084cd7e05579bc9464c1c4a804a1b4cdcd5240fb5b4a3f650333b0
    [root@docker01 ~]# docker images
    REPOSITORY   TAG                 IMAGE ID       CREATED          SIZE
    tengine      oldboy_bird_v1      82245c5b6708   12 seconds ago   382MB
    nginx        alpine_restart_v1   db5dff70a976   20 hours ago     23.5MB
    nginx        alpine              cc44224bfe20   2 years ago      23.5MB
    nginx        latest              605c77e624dd   2 years ago      141MB
    ubuntu       20.04               ba6acccedd29   2 years ago      72.8MB
    centos       latest              5d0da3dc9764   2 years ago      231MB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    h) 8. 运行容器
    • 运行手动创建的自定义镜像注意事项:
      • 启动容器容器中,要有个服务在前台阻塞住
      • 这个容器中没有配置的
      • 需要手动指定
    1. 启动服务注意这里要加上 nginx -g 'daemon off;'
    docker run -d --name "tengine-2.3.3-not_opt_v1" p 80:80 tengine:2.3.3-v1_not_you nginx -g 'daemon 
    off;'
    2. 检查
    curl 10.0.0.81:80
    docker-teninge.oldboylinux.cn
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    说明:

    nginx -g用于在命令行中指定配置文件中的选项/指令,要以分号结尾

    daemon off 关闭守护进程模式,前台运行

    i) 9.关于日志(了解)

    /app/tools/tengine/logs/ 存放在容器中
    关于日志的处理
    方案01 日志目录挂载到宿主机的某个目录中.
    方法02 把日志软连接到/dev/stdout 和/dev/stderr中,未来可以通过docker logs 查看日志

    ln -s /dev/stdout /app/tools/tengine/logs/access.log  
    访问日志 stdout标准输出
    ln -s /dev/sdterr /app/tools/tengine/logs/error.log
    
    修改完成后记得重启容器.
    
    错误日志 stderr错误输出
    只要有访问日志生成就会输出到屏幕,就可以通过docker logs 查看logs -f 查看
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    日志方式
    创建软连接到/dev/stderr 和/dev/stdout通过docker logs查看日志
    数据卷挂载到宿主机的某个目录中灵活,多种情况的各种日志推荐使用这个
     rm -f /app/tools/tengine/logs/*
     ln -s /dev/stdout /app/tools/tengine/logs/access.log
     ln -s /dev/stderr /app/tools/tengine/logs/error.log
    
    • 1
    • 2
    • 3

    3)小结

    在这里插入图片描述

    2.2 自动实现Dockerfile实现

    1) Dockerfile概述

    • 应用场景:通过1个文件Dockerfile,docker build可以自动化生成自定义 镜像

    • 为何使用Dockerfile:

      • 我们目前都是手动拉取镜像,手动进行配置,手动安装依赖,手动编译安装,创建用户…,这个过程类似于命令行使用ansible模块(繁琐,不方便重复执行)
      • 书写Dockerfile把之前手动创建自定义镜像的过程,通过Dockerfile里面的指令实现,类似于书写playbook
    • Dockerfile用于根据要求自动创建 镜像

    2) Dockerfile格式

    在这里插入图片描述

    • Dockerfile使用
    mkdir -p /app/docker/dockerfile/01-centos-ngx
    cd /app/docker/dockerfile/01-centos-ngx/
    vim Dockerfile
    
    FROM centos:7
    LABEL author="oldboylidao996"
    
    RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    RUN yum -y install nginx
    RUN rm -rf /usr/share/nginx/html/index.html
    RUN echo 'oldboyedu linux' > /usr/share/nginx/html/index.html
    
    CMD ["nginx","-g","daemon off;"]
    
    [root@docker01 01-centos-ngx]# docker build -t centos:nginx_v1 .
    [+] Building 80.1s (10/10) FINISHED                                                                            docker:default
     => [internal] load build definition from Dockerfile                                                                     0.0s
     => => transferring dockerfile: 422B                                                                                     0.0s
     => [internal] load metadata for docker.io/library/centos:7                                                             16.7s
     => [internal] load .dockerignore                                                                                        0.0s
     => => transferring context: 2B                                                                                          0.0s
     => [1/6] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987       25.7s
     => => resolve docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987        0.3s
     => => sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 1.20kB / 1.20kB                           0.0s
     => => sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f 529B / 529B                               0.0s
     => => sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9 2.75kB / 2.75kB                           0.0s
     => => sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 76.10MB / 76.10MB                        17.7s
     => => extracting sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc                                7.5s
     => [2/6] RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo                     1.0s
     => [3/6] RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo                              0.4s 
     => [4/6] RUN yum -y install nginx                                                                                      34.9s 
     => [5/6] RUN rm -rf /usr/share/nginx/html/index.html                                                                    0.3s 
     => [6/6] RUN echo 'oldboyedu linux' > /usr/share/nginx/html/index.html                                                  0.4s 
     => exporting to image                                                                                                   0.7s 
     => => exporting layers                                                                                                  0.7s 
     => => writing image sha256:2c6e8cced25e3cd0e3de14b090160e4c7930b3ae90dd83f07a7408073f3bc05e                             0.0s 
     => => naming to docker.io/library/centos:nginx_v1                                                                       0.0s 
    [root@docker01 01-centos-ngx]# docker images
    REPOSITORY   TAG                 IMAGE ID       CREATED             SIZE
    centos       nginx_v1            2c6e8cced25e   10 minutes ago      523MB
    [root@docker01 01-centos-ngx]# docker run -d --rm -p 81:80 centos:nginx_v1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    在这里插入图片描述

    FROM nginx:alpine
    LABEL author="oldboylidao996"
    
    RUN rm -rf /usr/share/nginx/html/index.html
    RUN echo 'docker file oldboyedu linux' > /usr/share/nginx/html/index.html
    
    CMD ["nginx","-g","daemon off;"]
    ####################################################
    
    2. 根据Dockerfile构建镜像
    docker build -t nginx:diy_img_test_v1 .
    注意: .表示 Dockerfile在当前目录下面 -t 就是给自定义镜像命名.
    
    3. 运行
    docker run -d --name 'nginx-1.20.1-centos7-01' -p 81:80 nginx:1.20.2-centos7
    4. 调试
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    3) Dockerfile中的指令

    • 指令都是大写
    Dockerfile指令含义应用建议
    Dockerfile开头部分
    FROM指定基本镜像类似于 docker pull 下载镜像FROM ubuntu:20.04尽量少写ubuntu或ubuntu:latest,尽量指定具体的版本
    LABEL用于指定容器的属性信息,作者,个人联系方式(邮件)…LABEL maintainer=“lidao996 youjiu_linux@qq.com”推荐使用LABEL,不推荐使用下面的MAINTAINER
    MAINTAINER不再使用,推荐使用LABEL 个人信息
    ENV用于创建Dockerfile中使用的变量ENV Tengine_Version空格2.3.3软件版本可以创建使用变量
    Dockerfile中间处理部分
    RUN制作镜像过程中需要的执行命令,通常系统配置,服务配置,部署。但不能出现阻塞当前终端的命令RUN 系统命令即可.不建议使用连续多个RUN,合并连续多个RUN
    ADD可以把指定文件或目录拷贝到容器中(指定目录), 会解压压缩包 .相对于当前目录ADD restart.tar.gz空格/app/code/restart/拷贝压缩包使用
    COPY可以把指定文件或目录拷贝到容器中(指定目录),不支持自动解压.相对于当前目录COPY nginx.conf空格/etc/nginx/nginx.conf拷贝文件或目录
    WORKDIR指定 容器 的默认工作目录WORKDIR /app/code/restart/ ADD restart.tar.gz空一般用于配合ADD,COPY需要书写容器中路径指令.Dockerfile中使用相对路径操作容器.
    VOLUME挂载数据卷VOLUME /usr/share/nginx/html创建随机数据卷挂载容器的目录.未来推荐docker run的时候指定 -v即可
    Dockerfile结尾部分书写的内容
    EXPOSE指定镜像要对外暴露的端口EXPOSE 80用于指定一个或多个容器的端口.未来这个端口可以被-P识别.xxxx:80
    CMD用于指定容器的入口命令.入口命令可以在docker run的时候替换==运行镜像启动容器的时候,容器默认运行的命令是什么CMD [“命令”,“参数01”,“参数02”]CMD [“nginx”,“-g”,“daemon off;”]大部分都会使用CMD
    ENTRYPOINT用于指定容器的入口命令.无法被docker run替换, dockerrun指定的时候仅仅作为 entrypoint命令的参数而已ENTRYPOINT [“executable”,“param1”, “param2”]使用不多

    更多说明:https://docs.docker.com/reference/dockerfile/

    • 核心指令
      • FROM
      • LABEL
      • RUN
      • COPY
      • EXPOSE
      • CMD
    CMD和ENTRYPOINT区别共同点区别
    CMD运行容器的时候默认运行CMD或ENTRYPOINT后面的命令run的时候替换,如果指定了命令内容,cmd内容就会被替换
    ENTRYPOINT运行容器的时候默认运行CMD或ENTRYPOINT后面的命令run的时候,如果指定了命令内容,entrypoint命令的参数而已
    CMD       ["nginx","-g","daemon off;"]
    ENTRYPOINT ["nginx","-g","daemon off;"]
    
    docker run -d   test:ngx  
    共同点: 默认运行CMD或ENTRYPOINT后面的命令.
    CMD       ["nginx","-g","daemon off;"]
    ENTRYPOINT ["nginx","-g","daemon off;"]
    
    docker run -d   test:ngx   sleep 999
    使用的是CMD形式
    CMD       ["nginx","-g","daemon off;"] 不会运行而运行sleep 999
    使用的是ENTRYPOINT形式
    ENTRYPOINT ["nginx","-g","daemon off;"] 运行 nginx -g "daemon off;" sleep 999
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4) 案例21:编译安装tengine变成Dockerfile

    • Docker书写流程
      • 手动创建镜像
      • 把对应的步骤通过Dockerfile实现

    手动实现创建tengine镜像
    1)流程说明
    2)手动编译安装tengine
    ​ a)1.下载并启动ubuntu:20.04 容器叫ubt_tengine 2.3.3
    ​ b)2.配置apt源
    ​ c)3.下载软件包
    ​ d)4.编译安装3步曲
    ​ e)5.收尾,启动,测试
    ​ f)6.清理镜像(略)
    ​ g)7.生成镜像
    ​ h)8.运行容器
    ​ i)9.关于日志(了解)
    3)小结

    1. 目录准备
    tengine.2.3.3.tar.gz 源码包
    bird.tar.gz 代码包
    
    2. 书写Dockerfile
    #1. 基本信息
    FROM ubuntu:20.04
    LABEL author="lidao996" \
          url="www.oldboyedu.com"
    
    #2. 传输软件包
    ADD tengine-2.3.3.tar.gz   /tmp/
    #3. 环境准备
    RUN  sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list \
      && apt update \
      && apt install -y libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev \
      && cd /tmp/tengine-2.3.3/ \
      && ./configure --prefix=/app/tools/tengine-2.3.3/ \
          --user=nginx \
          --group=nginx \
          --with-http_ssl_module \
          --with-http_v2_module \
          --with-http_realip_module \
          --with-http_stub_status_module \
          --with-http_mp4_module \
          --with-stream \
          --with-stream_ssl_module \
          --with-stream_realip_module \
          --add-module=modules/ngx_http_upstream_check_module/ \
          --add-module=modules/ngx_http_upstream_session_sticky_module \
      && make -j 1 \
      && make install \
      && ln -s /app/tools/tengine-2.3.3/sbin/nginx /sbin/ \
      && ln -s /app/tools/tengine-2.3.3/ /app/tools/tengine \
      && useradd -s /sbin/nologin nginx
    
    #4. 传输代码
    ADD bird.tar.gz /app/tools/tengine/html/
    
    #5. 清理
    RUN rm -fr /tmp/* /var/cache/*
    
    #6. 设置暴露80端口和入口指令
    EXPOSE 80
    CMD [ "nginx","-g","daemon off;" ]
    
    3. 构建镜像
    docker build -t "tengine:2.3.3-v1-dockerfile" .
    
    4. 启动
    docker run -d --name "tengine-2.3.3-dockerfile-v1" -p 80:80 tengine:2.3.3-v1-dockerfile
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 浏览器测试

    今日总结

    • 数据卷挂载

    • 手动自定义镜像

    • 自动化创建镜像:Dockerfile:FROM,LABEL,RUN,ADD/COPY,EXPOSE,CMD

    • 作业:

      • 制作编译安装tengine的镜像(不需要代码)
      • 制作1个php镜像(centos:7)
      • 制作1个lnmp镜像(centos:7) (有坑)
      • 制作1个lnmp镜像(ubuntu:20.04) apt安装 ngx,php7.4,mariadb
      • tomcat 镜像
      • jdk 镜像
  • 相关阅读:
    Matplotlib的一些常规操作
    Go编译DLL与SO
    STM32一
    python单元测试框架(继承、unittest参数化、断言、测试报告)
    网页乱码问题及其HTML编程解决方案
    浅谈Oracle数据库调优(3完)
    ElasticSearch 增删改查操作
    Oracle update 关联更新优化方法
    push apk到真机出现remote couldn‘t create file: Read-only file system
    cocotb教程(一)
  • 原文地址:https://blog.csdn.net/dws123654/article/details/137926831