Docker进阶

1.Dockerfile

1.1Dockerfile简介

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

1、找一个镜像: ubuntu
2、创建一个容器: docker run ubuntu
3、进入容器: docker exec -it 容器 命令
4、操作: 各种应用配置
5、构造新镜像: docker commit

Dockerfile 使用准则

1、大: 首字母必须大写D
2、空: 尽量将Dockerfile放在空目录中。
3、单: 每个容器尽量只有一个功能。
4、少: 执行的命令越少越好。

Dockerfile 基础四指令:

基础镜像信息 ----------从哪来?
维护者信息----------我是谁?
镜像操作指令----------怎么干?
容器启动时执行指令--------嗨!!!

Dockerfile使用命令:

构建镜像命令格式:
    docker build -t [镜像名]:[版本号] [Dockerfile所在目录]
构建样例:
    docker build -t nginx:v0.2 /opt/dockerfile/nginx/
参数详解:
    -t  指定构建后的镜像信息,
    /opt/dockerfile/nginx/  则代表Dockerfile存放位置,如果是当前目录,则用 .(点)表示
1.2Dockerfile快速入门

准备环境

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

定制文件

创建Dockerfile文件
    # 构建一个基于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"]

构建镜像

docker build -t ubuntu-ssh .

效果查看

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

基础指令

FROM
    格式:
        FROM <image>
        FROM <image>:<tag>。
    解释:
        FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
MAINTAINER
    格式:
        MAINTAINER <name>
    解释:
        指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
RUN
    格式:
        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"]
EXPOSE
    格式:
        EXPOSE <port> [<port>...]
    解释:
        设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加-p或者-P参数对容器的端口进行分配。
ENTRYPOINT
    格式:
        ENTRYPOINT ["executable", "param1","param2"]    (exec 模式)
        ENTRYPOINT command param1 param2 (shell模式)
    解释:
        每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
1.4文件编辑指令详解

目录文件编辑指令

ADD
    格式:
        ADD <src>... <dest>
        ADD ["<src>",... "<dest>"]
    解释:
        将指定的 <src> 文件复制到容器文件系统中的 <dest>
        src 指的是宿主机,dest 指的是容器
     如果源文件是个压缩文件,则 docker  会自动帮解压到指定的容器中( 无论目标是文件还是目录,都会当成目录处理)。
--------------------------------------------------------------------
实操
拷贝普通文件
    Dockerfile文件内容
    # 执行命令
    # 增加文件
    ADD ["sources.list","/etc/apt/sources.list"]
拷贝压缩文件
    Dockerfile文件内容
    # 执行命令
    # 增加文件
    ADD ["linshi.tar.gz","/nihao/"]
COPY
    格式:
        COPY <src>... <dest>
        COPY ["<src>",... "<dest>"]
    解释:
        单纯复制文件场景,Docker 推荐使用 COPY
--------------------------------------------------------------------
实操
修改Dockerfile文件内容:
    # 执行命令
    # 增加文件
    COPY index.html /var/www/html/
    ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
VOLUME
    格式:
        VOLUME ["/data"]
    解释:
        VOLUME 指令可以在镜像中创建挂载点,这样  只要通过该镜像创建的容器都有了挂载点
        通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
    举例:
        VOLUME ["/var/lib/tomcat7/webapps/"]
-----------------------------------------------------------------
实操
修改Dockerfile文件内容:
    # 在上一个 Dockerfile 文件内容基础上,在         COPY 下面增加一个 VOLUME
    VOLUME ["/data/"]
1.5环境指令详解

环境设置指令

ENV
    格式:
        ENV <key> <value>
        ENV <key>=<value> ...
    解释:
        设置环境变量,可以在 RUN 之前使用,然后 RUN 命令时调用,容器启动时这些环境变量都会被指定
-------------------------------------------------------------------
实操
修改Dockerfile文件内容:
    # 在上一个 Dockerfile 文件内容基础上,在 RUN     下面增加一个 ENV
    ENV NIHAO=helloworld
WORKDIR
    格式:
        WORKDIR /path/to/workdir (shell 模式)
    解释:
        切换目录,为后续的 RUN、CMD、  ENTRYPOINT 指令配置工作目录。 相当于 cd
        可以多次切换(相当于 cd 命令),
        也可以使用多个 WORKDIR 指令,后续命令如  果参数是相对路径,则会基于之前命令指定的路  径。
    例如
        举例:
            WORKDIR /a
            WORKDIR b
            WORKDIR c
            RUN pwd
            则最终路径为 /a/b/c。
--------------------------------------------------------------------
实操
修改Dockerfile文件内容:
    # 在上一个 Dockerfile 文件内容基础上,在 RUN     下面增加一个 WORKDIR
    WORKDIR /nihao/demo/
    RUN ["touch","demo.txt"]
1.6Dockerfile构建过程

Dockerfile构建过程:

  • 从基础镜像1运行一个容器A
  • 遇到一条Dockerfile指令,都对容器A做一次修改操作
  • 执行完毕一条命令,提交生成一个新镜像2
  • 再基于新的镜像2运行一个容器B
  • 遇到一条Dockerfile指令,都对容器B做一次修改操作
  • 执行完毕一条命令,提交生成一个新镜像3

