Dockerfile学习

Dockerfile学习

  1. Dockerfile简介

    Dockerfile类似于我们学习过的脚本,将我们在上面学到的docker镜像,使用自动化的方式实现出来

  2. Dockerfile作用
    1、找一个镜像:   	ubuntu
    2、创建一个容器: 	docker run  ubuntu
    3、进入容器:		docker exec -it 容器 命令
    4、操作:			各种应用配置
    		....
    5、构造新镜像:		docker commit   
    
  3. Dockerfile使用准则
    1.大: 首字母必须大写D
    2.空: 尽量将Dockerfile放在空目录中。
    3.单: 每个容器尽量只有一个功能。
    4.少: 执行的命令越少越好。
    
  4. 具体操作(快速入门)
    1. 准备环境

      # 创建Dockerfile专用目录
      mkdir /docker/images/ssh -p
      cd /docker/images/ssh
      # 创建秘钥认证
      ssh-keygen -t rsa
      cat ~/.ssh/id_rsa.pub > authorized_keys
      # 准备软件源
      cp /etc/apt/sources.list ./
      
    2. 定制文件

      # 构建一个基于ubuntu的ssh定制镜像
      # 基础镜像
      FROM ubuntu-base
      # 镜像作者
      MAINTAINER President.Wang 000000@qq.com
      # 执行命令
      # 增加软件源
      ADD sources.list /etc/apt/sources.list
      # 安装 ssh 服务
      RUN apt-get update && apt-get install -y openssh-server curl vim net-tools && mkdir -p /var/run/sshd && mkdir -p /root/.ssh && sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd && apt-get autoclean && apt-get clean && apt-get autoremove
      # 复制配置文件到相应位置,并赋予脚本可执行权限
      ADD authorized_keys /root/.ssh/authorized_keys
      # 对外端口
      EXPOSE 22
      # 启动ssh
      ENTRYPOINT ["/usr/sbin/sshd","-D"]
      
    3. 构造镜像

      # 构建镜像
      docker build -t ubuntu-ssh .
      
    4. 效果查看

      # 使用新镜像启动一个容器,查看效果
      docker run -d -p 10086:22 ubuntu-ssh
      # 容器检查
      docker ps
      docker port c03d146b64d4
      # ssh查看效果
      ssh 192.168.8.14 -p 10086
      
  5. 基础指令详解
    1. FROM

      # 格式:
      FROM <image>
      FROM <image>:<tag># 解释:
      # FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
      
    2. MAINTAINER

      # 格式:
      # MAINTAINER <name>
      # 解释:指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
      
    3. RUM

      # 格式:
      RUN <command>										(shell模式)
      RUN["executable", "param1", "param2"]。			   (exec 模式)
      # 解释:表示当前镜像构建时候运行的命令
      注释:
      shell模式:类似于  /bin/bash -c command
      举例: RUN echo hello
      exec  模式:类似于 RUN ["/bin/bash", "-c", "command"]
      举例: RUN ["echo", "hello"]
      
    4. EXPOSE

      # 格式:EXPOSE <port> [<port>...]
      # 解释:设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加-p或者-P参数对容器的端口进行分配。
      
    5. ENTRYPOINT

      # 格式:
      # ENTRYPOINT ["executable", "param1","param2"] 		(exec 模式)
      # ENTRYPOINT command param1 param2 						(shell模式)
      # 解释:每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
      
  6. 文件编辑指令详解
    1. ADD

      # 格式:
      ADD <src>... <dest>
      ADD ["<src>",... "<dest>"]
      # 解释:将指定的 <src> 文件复制到容器文件系统中的 <dest> 
      # src 指的是宿主机,dest 指的是容器
      # 如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
      
    2. COPY

      # 格式:
      COPY <src>... <dest>
      COPY ["<src>",... "<dest>"]
      # 解释:单纯复制文件场景,Docker推荐使用COPY  
      
    3. VOLUME

      # 格式:
      VOLUME ["/data"]
      # 解释:VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
      # 举例:
      VOLUME ["/var/lib/tomcat7/webapps/"]
      
    4. 实践

      # ADD 拷贝普通文件
      ADD ["sources.list","/etc/apt/sources.list"]
      # ADD 拷贝压缩文件
      ADD ["linshi.tar.gz","/nihao/"]
      
      # COPY 增加文件
      COPY index.html /var/www/html/
      
      # 在上一个Dockerfile文件内容基础上,在COPY下面增加一个VOLUME
      VOLUME ["/data/"]
      
  7. 环境指令详解
    1. ENV

      # 格式:
      ENV <key> <value>
      ENV <key>=<value> ...
      # 解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定
      
    2. WORKDIR

      # 格式:
      WORKDIR /path/to/workdir					(shell 模式)
      # 解释:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd,可以多次切换(相当于cd命令), 也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
      #举例:
      WORKDIR /a
      WORKDIR b
      WORKDIR c
      RUN pwd
      # 则最终路径为 /a/b/c。
      
    3. 实践

      # 在上一个Dockerfile文件内容基础上,在RUN下面增加一个ENV
      ENV NIHAO=helloworld
      
      # 在上一个Dockerfile文件内容基础上,在RUN下面增加一个WORKDIR
      WORKDIR /nihao/xlz/
      RUN ["touch","xlz.txt"]
      
  8. Dockerfile构建过程
    从基础镜像1运行一个容器A
    遇到一条Dockerfile指令,都对容器A做一次修改操作
    执行完毕一条命令,提交生成一个新镜像2
    再基于新的镜像2运行一个容器B
    遇到一条Dockerfile指令,都对容器B做一次修改操作
    执行完毕一条命令,提交生成一个新镜像3
    

    构建历史:

    查看构建过程查看

    docker history
    

    清理构建缓存:

    docker system prune
    docker system prune --volumes
    
  9. Dockerfile案例实践
    1. 环境分析

      1、软件源文件,使用国外源,速度太慢,所以我们可以自己使用国内的软件源。
      因为我们在手工部署的时候,使用的是官方(国外)的源,所以为了部署快一点呢,我使用国内的源。
      2、软件安装,涉及到了各种软件
      3、软件运行涉及到了软件的运行目录
      4、项目访问,涉及到端口
      
    2. 关键点分析

      1、增加文件,使用 ADD 或者 COPY 指令
      2、安装软件,使用 RUN 指令
      3、命令运行,使用 WORKDIR 指令
      4、项目端口,使用 EXPOSE 指令
      5、容器运行,使用 ENTRYPOINT
      
    3. 定制方案

      1、基于ubuntu-ssh基础镜像进行操作
      2、安装环境基本软件
      3、定制命令工作目录,并增加文件
      4、开放端口
      5、执行项目
      
    4. Dockerfile定制

      # 进入标准目录
      mkdir /docker/images/django -p
      cd /docker/images/django
      
      # 第一版dockerfile内容
      # 构建一个基于ubuntu的docker定制镜像
      # 基础镜像
      FROM ubuntu-ssh
      # 镜像作者
      MAINTAINER President.Wang 000000@qq.com
      # 执行命令
      RUN apt-get install python3-pip -y
      # 增加文件
      ADD Django-2.1.2.tar.gz /data/softs/
      WORKDIR /data/softs/Django-2.1.2
      RUN python3 setup.py install
      
      # 创建项目
      WORKDIR /data/server
      RUN django-admin startproject xlz
      # 创建应用
      WORKDIR /data/server/xlz
      RUN python3 manage.py startapp test1
      RUN sed -i "/staticfiles/a\  'test1'," xlz/settings.py
      # 配置应用
      COPY views.py /data/server/xlz/test1/
      RUN sed -i '/t p/a\from test1.views import *' xlz/urls.py
      RUN sed -i "/\]/i\    path('hello/', hello)," xlz/urls.py
      # 启动项目
      RUN sed -i "s#S = \[\]#S = \['*'\]#" xlz/settings.py
      # 对外端口
      EXPOSE 8000
      # 运行项目
      ENTRYPOINT ["python3","manage.py","runserver","0.0.0.0:8000"]
      
    5. 效果查看

      # 构建镜像
      docker build -t ubuntu-django .
      # 运行镜像
      docker run -p 8000:8000 -d ubuntu-django
      
  10. 应用

    # 启动运行基本系统
    FROM ubuntu
    # 安装环境
    ADD ./requeriments.text /home
    # 进入/home
    WORKDIR /home
    # 安装
    RUN apt-get update && apt-get install python3-pip && pip install django==1.11.11
    RUM pip install -r requeriments.text
    # 导入项目文件
    ADD ./meiduo_mall /home/meiduo_mall
    # 进入/home/meiduo_mall
    WORKDIR /home/meiduo_mall
    # 指定对外开发
    EXPOSE 8001
    ENRYPOINT uwsgi --ini uwsgi.ini
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值