理解Docker 和 DokcerFIle讲解
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
关于docker理解
一、首先是关于虚拟化
虚拟化我们可以简单的理解为一种资源管理方式。有如下几种虚拟化的方式:
1.完全虚拟化:对底层硬件实现完全的虚拟。例如:Vmware Workstation
2.部分虚拟化:只对部分硬件资源的虚拟。
3.操作系统级虚拟化:内核通过创建多个虚拟操作系统实例来隔离各个进程。
docker就是属于操作系统级的虚拟化。
在计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化 (hypervisor virtualization,HV)有所不同,管理程序虚拟化通过中间层将一台或者多台独立 的机器虚拟运行与物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。因 此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行 在同一台宿主机上。
二、其次是对docker的理解
docker的思想来源于集装箱,试问集装箱解决了什么问题?
试想,在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会相互影响。那么我就不需要专门运送水果的船和专门运送化学物品的船了。只要这些货物在集装箱里装的好好的,那我就可以用一艘大船把它们都运走。docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮,而docker就是集装箱。
Docker的优点:
1.更快速地交付和部署
不同的应用程序可能会有不同的应用环境。比如,.net开发的网站和.php开发的网站所依赖的软件就不一样,如果把他们所依赖的软件都安装在一个服务器上,就要调试很久,不仅麻烦,还会造成一些诸如IIS和Apache访问端口冲突这样的问题。这个时候你就要隔离.net开发的网站和.php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机并在不同的虚拟机上部署不同的应用,但是虚拟机开销比较大。此时docker就可以实现虚拟机隔离不同应用的这种功能,并且开销比虚拟机小,小就意味着省钱。
2.更轻松的迁移和扩展
我们再来举个简单的例子。比如你开发的时候用的是Ubuntu,但是运维管理的都是CentOS,运维在把你开发的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转CentOS的问题,比如:存在一个特殊版本的数据库,只支持Ubuntu而不支持CentOS,那么在转移的过程中就得想办法解决这样的问题。但这时候如果有docker,你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
3.更高效的虚拟化和更简单的管理
在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会被有效的利用起来。而且Docker容器的运行不需要额外的hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
Docker的三个基本概念:
镜像、容器、仓库
三、Docker的三个基本概念的详解
1.镜像
Docker在英语当中的本意是“物件/码头工人”,docker容器的意思为物件的容器。关于镜像,举个简单的例子,我们经常安装的windows操作系统,先要从网上下载ISO镜像文件,经解压后才能安装和使用。Docker也是一样,我们要向创建docker容器,就需要创建容器的类似于ISO镜像文件的docker镜像文件。
2.容器
关于容器,大家肯定并不陌生。没错,docker容器就是来管理不同架构的应用程序的。从本质上来说,容器是从镜像创建的运行实例。容器与容器之间是相互隔离的,每个容器都是保证安全的平台。
3.仓库
关于仓库,就是可以存储镜像的仓库,可以自己搭建harbor,阿里云仓库,docker官方仓库等等,便于拉取部署等
而真正能理解docker的本质是进程,必须具备的是linux的基础知识,从基础知识角度来进行理解,否则就是雾里看花,糊里糊涂。
docker的两大关键技术是Namespace和cgroup,以及docker的关键创新镜像。这里不做过多的研究,有兴趣的朋友可以自行查询,如下提供的连接当中也有资料
四. django 部署Docker部署
docker file示例:
# 建立 python3.9 环境 FROM python:3.9 # 镜像作者 MAINTAINER HanZeng # 设置 python 环境变量 ENV ceds_env product # 设置pip源为国内源 COPY pip.conf /root/.pip/pip.conf # 在容器内创建mysite文件夹 RUN mkdir -p /home/ceds # 设置容器内工作目录 WORKDIR /home/ceds # 将当前目录文件加入到容器工作目录中(. 表示当前宿主机目录) ADD . /home/ceds # pip安装依赖 RUN pip install -r requirements.txt EXPOSE 8080 ENTRYPOINT python ./backend/manage.py runserver 0.0.0.0:8080 # CMD ["uwsgi", "--ini", "/home/ceds/backend/uwsgi.ini"]
0. docker file
FROM 功能为指定基础镜像,并且必须是第一条指令。 如果不以任何镜像为基础,那么写法为:FROM scratch。 FROM <image> FROM <image>:<tag> FROM <image>:<digest> 三种写法,其中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest MAINTAINER 指定作者 MAINTAINER <name> LABEL 功能是为镜像指定标签 LABEL <key>=<value> <key>=<value> <key>=<value> ... 一个Dockerfile种可以有多个LABEL,如下: LABEL "com.example.vendor"="ACME Incorporated" LABEL com.example.label-with-value="foo" LABEL version="1.0" LABEL description="This text illustrates \ that label-values can span multiple lines." 但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号 如下: LABEL multi.label1="value1" \ multi.label2="value2" \ other="value3" ADD 一个复制命令,把文件复制到镜像中。 如果把写成一个url,那么ADD就类似于wget命令 示例 ADD test relativeDir/ ADD test /relativeDir ADD http://example.com/foobar /
COPY 看这个名字就知道,又是一个复制命令 COPY <src>... <dest> COPY ["<src>",... "<dest>"] EXPOSE 功能为暴漏容器运行时的监听端口给外部 但是EXPOSE并不会使容器访问主机的端口 如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数 EXPOSE <port>/<tcp/udp> ENV 功能为设置环境变量 语法有两种: ENV <key> <value> ENV <key>=<value> ... RUN 功能为运行指定的命令 RUN命令有两种格式 RUN <command> RUN ["executable", "param1", "param2"] CMD 功能为容器启动时默认命令或参数 语法有三种写法 CMD ["executable","param1","param2"] CMD ["param1","param2"] CMD command param1 param2 RUN&&CMD 不要把RUN和CMD搞混了。 RUN是构件容器时就运行的命令以及提交运行结果 CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子 ENTRYPOINT 功能是:容器启动时运行得启动命令 ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 VOLUME 可实现挂载功能,可以将宿主机目录挂载到容器中 说的这里大家都懂了,可用专用的文件存储当作Docker容器的数据存储部分 VOLUME ["/data"] VOLUME ["/var/log/"] VOLUME /var/log VOLUME /var/log /var/db USER 设置启动容器的用户,可以是用户名或UID,所以,只有下面的两种写法是正确的 USER daemo USER UID WORKDIR 设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。 WORKDIR /path/to/workdir ARG 设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg =来指定参数 如果用户在build镜像时指定了一个参数没有定义在Dockerfile种,那么将有一个Warning ARG <name>[=<default value>] ONBUILD 这个命令只对当前镜像的子镜像生效。 比如当前镜像为A,在Dockerfile种添加: ONBUILD RUN ls -al 这个 ls -al 命令不会在A镜像构建或启动的时候执行 此时有一个镜像B是基于A镜像构建的,那么这个ls -al 命令会在B镜像构建的时候被执行。 STOPSIGNAL STOPSIGNAL命令是的作用是当容器停止时给系统发送什么样的指令,默认是15 STOPSIGNAL signal HEALTHCHECK 容器健康状况检查命令 语法有两种: HEALTHCHECK [OPTIONS] CMD command HEALTHCHECK NONE HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1
1. 进入项目跟目录,编译镜像
docker build -t ceds_img:v1.0.0 .
2. 运行镜像
docker run -it -d -p 8080:8080 --name ceds ceds_img:v1.0.0
3. docker基础操作
查看镜像 docker image ls 拉取镜像 docker image pull 删除镜像 docker image rm 镜像名或镜像id 进入已运行的容器 docker exec -it 容器名或容器id 进入后执行的第一个命令 docker exec -it ceds_img /bin/bash 查看容器 # 列出本机正在运行的容器 docker container ls # 列出本机所有容器,包括已经终止运行的 docker container ls --all 停止与启动容器 # 停止一个已经在运行的容器 docker container stop 容器名或容器id # 启动一个已经停止的容器 docker container start 容器名或容器id # kill掉一个已经在运行的容器 docker container kill 容器名或容器id 删除容器 docker container rm 容器名或容器id 容器保存为镜像 docker commit 容器名 镜像名 镜像备份与迁移 docker save -o 保存的文件名 镜像名 如 docker save -o ./ubuntu.tar ubuntu 在拿到镜像文件后,可以通过load方法,将镜像加载到本地 docker load -i ./ubuntu.tar
来自资料: https://www.msdn.hk/jshtml/jswz/2574.html https://www.jianshu.com/p/a1a9be9f667a

浙公网安备 33010602011771号