1. 容器
1.1 什么是容器
容器是另外一种轻量级的虚拟化,容器是共用主机内核,利用内核的虚拟化技术隔离出一个独立的运行环境,拥有独立的一个文件系统,网络空间,进程空间视图等
1.2 容器与虚拟机
从虚拟化层看容器,轻量级、高性能是核心价值
容器是在Linux内核实现的轻量级资源隔离机制
虚拟机是操作系统级别的资源隔离,容器本质上是进程级的资源隔离
容器 | 虚拟机 |
---|---|
2. Docker
只能运行在 Linux 环境,即使在 windows 系统提供了 Docker Desktop,底层也是运行在 Linux 虚拟机中的
2.1 Windows下的两类容器
Windows Container
Linux Container
2.2 Docker 的三部分
2.3 Docker 基本命令
1 |
|
搜索镜像
docker search mongo
docker run 命令
1 |
|
1 |
|
busybox镜像
1 |
|
1 |
|
练习:gcc
1 |
|
练习: mysql的启动和访问
1 |
|
2.4 数据卷
Docker-managed volume(docker管理卷)
Bind mount volume(绑定挂载卷)
volumes: Docker 管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes
命令:
1 |
|
2.5 容器网络
none网络,—net=none
host网络,—net=host
bridge网络,—net=bridge , docker0 的 linux bridge
- 创建的容器默认搭在桥上,不同容器可以通信,并可以路由到宿主机及外部网络
container模式,—net=container:NAME_or_ID
- 使两个容器使用完全相同的网络,可以共享 localhost
命令:
1 |
|
1 |
|
示例
首先创建两台容器,使用自己创建的网络(172.18.0.1,网关)
1 |
|
First | Second |
---|---|
这两个容器可以 ping 通
再创建一个容器,使用默认的bridge网络
1 |
|
Third |
---|
显然无法ping通上面两个容器
可以给这个容器再加一个”网卡”,搭载在创建的网络上
1 |
|
在不同的网络中有各自的ip
现在就可以ping通了
3. 容器镜像构建与编排
3.1 由 Dockerfile 构建镜像
1 |
|
Dockerfile文件的指令
FROM
:指定基础镜像,必须为第一个命令RUN
:构建镜像时执行的命令ADD
:将本地文件添加到容器中,tar类型文件会自动解压COPY
:功能类似ADD,但是不会自动解压文件CMD
:构建容器后调用,也就是在容器启动时才进行调用ENTRYPOINT
:配置容器,使其可执行化。配合CMD可省去“application”,只使用参数,用于docker run
时根据不同参数执行不同功能LABEL
:用于为镜像添加元数据ENV
:设置环境变量EXPOSE
:指定与外界交互的端口,容器内的端口号,docker run
时加 -P 则会映射一个随机号(宿主机)VOLUME
:用于指定持久化目录,docker run时如果没有指定挂载目录,会创建一个volumeWORKDIR
:工作目录,类似于cd命令USER
:指定运行容器时的用户名或UIDARG
:用于指定传递给构建运行时的变量ONBUILD
:用于设置镜像触发器
构建镜像
1 |
|
访问http://localhost:8081/admin/
1 |
|
Docker build
docker build [OPTIONS] PATH | URL | -
- 如何编写最佳的Dockerfile:
- .dockerignore文件
- 容器只运行单个应用
- 将多个RUN指令合并为一个
- 基础镜像的标签不要用latest
- 每个RUN指令后删除多余文件
- 选择合适的基础镜像(alpine版本最好)
- 设置 WORKDIR 和 CMD
- Docker 健康检查 HEALTHCHECK 的使用方法
3.2 镜像分层
写时复制(COW,Copy-On-Write)
docker history \
将所有的 RUN 指令合并为一个
- Dockerfile 中的每个指令都会创建一个新的镜像层
- 镜像层将被缓存和复用
- 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
- 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
- 镜像层是不可变的,如果我们在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件(只是这个文件在 Docker 容器中不可见了)
优化:把变化最少的部分放在Dockerfile的前面,这样可以充分利用镜像缓存
- 例如将
RUN pip install -r requirements.txt
放在COPY . .
之前
3.3 服务编排工具,docker-compose
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排
一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目 (project)
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理
Compose 中有两个重要的概念
- 服务(service):一个应用的容器(可能会有多个容器),实际上可以包括若干运行相同镜像的容器实例
- 项目(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义
使用微服务架构的系统一般包含若干个微服务,每个微服务一般部署多个实例。如果每个服务都要手动启停,那么效率低,维护量大
docker-compose.yml
1 |
|
YAML 文件
docker-compose常用命令
- docker-compose —help
- docker-compose up -d
- 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作
- docker-compose ps、docker-compose ps —services
- docker-compose images
- docker-compose stop
- 终止整个服务集合
- docker-compose stop nginx
- 终止指定的服务(这有个点就是启动的时候会先启动 depends_on 中的容器,关闭的时候不会影响到depends_on中的)
- docker-compose logs -f [services…]
- 查看容器的输出日志
- docker-compose build [SERVICE…]
- docker-compose rm nginx
- 移除指定的容器
- docker-compose up -d —scale flask=3 organizationservice=2
- 设置指定服务运行的容器个数
ports、expose、links、depends_on
docker-compose的ports、expose、links、depends_on使用技巧