为了更好的理解,在正式开始之前,先熟悉下相关概念
镜像(Image)、容器(Container)、仓库(Repository)。
1.1镜像
docker镜像是使用Dockerfile脚本,将你的应用以及应用的依赖包构建而成的一个应用包,它通常带有该应用的启动命令。而这些命令会在容器启动时被执行,也就是说你的应用在启动容器时被启动。
镜像的创建,需要通过配置Dockerfile脚本,然后执行docker build
命令来创建。
1.2 容器
容器提供的核心概念是隔离,提供三种隔离类型:
- 工作区隔离(流程、网络)
- 资源隔离(cpu\内存)
- 文件系统隔离(联合文件系统)
不仅可以分发应用程序,还可以以实用的方式交付运行应用程序所需的整个环境。
容器是使用 docker run --name 容器名 镜像
命令创建的,独立于宿主机(服务器)的沙箱,也可以理解为一个带有特殊结构的盒子,主要作用就在于给镜像提供运行空间和环境,并执行镜像的指令。
1.3 仓库
不是存容器,而是存储docker镜像。
可以把docker镜像通过push命令推送到docker仓库,也可以通过用docker命令pull 把镜像拉取下来。
关系
使用docker前,你必须先安装它。
首先要有镜像,有了镜像才能基于镜像创建容器,才能把镜像存储在仓库。(镜像是基础,容器是镜像使用者,仓库是镜像的管理员。)
基础镜像通常不需要自己创建,docker官方有提供很多基础镜像供用户使用,比如nodejs镜像,java镜像,mongodb镜像,nginx镜像等等
二 镜像
而创建镜像,首先得配置Dockerfile脚本。镜像是基于Dockerfile脚本来构建的。
2.1 基础镜像
docker有这么一种机制,在构建镜像时,它可以依赖一个父镜像作为底层镜像,与当前正要被构建的镜像一起打包,从而构建成一个全新的镜像。而这个被用作依赖的父镜像,就是基础镜像。
可以理解为,一个应用它不是随处可运行的,它的运行需要依赖操作系统环境和对应的依赖().
- 因此,在配置项目Dockerfile创建镜像脚本之前,需要先确立一个基础镜像。主要是通过在Dockerfile脚本中使用From命令指定依赖一个父镜像(基础镜像)。
- 基础镜像通常不需要自己创建,docker官方有提供很多基础镜像供用户使用,比如nodejs镜像,java镜像,mongodb镜像,nginx镜像等等.
2.2 Dockerfile脚本构成
docker镜像是通过配置Dockerfile脚本,然后执行docker build
命令来创建的。
Dockerfile脚本通常分为以下四部分:
- 基础镜像信息 --只有一个From指令,指定依赖的基础镜像
- 维护者信息 --只有一个MAINTAINER指令,用于描述该镜像的维护者信息
- 镜像操作指令 --很多:
- 容器启动时执行的指令
- --CMD 每个 Dockerfile 只能有一条 CMD 命令,可被 docker run 提供的参数覆盖。
- ENTRYPOINT 它不会被 docker run 提供的参数覆盖
以下介绍镜像操作指令:
COPY
COPY指令用于拷贝宿主机的源目录/文件到容器内的某个目录。接受两个参数,源目录路径和容器内目录路径。
ADD
功能和用法与COPY指令基本相同,不同在于使用ADD指令拷贝时,如果拷贝的是压缩文件,拷贝到容器中时会自动解压为目录。
WORKDIR
指定RUN、CMD、ENTRYPOINT 指令的工作目录
RUN
RUN是核心指令,它接受命令作为参数并用于创建镜像。命令较多时可用""换行。
USER
USER命令用于设置运行容器的UID。
VOLUME
VOLUME命令用于让你的容器访问宿主机上的目录。一般用来存放数据库和需要保持的数据等
ONBUILD
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
ENV
ENV命令用于设置环境变量,在容器内被脚本或者程序调用。
EXPOSE
EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。
2.3 镜像的创建
镜像是基于Dockerfile脚本,使用docker build
命令创建的。上面已经对Dockerfile做了介绍。下面来说说如何使用Dockerfile脚本创建。
语法:
docker build [OPTIONS] PATH
PATH为Dockerfile脚本所在的目录,通常放在项目根目录下,使用"."表示。
-t 标记,用来添加tag,指定新的镜像信息,比如镜像名称,标签。
2.4 本地镜像的管理
- 1,查看镜像:docker images
- 2,删除镜像:docker rmi 镜像
- 3,镜像重命名:docker tag 原镜像tag 新镜像tag
- 4,查看镜像创建历史:docker history 镜像
- 5,镜像归档:docker save 镜像
- 6,基于归档文件创建镜像:docker import 归档文件 新镜像tag
2.5 镜像的使用
镜像通过docker run
命令使用的,这是关于容器部分的操作。
三 demo验证
我本地做测试用的:Nginx demo
我们要部署的服务是用 Nginx 来 server 一个简单的 HTML 文件 html/index.html
。
3.1 准备工作,打开一个终端:
$ mkdir docker-demo
$ cd docker-demo
$ mkdir html
$ echo '<h1>Hello Docker!</h1>' > html/index.html
生成一个页面。
3.2 接下来在当前目录创建一个叫 Dockerfile 的新文件
FROM nginx
COPY html/* /usr/share/nginx/html
from 相关知识参照上一篇。
第二行把我们的静态文件复制到镜像的 /usr/share/nginx/html
目录下。也就是 Nginx 寻找静态文件的目录。
3.3 构建镜像
$ docker build -t docker-demo:0.1 .
最好在刚才创建的这个目录中运行 docker build
。如果是其他目录,docker 会把当前目录的所有文件作为上下文发送给负责构建的后台进程。
3.4. 查看镜像
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-demo 0.1 54c5fe4fd4d0 13 minutes ago 126MB
nginx latest c7460dfcab50 6 days ago 126MB
这行命令中的名称 docker-demo
可以理解为这个镜像对应的应用名或服务名,0.1
是标签。
3.5. 运行镜像
docker run --name docker-demo -d -p 8080:80 docker-demo:0.1
打开浏览器,输入:http://127.0.0.1:8080/
查看 运行的容器
docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c95072fb6ac docker-demo:0.1 "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 0.0.0.0:8080->80/tcp docker-demo
如果要停止并 删除
$ docker container stop docker-demo
$ docker container rm docker-demo