构建过程镜像介绍

  • 构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用来启动容器,通过查看容器效果,从侧面能看到我们每次构建的效果。
  • 提供了镜像调试的能力
  • 我们可以通过docker history <镜像名> 来查看整个构建过程所产生的镜像

构建缓存

我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。
不适用构建缓存方法常见两种:

  • 全部不同缓存:
    docker build --no-cache -t [镜像名]:[镜像版本] [Dockerfile位置]
  • 部分使用缓存:
    ENV REFRESH_DATE 2018-01-12
    只要构建的缓存时间不变,那么就用缓存,如果时间一旦改变,就不用缓存了
样例:
    # 构建一个基于 ubuntu-base 的 docker 定制镜像
    # 基础镜像
        FROM ubuntu-base
    # 镜像作者
        MAINTAINER President.Wang     000000@qq.com
    # 创建构建刷新时间
        ENV REFRESH_DATE 2018-11-02
    # 执行命令
    ...

构建历史:

查看构建过程查看
docker history

清理构建缓存:

docker system prune
docker system prune --volumes

2. Dockerfile 构建django 环境( 拓展)

2.1需求:

基于docker镜像,手工部署django项目环境

2.2方案分析

1、docker环境部署
2、django环境部署
3、djanog项目部署
4、测试

2.3技术关键点:

1、docker环境部署
使用docker镜像启动一个容器即可
2、django环境部署
django软件的依赖环境
django软件的基本环境配置
3、django项目部署
django框架的下载
项目文件配置
启动django项目
4、测试
宿主机测试

2.4解决方案

1、docker环境配置
1.1 获取docker镜像
1.2 启动docker容器
2、django环境部署
2.1 基础环境配置
2.2 django环境配置
3、django项目部署
3.1 创建django项目
3.2 创建django应用
3.3 项目启动
4、测试
4.1 宿主机测试

2.5方案实施:
1、docker环境配置
    1.1 获取docker镜像
        ubuntu-ssh
    1.2 启动docker容器
        启动容器,容器名称叫 django
            docker run -d -p 10086:22 --name django ubuntu-ssh
        进入容器
            ssh 192.168.8.14 -p 10086
2、django环境部署
    2.1 基础环境配置
        基础目录环境
            mkdir /data/{server,softs} -p
            cd /data/softs
            scp root@192.168.8.14:/data/softs/Django-2.1.2.tar.gz ./
            注意:
                因为我们的docker镜像就是唯一的,所以就没有必要单独创建python虚拟环境了
    2.2 django环境配置
        安装基本依赖软件
            apt-get install python3-pip -y
        安装django软件
            cd /data/softs
            tar xf Django-2.1.2.tar.gz
            cd Django-2.1.2
            python3 setup.py install
3、django项目部署
    3.1 创建django项目
        创建项目
            cd /data/server
            django-admin startproject demo
    3.2 创建django应用
         创建应用
            cd /data/server/demo
            python3 manage.py startapp test1
    注册应用
        # vim demo/settings.py
        INSTALL_APP = [
        'test1',
        ]
    配置应用
        admin-1@ubuntu:/data/soft# cat     /data/server/demo/test1/views.py
        from django.shortcuts import render
        from django.http import HttpResponse
        # Create your views here.
        def hello(resquest):
               return HttpResponse("demo V1.0")
url文件配置
        admin-1@ubuntu:/data/soft# cat   /data/server/demo/demo/urls.py
        from test1.views import *
        urlpatterns = [
            path('admin/', admin.site.urls),
            path('hello/', hello),
          ]
    3.3 项目启动
        设置访问主机
            # vim demo/settings.py
            ALLOWED_HOSTS = ['*']
        启动项目
            python3 manage.py runserver 172.17.0.2:8000
        注意:
            要提前用ifconfig来检查一下当前容器的IP地址,以方面接下来的测试
4、测试
    4.1宿主机测试
        查看容器的ip地址
            docker inspect django
        浏览器、或curl查看效果:
            172.17.0.2:8000/hello/

3Dockerfile案例实践

3.1环境分析:

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

3.2关键点分析:

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

3.3定制方案:

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

3.4Dockerfile定制
进入标准目录
    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 demo
    # 创建应用
        WORKDIR /data/server/demo
        RUN python3 manage.py startapp test1
        RUN sed -i "/staticfiles/a\    'test1',"   demo/settings.py
    # 配置应用
        COPY views.py /data/server/demo/test1/
        RUN sed -i '/t p/a\from test1.views import *'   demo/urls.py
        RUN sed -i "/\]/i\    path('hello/', hello)," demo/urls.py
    # 启动项目
        RUN sed -i "s#S = \[\]#S = \['*'\]#" demo/settings.py
    # 对外端口
        EXPOSE 8000
    # 运行项目
        ENTRYPOINT     ["python3","manage.py","runserver","0.0.0.0:8000"]

效果查看

构建镜像
docker build -t ubuntu-django .
运行镜像
docker run -p 8000:8000 -d ubuntu-django
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341