- Docker
Docker是一个开发,运输和运行应用程序的开放平台
Linux容器是基于Linux内核,对进程进行封装隔离,Docker在容器的基础上,进行进一步封装,提供简单易用的容器使用接口
Cgroup技术是用来制造约束的主要手段,Namespace技术是用来修改进程视图的主要方法
- 提供一次性的环境
- 提供弹性的云服务
- 组建微服务架构
-
安装 VirtualBox
-
安装 Vagrant
新建目录--> vagrant init centos/7(生成vagrant file) --> vagrant up(下载并打开虚拟机)--> vagrant ssh(进入虚拟环境)
Vagrant库 -
其他命令:
vagrant status
vagrant destroy
vagrant ssh -
安装Docker
CLI使用Docker REST API通过脚本或直接CLI命令控制Docker守护程序或与Docker守护程序交互。许多其他Docker应用程序使用底层API和CLI。
- 后台守护进程(dockerd)
- REST API Server,和daemon进行通信
- 命令行界面 (docker)
守护程序创建和管理Docker对象,例如image,container,network和data volumes
- 文件和meta data的集合
- 分层的,并且每一层都可以添加改变删除文件,成为一个新的image
- 不同的image可以共享相同的layer
- image本身是只读的
- Build form Dockerfile
docker build -t name:tag .
- Pull form Registry
docker pull image
- docker image ls
- docker image rm [imageName]
- 通过Image创建
- 在Image layer之上建立一个container layer(可读写)
- Image负责app的存储和分发,Container负责运行app
- docker commit [image name] [new image]
把修改过的container创建image - docker inspect [container id] 获取container详细信息
# 制作base image FROM python:2.7-slim # 指定工作路径 WORKDIR /app # 复制当前目录内容到指定路径 COPY . /app # 运行命令,会生成新的分层 RUN pip install --trusted-host pypi.python.org -r requirements.txt # 暴露端口供外界访问 EXPOSE 80 # 定义环境变量 ENV NAME World # 指定在容器中运行命令或提供参数 CMD ["python", "app.py"]
LABEL:给镜像添加标签
LABEL com.example.version="0.0.1-beta"
LABEL vendor1="ACME Incorporated"
RUN:执行命令并创建新的Image Layer
RUN apt-get update && apt-get install -y \
package-bar \
package-baz \
package-foo
CMD:设置容器启动后默认执行的命令和参数
ENTRYPOINT:设置容器启动时运行的命令,CMD则提供参数
ADD&©:功能相似,ADD具有解压功能
docker exec -it [container id] /bin/bash docker exec -it [container id] python
ping :验证ip的可达性
ping [ip地址]
telnet:验证服务的可用性
telnet [ip] [port]
容器有独立的网络命名空间,并且能相互ping通
ip a查看网络
单机通信网络默认的三种driver bridge
# none只可以通过exec访问容器,其他方式无法访问 docker run -d --name test --network none busybox /bin/sh -c "while true; do sleep 3600; done"
# host和主机共享网络命名空间,端口会发生冲突 docker run -d --name test --network host busybox /bin/sh -c "while true; do sleep 3600; done"
bridge
创建容器默认会连接bridge,通过veth pair进行连接,通过NAT访问外网,本地可访问bridge网络
docker network ls //查看network列表 docker network inspect [network id] //查看network的详细信息 brctl show //查看所有bridge网络的详细信息
docker network create -d bridge my-bridge //创建bridge网络 docker run -d --name test3 --network my-bridge busybox /bin/sh -c "while true; do sleep 3600; done" //指定network docker network connect my-bridge test2 //加入自定义bridge的容器自动link,既可以使用名字代替ip地址
- overlay网络和etcd实现(有时间再研究4-10)
#创建两个容器,test2容器通过--link 指定test1,在test2容器内部就可以使用test1替代test1容器的ip地址 docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done" docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600; done"
docker run --name web -d -p 8080:80 nginx //容器80端口映射本地8080端口
详见下一章
可以在执行Docker create或Docker run时,通过-v参数将主句的目录作为容器的数据卷。
- 受管理的data Volume,由docker后台自动创建。
# 通过Dockerfile指定volume Dockerfile: 容器内部路径 VOLUME /var/lib/mysql # 查看volume列表 docker volume ls # volume名字默认是随机生成的,可以指定名字【mysql】 docker run -v mysql:/var/lib/mysql --name mysql1 mysql # 这样可以使用名字叫【mysql】的volume docker run -v mysql:/var/lib/mysql --name mysql2 mysql
- 绑定挂载的Volume,具体挂载位置可以由用户指定。
docker run -v [本地目录]:[容器目录]
Docker Compose是一个工具 可以通过yml文件定义多容器的docker应用 通过yml文件的定义去创建或者管理多个容器
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
version: '3'
services:
wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridgeversion: "3" services: redis: image: redis web: build: context: . dockerfile: Dockerfile ports: - 8080:5000 environment: REDIS_HOST: redis
- Services
一个service代表一个container
Service的启动类似docker run,可以指定network和volume
- Networks
- Volumes
# 根据-f指定的yml文件启动,默认【docker-compose.yml】,可不加-f
docker-compose -f docker-compose.yml up [-d]# 获取docker compose列表
docker-compose ps# 停止并移除 docker-compose down # 停止 docker-compose stop
# 在运行的容器中执行命令,不用加-it docker-compose exec mysql bash
采用模板2的docker-compose.yml,并把ports移除
# 启动三个web服务
docker-compose up scale web=3 -d Docker Swarm是Docker引擎内置的集群管理和编排工具
- Vagrant + Virtualbox
- Docker Machine + Virtualbox
- play with docker
#选择一台Docker主机作为管理节点,并在管理节点初始化一个Swarm集群
docker swarm init --advertise-addr=19.168.217.100#添加两个Docker主机作为工作节点,在工作节点输入以下命令加入集群
docker swarm join --token SWMTKN-1-2gdd5d7zgvq6e4pemhd4w7527a60h7nh97arxolfmuhfx8i46s-1whpjrp8nhajagvgiwuo3f6d0 19.168.217.100:2377#进入管理节点查看集群
docker node ls使用docker service命令管理Swarm集群,只能在管理节点运行
#新建服务,在Swarm集群运行一个名为nginx的服务
docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine#查看服务列表 docker service ls ID NAME MODE REPLICAS IMAGE PORTS kc57xffvhul5 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
#查看某个服务详情
docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
pjfzd39buzlt nginx.1 nginx:1.13.7-alpine swarm2 Running Running about a minute ago
hy9eeivdxlaa nginx.2 nginx:1.13.7-alpine swarm1 Running Running about a minute ago
36wmpiv7gmfo nginx.3 nginx:1.13.7-alpine swarm3 Running Running about a minute ago#服务伸缩
docker service scale nginx=5 #删除服务
docker service rm nginx Kubernetes是一个可移植,可扩展的开源平台,用于管理容器化工作负载和服务,有助于声明性配置和自动化。 * 容器的平台 * 微服务平台 * 便携式云平台
- API Server
k8s控制集群的前端组件,用于水平扩展集群
- etcd
一致且高可用的键值存储,用于k8s所有集群数据的后备存储
- Scheduler管理
监控新建的没有分配节点的pod,挑选节点让其运行
- Controller-manager
运行controller的组件
Node Controller:当节点出现故障时复杂通知和响应
Replication Controller:负责为系统中的每个复制控制器对象维护正确数量的pod
Endpoint Controller:连接Services和pods
Service Account & Token Controllers:为新命名空间创建默认帐户和API访问令牌 - kubelet
负责维持容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理
- kube-proxy
负责为 Service 提供 cluster 内部的服务发现和负载均衡
-
安装kubectl
kubectl cluster-info //检查集群状态
kubectl config use-context minikube //使用minikube作为context
kubectl config view //当前config的详情
kubectl config get-contexts //查看当前存在的context
kubectl create -f pod_nginx.yml //根据yml文件创建
kubectl get pods [-o wide] //获取pod的[详细]信息
kubectl describe pods nginx //获取某个资源的详细描述 -
安装Minikube
minikube ssh //进入虚拟机
Kubernetes对象模型中最小的可部署对象,Pod为其组成容器提供两种共享资源:网络和存储
- 运行单个容器的Pod
- 运行多个需要协同工作的容器的Pod,封装由多个共址容器组成的应用程序,这些容器紧密耦合并需要共享资源
apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: containers: - name: myapp-container image: busybox command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
ReplicationController确保一次运行指定数量的pod副本
apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 selector: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
ReplicaSet确保一次运行指定数量的pod副本
apiVersion: apps/v1 kind: ReplicaSet metadata: name: nginx labels: tier: frontend spec: replicas: 3 selector: matchLabels: tier: frontend template: metadata: name: nginx labels: tier: frontend spec: containers: - name: nginx image: nginx ports: - containerPort: 80
为Pod和ReplicaSet提供声明性更新
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.12.2 ports: - containerPort: 80
Service 是对一组提供相同功能的 Pods 的抽象,并为它们提供一个统一的入口。借助 Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service 通过标签来选取服务后端,一般配合 Replication Controller 或者 Deployment 来保证后端容器的正常运行。这些匹配标签的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上
kind: Service apiVersion: v1 metadata: name: my-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376
- ClusterIP
默认类型,自动分配一个仅 cluster 内部可以访问的虚拟 IP
- NodePort
- LoadBalancer
在支持外部负载均衡器的云提供商上,将类型字段设置为LoadBalancer将为您的服务配置负载均衡器
- hostPath
apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: k8s.gcr.io/test-webserver name: test-container volumeMounts: - mountPath: /test-pd name: test-volume volumes: - name: test-volume hostPath: # directory location on host path: /data # this field is optional type: Directory
PV描述的是持久化存储数据卷,这个api对象主要定义的是一个持久化存储在宿主机上的目录,比如一个NFS的挂载目录
PVC描述的是Pod所希望使用的持久化存储的属性
| 项目名 | 介绍 |
|---|---|
| 基于python flask和redis的web应用部署 | 多容器复杂应用的部署 |
| 负载均衡案例 | Docker Compose |
| 投票案例 | Docker Compose复杂应用 |