Docker进阶

第 4 章 Docker 进阶

 

在这一部分我们主要来介绍一些Docker的高级内容:

Dockerfile 和 Docker compose

4.1 Dockerfile

学习目标:

了解 Dockerfile简介及特点

应用 Dockerfile使用命令

说出 Dockerfile常见指令及其特点

4.1.1 Dockerfile简介

这一节,我们从定义、作用、准则、文件内容、基础指令、使用命令这六个方面来学习。

 

什么是Dockerfile

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存放位置,如果是当前目录,则用 .(点)表示

 

 

4.1.2 Dockerfile快速入门

这一节,我们从环境、文件、构建、效果这四个方面来速的使用Dockerfile来创建一个定制化的镜像:ssh。

准备环境

创建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 ./

 

 

定制文件

创建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
# sed 匹配替换,且支持正则匹配
https://www.cnblogs.com/xiaoliu66007/p/11059527.html

 

# 复制配置文件到相应位置,并赋予脚本可执行权限

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

4.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,当指定多个时,只有最后一个起效。

 

4.1.4 文件编辑指令详解

这一节,我们从指令详解、ADD实践、COPY实践、VOLUME实践这四个方面来学习。

注意:

ADD和COPY相当于数据卷操作,VOLUME相当于数据卷容器操作

 

目录文件编辑指令

ADD

格式:

    ADD <src>... <dest>

    ADD ["<src>",... "<dest>"]

解释:

将指定的 <src> 文件复制到容器文件系统中的 <dest>

src 指的是宿主机,dest 指的是容器

    如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)

 

COPY

格式:

    COPY <src>... <dest>

    COPY ["<src>",... "<dest>"]

解释:

    单纯复制文件场景,Docker推荐使用COPY 

 

VOLUME

格式:

    VOLUME ["/data"]

解释:

   VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点

通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

    举例:

        VOLUME ["/var/lib/tomcat7/webapps/"]

ADD实践     

拷贝普通文件

Dockerfile文件内容

...

# 执行命令

...

# 增加文件

ADD ["sources.list","/etc/apt/sources.list"]

...

拷贝压缩文件

Dockerfile文件内容

...

# 执行命令

...

# 增加文件

ADD ["linshi.tar.gz","/nihao/"]

...

 

COPY实践    

    修改Dockerfile文件内容:

...

# 执行命令

...

# 增加文件

COPY index.html /var/www/html/

...

ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]

 

VOLUME实践

修改Dockerfile文件内容:

# 在上一个Dockerfile文件内容基础上,在COPY下面增加一个VOLUME

VOLUME ["/data/"]

...

4.1.5 环境指令详解

这一节,我们从指令详解、ENV实践、WORKDIR实践这三个方面来学习。

 

环境设置指令

ENV

格式:

    ENV <key> <value>

    ENV <key>=<value> ...

解释:

    设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定

 

WORKDIR

格式:

WORKDIR /path/to/workdir                   (shell 模式)

解释:

    切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd

    可以多次切换(相当于cd命令),

     也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

   举例:

    WORKDIR /a

    WORKDIR b

    WORKDIR c

    RUN pwd

    则最终路径为 /a/b/c。

 

ENV实践

修改Dockerfile文件内容:

# 在上一个Dockerfile文件内容基础上,在RUN下面增加一个ENV

ENV NIHAO=helloworld

 

WORKDIR实践

修改Dockerfile文件内容:

# 在上一个Dockerfile文件内容基础上,在RUN下面增加一个WORKDIR

WORKDIR /nihao/itcast/

RUN ["touch","itcast.txt"]

4.1.6 Dockerfile构建过程

这一节,我们从构建过程、镜像介绍、构建缓存这三个方面来学习。

 

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

4.2 Dockerfile构建django环境(拓展)

学习目标:

应用 Dockerfile的生产使用流程

应用 Dockerfile定制web项目镜像

4.2.1 项目描述

django官方网站:https://code.djangoproject.com/

基于我们在shell自动化运维课程中的项目案例,我们现在来使用Dockerfile做一个Docker镜像。

4.2.2 手工部署django项目环境

这一节,我们从需求、方案分析、技术关键点、方案、方案实施这五个方面来学习。

 

需求:

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

 

方案分析:

1、docker环境部署

2、django环境部署

3、djanog项目部署

4、测试

 

技术关键点:

1、docker环境部署

使用docker镜像启动一个容器即可

2、django环境部署

django软件的依赖环境

django软件的基本环境配置

3、django项目部署

django框架的下载

项目文件配置

启动django项目

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 宿主机测试

 

方案实施:

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 itcast

3.2 创建django应用

创建应用

cd /data/server/itcast

python3 manage.py startapp test1

    注册应用

# vim itcast/settings.py

 

INSTALL_APP = [

    。。。

    'test1',

]

配置应用

admin-1@ubuntu:/data/soft# cat /data/server/itcast/test1/views.py

from django.shortcuts import render

from django.http import HttpResponse

 

# Create your views here.

 

def hello(resquest):

   return HttpResponse("itcast V1.0")   

   

    url文件配置

admin-1@ubuntu:/data/soft# cat /data/server/itcast/itcast/urls.py

...

from test1.views import *

 

urlpatterns = [

path('admin/', admin.site.urls),

     path('hello/', hello),

]

 

3.3 项目启动

设置访问主机

# vim itcast/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/

 

 

 

4.2.3 Dockerfile案例实践

这一节,我们从环境分析、关键点分析、定制方案、Dockerfile实践这三个方面来学习

 

环境分析:

1、软件源文件,使用国外源,速度太慢,所以我们可以自己使用国内的软件源。

因为我们在手工部署的时候,使用的是官方(国外)的源,所以为了部署快一点呢,我使用国内的源。

2、软件安装,涉及到了各种软件

3、软件运行涉及到了软件的运行目录

4、项目访问,涉及到端口

 

关键点分析:

1、增加文件,使用 ADD 或者 COPY 指令

2、安装软件,使用 RUN 指令

3、命令运行,使用 WORKDIR 指令

4、项目端口,使用 EXPOSE 指令

5、容器运行,使用 ENTRYPOINT

 

定制方案:

1、基于ubuntu-ssh基础镜像进行操作

2、安装环境基本软件

3、定制命令工作目录,并增加文件

4、开放端口

5、执行项目

 

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 itcast

# 创建应用

WORKDIR /data/server/itcast

RUN python3 manage.py startapp test1

RUN sed -i "/staticfiles/a\    'test1'," itcast/settings.py

# 配置应用

COPY views.py /data/server/itcast/test1/

RUN sed -i '/t p/a\from test1.views import *' itcast/urls.py

RUN sed -i "/\]/i\    path('hello/', hello)," itcast/urls.py

# 启动项目

RUN sed -i "s#S = \[\]#S = \['*'\]#" itcast/settings.py

# 对外端口

EXPOSE 8000

# 运行项目

ENTRYPOINT ["python3","manage.py","runserver","0.0.0.0:8000"]

把Django-2.1.2.tar.gz和views.py文件放到这个目录中

效果查看

构建镜像

docker build -t ubuntu-django .

运行镜像

docker run -p 8000:8000 -d ubuntu-django

访问镜像,查看效果

 

posted @ 2020-08-16 01:59  sewen  Views(136)  Comments(0)    收藏  举报