zoukankan      html  css  js  c++  java
  • Docker

    Dockerfile 构建镜像

    1.简介

    Docker镜像是分很多层的

    Dockerfile 由一行行命令语句组成, 并且支持以开头的注释行

    一般而言, Dockerfile 主体内容分为4部分:

    • 基础镜像信息(必须的)
    • 维护者信息
    • 镜像操作指令
    • 容器启动时执行指令

    Docker 以从上到下的顺序运行 Dockerfile 的指令

    为了指定基本映像,第一条指令必须是 FROM

    一个声 明以字符开头则被视为注释

    可以在 Docker 文件中使用 RUN,CMD,FROM,EXPOSE,ENV 等指令

    指令 释义
    FROM 指定基础镜像
    MAINTAINER 维护者的信息
    RUN 在容器内部 执行的命令
    ADD 添加文件至镜像内(可以自动解压:仅限于tar格式的压缩包)
    CMD 启动容器时 执行的命令
    ENTRYPOINT 同CMD,但这个一定会被执行,不会被覆盖修改
    ENV 设置执行命令时的环境变量,并且在构建完成后,仍然生效
    ARG 设置只在构建过程中使用的环境变量,构建完成后,将消失
    COPY 将本地文件或目录拷贝到镜像的文件系统中
    USER 指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令
    ONBUILD 当 当前镜像 被当做基础镜像时 执行的命令
    WORKDIR 当前工作目录
    VOLUME 目录挂载(添加数据卷)
    EXPOSE 设置向外暴露的端口号
    STOPSIGNAL 设置容器退出时发出的关闭信号
    HEALTHCHECK 设置容器状态检查
    LABEL 用于为镜像添加元数据
    SHELL 更改执行shell命令的程序。Linux的默认shell是["/bin/sh","-c"],Windows的是["cmd", "/S", "/C"]

    2.编写指令的文件 - 名称必须是:Dockerfile

    # 1.创建一个编写指令的文件:Dockerfile
    touch Dockerfile
    

    3.编写构建镜像的指令

    ① FROM - 指定基础镜像(作为构建新镜像时 提供一个基础环境)

    语法
    FROM [镜像名称]
    FROM [镜像]:[版本号]
    FROM [镜像]@[摘要]
    

    ② MAINTAINER - 维护者信息

    MAINTAINER [维护者的信息]
    

    ③ RUN - 构建镜像时 在镜像中执行的命令

    RUN [Linux命令]
    

    ④ ADD - 将本地文件复制到镜像中

    • 可以添加网络资源
    • 会自动解压.tar格式的网络资源
    • 宿主机的文件路径可以是绝对路径,也可以是相对路径
    • 文件路径的权限也需要注意
    ADD [宿主主机文件路径] [镜像相对应的文件路径]
    

    ⑤ COPY - 功能类似 ADD,但是是不会自动解压文件,也不能访问网络资源

    COPY [宿主主机文件路径] [镜像相对应的文件路径]
    

    ⑤ CMD - 指定容器启动时 默认执行的命令

    CMD [容器启动时 在容器内执行的命令]
    

    ⑥ LABEL - 用于为镜像添加元数据

    LABEL <key>=<value> <key>=<value> <key>=<value>
    
    LABEL version="1.0" description="这是一个 Web 服务器" by="IT 笔录"
    

    ⑦ ENV- 设置环境变量

    ENV <key> <value>
    
    ENV MYSQL_ROOT_PASSWORD=123456
    

    ⑧ EXPOSE - 指定于外界交互的端口

    EXPOSE 并不会让容器的端口访问到主机

    要使其可访问,需要在 docker run 运行容器时通过-p 来发布这些端口

    或通过-P 参数来发布 EXPOSE 导出的所有端口

    EXPOSE <port>
    
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp
    

    ⑨ VOLUME - 用于指定持久化目录(挂载)

    一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能

    • 卷可以容器间共享和重用
    • 容器并不一定要和其它容器共享卷
    • 修改卷后会立即生效
    • 对卷的修改不会对镜像产生影响
    • 卷会一直存在,直到没有任何容器在使用它
    VOLUME ["/path/to/dir"]
    

    ⑩ WORKDIR - 工作目录,类似于 cd 命令

    通过 WORKDIR 设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行

    在使用 docker run 运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录

    WORKDIR /path/to/workdir
    
    WORKDIR /a	# 这时工作目录为/a
    WORKDIR b	# 这时工作目录为/a/b
    WORKDIR c	# 这时工作目录为/a/b/
    

    ⑩① ARG - 用于指定传递给构建运行时的变量

    ARG <name>[=<default value>]
    
    ARG site
    ARG build_user=www
    

    ⑩② ONBUILD - 用于设置镜像触发器

    当所构建的镜像被用做其它镜像的基础镜像时,构建镜像前会执行

    ONBUILD [INSTRUCTION]
    
    ONBUILD ADD . /app/src
    ONBUILD RUN /usr/local/bin/python-build --dir /app/src
    

    4.开始构建

    选项 释义
    -t 指定镜像名称
    -f 指定Dockerfile路径
    docker build [选项] [自定义镜像名称] [dockerfile]
    

    5.实例

    vim Dockerfile
    i
    FROM busybox:latest
    CMD echo "Hello World"
    Esc
    :wq
    docker build -t test/busybox01 .
    docker images
    docker run -d --name busybox001 test/busybox01
    docker logs busybox001
    
    
    # 创建1个Dockerfile
    [root@localhost ~]# vim Dockerfile
    
    # 按i进入插入模式
    i
    
    # 输入如下内容
    FROM busybox:latest
    CMD echo "Hello World"
    
    # 按 Esc 退出插入模式  按 :wq 进行保存
    Esc
    :wq
    
    # 构建镜像test/busybox01 到当前目录.
    [root@localhost ~]# docker build -t test/busybox01 .
    Sending build context to Docker daemon  7.786MB
    Step 1/2 : FROM busybox:latest
     ---> dc3bacd8b5ea
    Step 2/2 : CMD echo "Hello World"
     ---> Running in f5b2496a4cd3
    Removing intermediate container f5b2496a4cd3
     ---> 3798dc9e5d7b
    Successfully built 3798dc9e5d7b	# 构建出的镜像ID
    Successfully tagged test/busybox01:latest
    [root@localhost ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
    test/busybox01      latest              3798dc9e5d7b        About a minute ago   1.23MB
    nginx               latest              bc9a0695f571        8 days ago           133MB
    busybox             latest              dc3bacd8b5ea        9 days ago           1.23MB
    mysql               5.7                 ae0658fdbad5        12 days ago          449MB
    mysql               5.7.32              ae0658fdbad5        12 days ago          449MB
    redis               latest              74d107221092        2 weeks ago          104MB
    centos              latest              0d120b6ccaa8        3 months ago         215MB
    python              3.6.8               48c06762acf0        18 months ago        924MB
    
    # 用 test/busybox01镜像 运行一个容器 busybox001
    [root@localhost ~]# docker run -d --name busybox001 test/busybox01
    5e53fd64cb19359395075f59a49e7c51bd723ad028365a3b02e74b853ce93de2
    
    # 查看容器busybox001的日志
    [root@localhost ~]# docker logs busybox001
    Hello World	# 这个就是容器输出的内容
    
    ALLOW_HOST = []
    ALLOW_HOST = ['*']
    
    vim Dockerfile
    
    FROM busybox:latest
    RUN touch index.html
    RUN echo "Hello" > index.html
    CMD cat index.html
    
    docker build -t test/busybox:v2 .
    
    docker images
    
    docker run -d --name busybox002 test/busybox:v2
    
    docker logs busybox01
    
    
    
    
    vim Dockerfile
    
    FROM busybox:latest
    
    
    ADD xxx.zip /root
    
    RUN touch index.html
    RUN echo "Hello" > index.html
    CMD cat index.html
    
    docker build -t test/busybox:v3 .
    
    docker images
    
    docker run -d --name busybox003 test/busybox:v3
    
    docker logs busybox003
    
    vim Dockerfile
    
    # 1.指定基础镜像
    FROM python:3.6.8
    
    # 2.安装django
    RUN pip3 install django==2.2.2 -i https://pypi.douban.com/simple/
    
    # 3.创建1个django项目
    RUN django-admin startproject blog
    RUN cd blog && python3 manage.py startapp app01
    
    ## 3.将当前目录的文件 复制到镜像中(此处不能用绝对路径)
    ADD django_proj01 /root
    
    # 4.设置启动命令
    CMD cd /root && python3 manage.py runserver 0.0.0.0:8000
    
    
    docker build -t test/django:v1 .
    
    docker run -dit -p 30000:8000 --name django01 --network host test/django:v1
    
    

    安装Nginx

    # 1.安装yum工具
    yum install yun-utils -y
    
    # 2.创建文件
    touch /etc/yum/repos.d/nginx.repo
    
    # 3.编辑文件
    
    
    # 4.生成yum缓存
    yum makecache
    
    # 5.安装nginx
    yum install nginx -y
    
    
    # 6.配置dialing
    
    
    # 7.设置配置文件
    nginx -t:测试配置文件
    nginx -g 'daemon off;'	# 在前台启动nginx
    

    构建nginx

    mkdir teach
    cd teach
    mkdir django
    mkdir nginx
    cd nginx
    touch Dockerfile
    vim nginx.repo
    
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
    [nginx_mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
    
    vim Dockerfile
    
    
    # 设置基础镜像
    FROM centos:7
    
    # 安装wget
    yum install wget -y
    
    # 换源
    RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    RUN wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    
    
    # 创建nginx源的文件
    ADD nginx.repo /etc/yum/repos.d/
    
    # 刷新yum缓存
    RUN yum makecache
    
    # 安装yum工具
    RUN yum install yum-utils -y
    
    # 安装nginx
    RUN yum install nginx -y
    
    # 复制配置文件
    ADD default.conf /etc/nginx/conf.d/
    
    # 设置启动命令
    CMD nginx -g "daemon off;"
    
    docker build -t nginx:v1 .
    

    Dockerfile

    # 设置基础镜像
    FROM centos
    
    RUN yum install wget -y
    
    # 换源
    RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    
    RUN cd /etc/yum.repos.d && wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
    
    RUN mv /etc/yum.repos.d/CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo
    
    # 创建nginx源的文件
    ADD nginx.repo /etc/yum.repos.d/ 
    
    # 刷新yum缓存
    RUN yum makecache
    
    # 安装yum工具
    RUN yum install yum-utils -y
    
    # 安装Nginx
    RUN yum install nginx -y
    
    # 复制配置文件
    ADD default.conf /etc/nginx/conf.d/
    
    # 设置启动命令
    CMD nginx -g 'daemon off;'
    

    default.conf

    upstream django {
        server django:8000;
    }
    
    server {
        listen 80;
        server_name _;
        location / {
            proxy_pass http://django;
            index index.html index.htm;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    

    nginx.repo

    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    

    mine

    all

    cd /root
    mkdir mine
    cd mine 
    mkdir django
    mkdir mysql
    

    mysql

    cd /root/mine/mysql
    vim Dockerfile
    
    # 1.指定基础镜像
    FROM mysql:5.7
    ENV MYSQL_ROOT_PASSWORD=123456
    RUN mysql -uroot -p123456
    RUN create database blog01 default charset utf8;
    EXPOSE 3306
    
    docker build -t mysql:v1 .
    
    docker run -dit -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql:v1
    
    
    docker run -dit -p 3306:3306 --name mysql01 mysql:v1
    

    django

    cd /root/mine/django
    vim Dockerfile
    
    # 1.指定基础镜像
    FROM python:3.6.8
    
    # 2.安装django
    # RUN pip3 install django==2.2.2 -i https://pypi.douban.com/simple/
    
    # 3.将当前目录的文件 复制到镜像中(此处不能用绝对路径)
    ADD django_blog /root
    
    # 4.安装依赖
    CMD pip3 install -r requirements.txt -i https://pypi.douban.com/simple/
    
    EXPOSE 8000
    
    
    # 4.设置启动命令
    CMD python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py runserver 0.0.0.0:8000
    
    
    docker build -t django:v1 .
    
    docker run -dit -p 8000:8000 --name django01 --network host django:v1
    docker run -dit -p 8000:8000 --name django03 django:v2 
    
  • 相关阅读:
    default.js 下的 setPromise(WinJS.UI.processAll());
    选择排序
    插入排序
    16、css实现div中图片占满整个屏幕
    21、解决关于 vue项目中 点击按钮路由多了个问号
    15、vue项目封装axios并访问接口
    17、在vue中引用移动端框架Vux:
    24、vuex刷新页面数据丢失解决办法
    18、git提交代码并将develop分支合并到master分支上
    20、解决Vue使用bus兄弟组件间传值,第一次监听不到数据
  • 原文地址:https://www.cnblogs.com/xuexianqi/p/14157083.html
Copyright © 2011-2022 走看看