容器化部署 docker docker-compose k8s
所属分类 k8s
浏览量 469
docker docker-compose DockerSwarm k8s
docker 单个容器
Docker Compose 通过配置文件 docker-compose.yml 来管理多个 Docker 容器,
在配置文件yml中,所有的容器通过service来进行定义,统一管理多个容器的配置,如网络、数据卷、执行指令、环境变量、资源限制等,
然后使用 docker-compose 脚本来启动、停止、重启、监控应用以及应用中的服务和所依赖的容器等,
不用每次要运行多个容器时而重复写大量命令。
Docker Compose 只能管理当前主机上的容器
DockerSwarm 用来管理Docker集群,很少用 ,被 k8s 取代
k8s 容器集群管理系统, 管理多主机的 Docker 容器。
能够实现自动化部署、扩展和维护容器集群等功能 ,提供服务之间的负载均衡,
Docker 部署服务
springboot 应用打包
Dockerfile 编写
FROM java:8
MAINTAINER codefun007
ADD demo-0.0.1-SNAPSHOT.jar demo.jar
# 暴露端口8090,推荐在docker run时通过 -p 进行端口暴露
EXPOSE 8090
# 容器启动后执行的命令
ENTRYPOINT ["java", "-jar", "demo.jar"]
构建镜像
docker build -t demo1:0.0.1 .
-t 指定镜像 名称 标签
-f 指定dockerfile
docker images 查看镜像
docker run --name 容器名称 -p 8090:8090 镜像名称 -it
-p 指定容器端口和宿主机端口映射 宿主机端口:容器端口
--name 指定容器名
-it 进入容器并且终端输入命令执
-v -v /data:/data 宿主机目录:容器目录 ,没有目录自动创建。如果容器操作文件夹没有权限,要加 --privileged=true 关闭安全权限
-d 后台运行
-net 指定网络方式 none/host/bridge
none 不会进行任何网络配置,其没有网卡、没有IP也没有路由,无法与外界通信,需要手动添加网卡配置IP等,不推荐使用。
host
不会创建自己独立的虚拟网卡,直接使用宿主机的网卡和IP地址,访问容器时直接访问 宿主机IP:容器端口
此模式的网络性能最高,但是各容器之间端口不能相同。在做容器迁移时,不方便,不推荐使用。
bridge 默认网络模式
Docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,
当创建容器时会从 docker0 子网中分配一个 IP 给容器使用,并将容器连接到虚拟网桥 docker0 与外界通信,每个容器的IP不相同。
这种方式用的比较多,但是默认的 bridge 网络有局限性,比如不能通过容器名连接访问,
可以通过创建自定义网络进行连接访问 docker network create demo_bridge
Docker Compose 部署服务
docker-compose.yml
主要分为如下三个部分
version 描述当前docker-compose.yml的版本号
services 可以自定义一个或多个服务
networks 定义使用的网络
version: '3'
services:
demo2:
image: demo2:0.0.1
networks:
- demo_net
# 映射端口 宿主机端口:容器内部端口
ports:
- 8092:8092
# Docker重启时,容器自动启动
restart: always
# 网络
networks:
# 网络名称
demo_net:
external: false
进入docker-compose.yml所在目录
docker-compose up -d
启动 docker-compose.yml 编排的所有容器
-d,daemon模式,后台运行,
docker-compose常用命令:
# 启动服务
docker-compose up
# 启动服务 后台运行
docker-compose up -d
# 查看服务的启动日志
docker-compose logs -f
# 查看指定容器的启动的日志
docker logs -f 容器id
# 查看指定容器的启动的日志 ( 最后 n 条日志)
docker logs -f --tail n 容器id
# 停止compose服务
docker-compose stop
# 重启compose服务
docker-compose restart
# kill compose服务
docker-compose kill
# 查看compose服务状态
docker-compose ps
# 删除compose服务
docker-compose rm
K8s 部署服务
通过 kubectl apply 命令部署
通过 Kubesphere 平台部署
通过 kubectl apply 命令部署
demo.yml
apiVersion: apps/v1
kind: Deployment # 声明一个 Deployment 资源对象
metadata:
name: deployment-myapp
spec:
replicas: 2 # 声明 pod 个数是2
selector: # 通过标签选择被控制的 pod
matchLabels:
app: myapp
template: # 在template中定义 pod
metadata:
labels:
app: myapp # 给pod打上标签 myapp
spec:
containers:
- name: myapp # 声明容器名称,注意不是pod名称,pod名称应该定义在metadata中
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
kubectl apply -f demo.yml
查看 Pod 信息
kubectl get pods
完整yaml文件模板
apiVersion: v1 # 必选,版本号,例如v1
kind: string # 必选,Pod类型,有 Pod/Deployment/Service。Kubernetes 使用 Pod 来管理容器,每个 Pod 可以包含一个或多个紧密关联的容器。
metadata: # 必选,元数据
name: string # 必选,名称
namespace: string # 必选,所属的命名空间
labels: # 自定义标签
- name: string # 自定义标签名字
annotations: # 自定义注释列表
- name: string
spec: # 必选,Pod中容器的详细定义
containers: # 必选,容器列表
- name: string # 必选,容器名称
image: string # 必选,容器的镜像名称
imagePullPolicy: string # 获取镜像的策略,可填Always/Never/IfNotPresent。Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
command: [string] # 容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] # 容器的启动命令参数列表
workingDir: string # 容器的工作目录
volumeMounts: # 挂载到容器内部的存储卷配置
- name: string # 引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string # 存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean # 是否为只读模式
ports: # 需要暴露的端口号列表
- name: string # 端口号名称
containerPort: int # 容器需要监听的端口号
hostPort: int # 容器所在主机需要监听的端口号,默认与Container相同
protocol: string # 端口协议,支持TCP和UDP,默认TCP
env: # 容器运行前需设置的环境变量列表
- name: string # 环境变量名称
value: string # 环境变量的值
resources: # 资源限制和请求的设置
limits: # 资源限制的设置
cpu: string # cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string # 内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: # 资源请求的设置
cpu: string # Cpu请求,容器启动的初始可用数量
memory: string # 内存清楚,容器启动的初始可用数量
livenessProbe: # 对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
exec: # 对Pod容器内检查方式设置为exec方式
command: [string] # exec方式需要制定的命令或脚本
httpGet: # 对Pod内部容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: # 对Pod内部容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 # 容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0 # 对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0 # 对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged:false
restartPolicy: string # 重启策略,可填 Always/Never/OnFailure。Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
nodeSelector: obeject # 设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
imagePullSecrets: # Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork:false # 是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: # 在该pod上定义共享存储卷列表
- name: string # 共享存储卷名称 (volumes类型有很多种)
emptyDir: {} # 类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string # 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string # 所在宿主机的目录,将被用于同期中mount的目录
secret: # 类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: # 类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
KubeSphere 是在目前主流容器调度平台 k8s 之上构建的企业级分布式多租户容器平台,
提供简单易用的操作界面以及向导式操作方式,在降低用户使用容器调度平台学习成本的同时,极大减轻开发、测试、运维的日常工作的复杂度,
旨在解决 K8S 本身存在的存储、网络、安全和易用性等痛点。
除此之外,平台已经整合并优化了多个适用于容器场景的功能模块,
以完整的解决方案帮助企业轻松应对敏捷开发与自动化运维、微服务治理、多租户管理、工作负载和集群管理、
服务与网络管理、应用编排与管理、镜像仓库管理和存储管理等业务场景。
服务部署方式对比
传统方式(直接手动裸部署) docker部署 docker-compose部署 k8s部署
1、优点
传统方式:简单直接,无需安装docker等环境。
docker:部署服务只需拉取镜像,启动即可,方便快速。
docker-compose:通过配置文件统一编排部署多个容器。
K8s:
(1)支持分布式环境下的容器编排部署,能管理多主机的容器服务。
(2)集群管理功能齐全,能够实现自动化部署、扩展和维护容器集群、监控容器状态、负载均衡等功能。
2、缺点
传统方式:手动部署服务,比如MySQL等,部署麻烦,需关心配置、版本和环境等。
docker:
(1)容器需要一个个部署,如果容器很多,工作量会很大。
(2)一般是部署单个服务,真实的业务场景下,容器应用间的依赖关系,网络通信,数据持久化,状态等非常复杂,用这种方式处理起来非常棘手。
docker-compose:只能在当前主机编排部署容器,不能实现跨宿主机编排部署。
K8s:
(1)部署集群复杂,学习成本高,比较难懂。
(2)资源占用高。
3、适用场景
传统方式:只想简单直接使用某个单体服务,不介意繁琐的配置。
docker:想简单容器化部署某个或几个服务,不需要处理容器间依赖关系等服务集群。
docker-compose:只需在当前主机上统一编排部署容器组。
K8s:
(1)需要在分布式多主机环境下编排部署容器。
(2)想要更齐全强大的容器集群管理功能。
(3)能承受高资源占用情况。
上一篇
下一篇
以Docker为代表的容器技术介绍
docker和containerd
k8s服务暴露
vertx core web 实例
JAVA Void类
vertx promise future