快速交付和部署html
高效虚拟化前端
可移植、可扩展node
对比传统虚拟机linux
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 通常MB | 通常GB |
性能 | 接近原生 | 弱于原生 |
系统支持量 | 单机上千个容器 | 通常几十个 |
能够总结出,docker能够实现:nginx
可见docker的 野心 是建立 ===软件程序可移植的轻量容器===,让其能够在任何安装了docker的机器上运行,而不用关心底层操做系统。git
先了解一下几个基本概念:github
镜像:是一个只读的模版,用来建立docker容器,容器在启动的时候建立一层可写层做为最上层docker
容器:从镜像建立的运行实例,能够被启动、开始、中止、删除。容器间是相互隔离的,看上去是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序shell
仓库:相似 git,集中存放镜像文件的场所,分为公开仓库(Public)和私有仓库(Private),最大的公开仓库是 Docker Hub数据库
注册服务器:相似GitHub 这样的托管服务,存放着多个仓库
宿主机:docker所在的服务器
数据卷:可供一个或多个容器使用的特殊目录,相似于 Linux 下对目录或文件进行 mount,它绕过 UFS,能够提供不少有用的特性:
- 在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用
网络模式:用来实现容器的网络通讯,大概包括五种:
- bridge模式,--net=bridge(默认)
- host模式,--net=host
- none模式,--net=none
- 其余容器模式(即container模式),--net=container:NAME_or_ID
- 用户自定义:docker 1.9版本之后新增的特性
Dockerfile:易于自动化的命令,包含建立镜像所需的所有指令,基于dockerfile中的指令,咱们可使用
$ docker build
命令来建立镜像,经过减小镜像和容器的建立过程来简化部署。语法命令:
- INSTRUCTION argument 指令不区分大小写,但命名约定为所有大写
- FROM
- 格式为
FROM <image>
或FROM <image>:<tag>
- 第一条指令必须为
FROM
指令。而且,若是在同一个Dockerfile中建立多个镜像时,可使用多个FROM
指令(每一个镜像一次)- MAINTAINER
- 格式为
MAINTAINER <name>
,指定维护者信息- RUN
- 格式为
RUN <command>
或RUN ["executable", "param1", "param2"]
- 前者将在 shell 终端中运行命令,即
/bin/sh -c
;后者则使用exec
执行。指定使用其它终端能够经过第二种方式实现,例如RUN ["/bin/bash", "-c", "echo hello"]
- 每条
RUN
指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可使用 \ 来换行- CMD
CMD ["executable","param1","param2"]
使用exec
执行,推荐方式CMD command param1 param2
在/bin/sh
中执行,提供给须要交互的应用CMD ["param1","param2"]
提供给ENTRYPOINT
的默认参数- 指定启动容器时执行的命令,每一个 Dockerfile 只能有一条
CMD
命令。若是指定了多条命令,只有最后一条会被执行- 若是用户启动容器时候指定了运行的命令,则会覆盖掉
CMD
指定的命令- EXPOSE
- 格式为
EXPOSE <port> [<port>...]
- 告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时须要经过 -P,Docker 主机会自动分配一个端口转发到指定的端口
- ENV
- 格式为
ENV <key> <value>
。 指定一个环境变量,会被后续RUN
指令使用,并在容器运行时保持。- ADD
- 格式为 ADD
<src> <dest>
- 该命令将复制指定的
<src>
到容器中的<dest>
。 其中<src>
能够是Dockerfile所在目录的一个相对路径;也能够是一个 URL;还能够是一个 tar 文件(自动解压为目录)- COPY
- 格式为
COPY <src> <dest>
- 复制本地主机的
<src>
(为 Dockerfile 所在目录的相对路径)到容器中的<dest>
。当使用本地目录为源目录时,推荐使用COPY
,能用COPY
的状况下不用ADD
- ENTRYPOINT
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
(shell中执行)- 配置容器启动后执行的命令,而且不可被
docker run
提供的参数覆盖- 每一个 Dockerfile 中只能有一个
ENTRYPOINT
,当指定多个时,只有最后一个起效- VOLUME
- 格式为
VOLUME ["/data"]
- 建立一个能够从本地主机或其余容器挂载的挂载点,通常用来存放数据库和须要保持的数据等
- USER
- 格式为
USER daemon
- 指定运行容器时的用户名或 UID,后续的
RUN
也会使用指定用户- 当服务不须要管理员权限时,能够经过该命令指定运行用户。而且能够在以前建立所须要的用户,例如:
RUN groupadd -r postgres && useradd -r -g postgres postgres
。要临时获取管理员权限可使用gosu
,而不推荐sudo
- WORKDIR
格式为
WORKDIR /path/to/workdir
为后续的 RUN、CMD、ENTRYPOINT 指令配置工做目录
可使用多个 WORKDIR 指令,后续命令若是参数是相对路径,则会基于以前命令指定的路径。例如:
WORKDIR /a
WORKDIR b
WORKDIR c
则最终路径为 /a/b/c
- ONBUILD
格式为
ONBUILD [INSTRUCTION]
配置当所建立的镜像做为其它新建立镜像的基础镜像时,所执行的操做指令
例如,Dockerfile 使用以下的内容建立了镜像
image-A
:[...] ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/node-build --dir /app/src [...] 复制代码
若是基于 image-A 建立新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令:
FROM image-A #Automatically run the following ADD . /app/src RUN /usr/local/bin/node-build --dir /app/src 复制代码
使用
ONBUILD
指令的镜像,推荐在标签中注明,例如ruby:1.9-onbuild
编写完成 Dockerfile 以后,能够经过
$ docker build
命令来建立镜像
- 基本的格式为
$ docker build [选项] 路径
,该命令将读取指定路径下(包括子目录)的 Dockerfile,并将该路径下全部内容发送给 Docker 服务端,由服务端来建立镜像。所以通常建议放置 Dockerfile 的目录为空目录。也能够经过.dockerignore
文件(每一行添加一条匹配模式)来让 Docker 忽略路径下的目录和文件- 例如:
$ docker build -t ${dockerImageName} --force-rm -f ./Dockerfile .
=========================================================
以上是一些基本概念,如今ubuntu下开始安装docker并启动一个nginx容器(其实大多数场景下nginx不必跑在容器里,这里只是举个例子)
=========================================================
$ cat /etc/issue
Ubuntu 16.04.6 LTS \n \l
复制代码
经过shell命令安装:
$ curl -sSL https://get.docker.com/ | sh
检验安装,显示版本信息,说明已成功安装:
$ docker -v
Docker version 18.09.5, build e8ff056
复制代码
ps:$ docker info
可查看更多信息
下面开始建立一个容器:
$ docker run❶ \
-d❷ \
--name=demo❸ \
-u root❹ \
-p 8002:80❺ \
-v /var/demo:/var/demo❻ \
nginx:latest❼
复制代码
该命令表示:基于nginx:latest这个镜像,建立一个名称为demo的容器,并把容器内部的80端口与宿主机上的8002端口作映射,使得经过宿主机8002端口的流量转发到容器内部的80端口上
❶:
run
新建并启动容器,更多选项,其标准过程:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载(docker pull xxx)
- 利用镜像建立并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
❷:
-d
Daemonized模式,以守护态形式在后台运行容器
❸:
--name=demo
为容器起一个名字
❹:
-u
指定容器的用户
❺:
-p
端口映射,规则是 -p 宿主机端口:容器端口,可屡次使用映射多个端口
❻:
-v
挂载数据卷,规则是 -v 宿主机目录:容器目录,可屡次使用挂载多个数据卷
❼:镜像名,该容器所用的镜像名,可经过
$ docker images
查看本地镜像
查看正在运行的容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c24cfee8226a nginx:latest "nginx -g 'daemon of…" 6 minutes ago Up 6 minutes 0.0.0.0:8002->80/tcp demo
复制代码
ps:$ docker ps -a
查看全部容器(包括正在运行的、已中止的)
如今访问宿主机的8002端口(安全组开通),便可看到nginx的欢迎页面:
进入容器:
执行 $ docker exec -it demo bash
,demo也能够换成容器的id即:$ docker exec -it c24cfee8226a bash
在容器内可执行 $ netstat -lntp
查看端口使用状况:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1/nginx: master pro
复制代码
若发现netstat not found,先执行 $ apt update && apt install net-tools
执行 $ exit
退出容器
ps经常使用命令:
$ docker inspect demo
能够查看该容器更多信息$ docker stop 容器名/id
终止容器$ docker rm 容器名/id
删除未运行的容器$ docker rmi 镜像名/id
删除未占用(无容器正在运行)的镜像$ docker rmi $(docker images -f "dangling=true" -q)
批量删除为 none
(无容器正在运行)的镜像【参考】:
===🧐🧐 文中不足,欢迎指正 🤪🤪===