Docke进阶篇
首先感谢狂神的教程:
https://www.bilibili.com/video/BV1kv411q7Qc/?spm_id_from=autoNext
Docker Compose官方文档地址:https://docs.docker.com/compose/
Docker Compose
简介
Docker
DockerFile build run 手动操作,单个容器
微服务 100个微服务!依赖关系
Docker Compose 来轻松高效的管理容器,定义运行多个容器
定义,运行多个容器
Yaml file 配置文件
single command 命令有哪些?
所有的环境都可以使用Docker Compose
三步骤
- DockerFile保证我们的项目在任何地方可以运行
- docker-compose.yaml 这个文件写出来
- docker-compose up 启动项目
作用:批量容器编排
Compose是Docker官方的开源项目,需要安装
Dockerfile 让程序在任何地方运行 web服务器 redis mysql nginx... 多个容器
Compose模板
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Compose重要的概念
- 服务Services,容器,应用 (web,redis,mysql)
- 项目Project 一组关联的容器 博客
安装Compose
-
下载
#外网服务器,内网服务器不建议这样下载 curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose #内网服务器下载方式 curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
-
授权
chmod +x /usr/local/bin/docker-compose root@sagamiyungooglecloud ~# docker -compose version unable to resolve docker endpoint: context "ompose" does not exist root@sagamiyungooglecloud ~ [1]# docker-compose version docker-compose version 1.29.2, build 5becea4c docker-py version: 5.0.0 CPython version: 3.7.10 OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
快速开始
地址:https://docs.docker.com/compose/gettingstarted/
通过Docker Compose上构建一个简单的python web应用程序,该应用程序使用Flask框架并在Redis中维护一个计数器,用来记录该Web应用被访问的次数
- 准备工作
#安装Python包管理工具
apt install python-pip
yum install python-pip
- 为项目创建目录
mkdir composetest
cd composetest
- 在项目目录中构建一个名为app.py的文件,内容如下
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
- 编写Dockerfile文件
# syntax=docker/dockerfile:1
FROM
Learn more about the "FROM" Dockerfile command.
python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
#国内服务器版本
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python","app.py"]
- 创建一个requirements.txt文件,内容如下
flask
redis
- 在项目目录创建一个docker-compose.yml文件,内容如下
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
#此Compose文件定义了两个服务,web和redis
#该web服务使用从DockerFile当前目录中构建的图像
#将容器上的公共端口5000转发到主机上的端口5000,我们使用Flask web服务器的默认端口5000
#该redis服务使用从DockerHub注册表中提取的公共Redis镜像
- 使用Compose构建和运行应用程序
python应用,是一个计数器应用,使用Redis
- 应用 app.py
- DockerFile 将应用打包成镜像 (单机玩具)
- Docker-Compose yaml文件(定义整个服务,需要的环境:web,redis)完整的上线服务
- 启动Compose项目(docker-compose up 命令即可)
流程:
- 创建网络
- 执行Docker-Compose yaml
- 启动服务
Docker-Compose yaml
Creating composetest_web_1 ... done
Creating composetest_redis_1 ... done
root@sagamiyungooglecloud ~# docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
默认的服务器名 文件名 _ 服务名_ num
多个服务器,集群 _num 为副本数量
服务redis服务 =》 4个副本
集群状态,服务不可能只有一个运行实例 。弹性 高并发 负载均衡
kubectl service 负载均衡
网络规则
10个服务器 =》 项目(项目中的内容都在同个网络下,域名或IP访问)
mysql :3306
10个容器实例:mysql,那就是10个ip 或者是redis
如果在同一个网络下,我们可以直接使用域名访问
停止:docker-compose down (需在项目文件夹内停止)或 Ctrl + C
docker-compose
以前都是单个docker run启动容器
通过docker-compose编写yaml配置文件,可以通过compose一键启动所有服务,停止
Docker小结:
- Docker镜像 run =》 容器
- DockerFile构建镜像(服务打包)
- docker-compose启动项目(编排,多个微服务/环境)
- 精通Dockernetwork
yaml 规则
docker-composer.yaml核心思路
# 三层!
version: '' #版本
services: #服务
服务1:web
#服务配置
images
build
network
.....
服务2:redis
.....
服务3:nginx
...
#其他配置 网络/卷 全局规则
volumes:
networks:
configs:
开源项目
博客
下载程序,安装数据库,配置...
compose应用 =》 一键启动
使用WordPress搭建博客
mkdir my_wordpress
cd my_wordpress/
vim docker-compose.yml
#以下为docker-compose.yml文件配置内容
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
#EOF
docker-compose up
以上命令即可通过访问服务器5000端口来部署
docker-compose up -d 后台启动
实战:计数器
使用SpringBoot写一个计数器
- 编写一个SpringBoot项目
- 使用Dockerfile构建镜像
- 编写docker-composer.yaml启动项目
- 丢到服务器并启动 docker-compose up
假设项目要重新打包
docker--compose up --build #重新构建
小结:
未来项目只要有docker-compose文件。按照这个规则,启动编排容器。
公司:docker-compose 直接启动
网上开源项目:docker-compose 一键搞定
总结:
工程,服务,容器
项目compose:三层
- 工程 Project
- 服务
- 容器 运行实例!docker k8s 容器
Docker Swarm
集群方式的部署
购买服务器
4台服务器 2G
这里我用GoogleCloud的试用金买了4台2核4G的服务器,顺便后期学习k8s也方便
毕竟有机会白嫖它不香么
同时我也把视频中阿里云注意事项写出,方便各位总结
阿里云服务器注意事项
- 1核2G 后续要学习k8s的建议4G
- 选择按量付费,带宽是按照流量来计费的,机器的费用是根据小时来计费的
- 需要最低充值100元,才可使用按量计费
- 在学习试验后要关闭服务器,以节约预算
安装环境
官方文档:https://docs.docker.com/engine/install/
要注意善用多执行操作
Centos及其环境安装(尽量选择Centos7进行测试)
#gcc环境安装
yum install gcc -y
yum install gcc-c++ -y
#安装需要的软件包
yum install yum-utils -y
#设置镜像仓库
#此处参考Centos8停止更新软件源的解决方案
#更新yum软件包索引
yum makecache fast
#安装Docker-ce
yum install docker-ce docker-ce-cli containerd.io
#启动Docker
systemctl start docker
#测试命令
docker -v
docker run hello-world
docker images
#卸载
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
Debian及其环境安装(自身版本为Debian10)
#gcc环境安装
apt install gcc -y
#更新apt索引
apt-get update
#允许apt通过https存储库
apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
#添加GPG密匙
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#添加稳定存储库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nightly
#更新软件仓库
apt-get update
#安装Docker-ce引擎
apt-get install docker-ce docker-ce-cli containerd.io
#测试是否成功安装
docker run hello-world
#卸载Docker引擎
apt-get purge docker-ce docker-ce-cli containerd.io
#删除宿主机上的所有容器,镜像,物理卷
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
工作模式
节点分为管理节点和工作节点
即为:manager 与 docker
操作全部在管理节点完成
同Redis集群的概念是相似的
使用了Raft算法来保证集群的一致性
搭建集群
通过docker swarm --help查看其命令
root@k8s-images-1 ~# docker swarm --help
Usage: docker swarm COMMAND
Manage Swarm
Commands:
ca Display and rotate the root CA
init Initialize a swarm
join Join a swarm as a node and/or manager
join-token Manage join tokens
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm
#我们看到这里的命令无非就是增删改查
#查看初始化参数
root@k8s-images-1 ~# docker swarm init --help
Usage: docker swarm init [OPTIONS]
Initialize a swarm
Options:
--advertise-addr string Advertised address (format: <ip|interface>[:port])
--autolock Enable manager autolocking (requiring an unlock key to start a stopped manager)
--availability string Availability of the node ("active"|"pause"|"drain") (default "active")
--cert-expiry duration Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
--data-path-addr string Address or interface to use for data path traffic (format: <ip|interface>)
--data-path-port uint32 Port number to use for data path traffic (1024 - 49151). If no value is set or is set to 0, the default
port (4789) is used.
--default-addr-pool ipNetSlice default address pool in CIDR format (default [])
--default-addr-pool-mask-length uint32 default address pool subnet mask length (default 24)
--dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
--external-ca external-ca Specifications of one or more certificate signing endpoints
--force-new-cluster Force create a new cluster from current state
--listen-addr node-addr Listen address (format: <ip|interface>[:port]) (default 0.0.0.0:2377)
--max-snapshots uint Number of additional Raft snapshots to retain
--snapshot-interval uint Number of log entries between Raft snapshots (default 10000)
--task-history-limit int Task history retention limit (default 5)
通过ip addr查看自己服务器的ip地址
我们可以通过--advertise-addr参数来指定dockerswarm的使用网络
docker swarm init --advertise-addr [you ipaddress]
Swarm initialized: current node (dg76kg0vnfwafdrgmkcgkn1jf) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1z3x6i4961mbfwc5ue7uz5ufjj47c7o2hm5n4p53t8mxzvwbnv-ec2pflsf62ah8d9yxco64ppoa 10.170.0.4:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
初始化节点:docker swarm init
加入一个节点:docker swarm join
#To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. 即为我们这个节点获取令牌
#获取令牌
docker swarm join-token manager
docker swarm join-token worker
#然后将获取的令牌键入到想要添加节点的主机上
同理把之后的节点搭建进去
小结:
- 生成主节点 init
- 加入(manager)管理组,加入(worker)工作组
目标:双主双从
Raft协议
双主双从:假设一个节点挂了,其他节点是否可以用
Raft协议:保证大多数节点存活才可以用 只要>1 集群至少>=3
实验:
- 将第一台试验机即Leader主机的docker服务停止后(宕机),那么另一个主结点也不能使用了
- 可以将其他节点离开
docker swarm leave
- work就是工作的,管理节点执行管理命令 3台机器设置为管理节点
集群:至少保证3个主节点
Raft协议:保证大多数节点存活,才可以使用
体会
弹性,负载,扩缩容
以后告别docker run!
docker-compose up 启动一个项目
集群:swarm docker service
容器 =》 服务
redis! = 3份容器
集群:高可用,web -> redis (3台,不同的机器上)
体验:创建服务,动态扩展服务,动态更新服务
root@k8s-images-1 ~# docker service --help
Usage: docker service COMMAND
Manage services
Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service
Run 'docker service COMMAND --help' for more information on a command.
灰度发布:金丝雀发布
#用docker service 启动nginx服务器
docker service create -p 8888:80 --name my-nginx nginx
#docker run 容器启动!不具有扩缩容器
#docker service 服务! 具有扩缩容器,滚动更新
#查看服务
root@k8s-images-1 ~ [1]# docker service ps my-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vl7pw6xlzaqn my-nginx.1 nginx:latest k8s-images-1 Running Running 26 minutes ago
root@k8s-images-1 ~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
iijs808s2l1j my-nginx replicated 1/1 nginx:latest *:8888->80/tcp
#更新服务(动态扩缩容)
docker service update --replicas [number] my-nginx #此处的数为运行总大小
docker service scale my-nginx=[number] #此处的数字为要扩容的大小
#移除我们的服务
docker service rm my-nginx
服务,集群中任意的节点都可以访问。服务可以有多个副本动态扩缩容实现高可用
弹性,扩缩容
服务的高可用,任何企业,云
k8s!云原生应用
docker swarm其实并不难
只要会搭建集群,会启动服务,动态管理容器就可以了
swarm => k8s 副本,服务器,多容器!
概念总结
swarm
集群的管理和编号。docker可以初始化一个swarm集群,其他节点可以加入(管理,工作者)
Node
就是一个docker节点 多个节点就组成了一个网络集群(管理,工作者)
Service
任务,可以在我们的管理节点或工作节点来运行,核心
Task
容器内的命令,细节任务
命令 -> 管理 -> api -> 调度 -> 工作节点(创建容器维护容器)
逻辑是不变的
k8s service api
拓展:网络模式:"PublishMode":"ingress"
Swarm:
Overlay:
ingress:特殊的Overlay网路,具有负载均衡的功能。 IPVS VIP!
虽然Docker在四台机器上,实际网络是同一个
Docker Stack
Docker-compose 单机部署项目
Docker Stack部署,集群部署
#Docker-compose单机启动项目
docker-compose up -d wordpress.yaml
#集群
docker stack deploy wordpress.yaml
#docker-compose 文件
这里狂神说的较为粗略
我引申一个资料,供各位以参考
https://blog.csdn.net/huangjun0210/article/details/86502021
Docker Secret
即为Docker的安全模块
安全,配置密码,证书
root@SagamiYunCloud ~# docker secret
Usage: docker secret COMMAND
Manage Docker secrets
Commands:
create Create a secret from a file or STDIN as content
inspect Display detailed information on one or more secrets
ls List secrets
rm Remove one or more secrets
Run 'docker secret COMMAND --help' for more information on a command.
Docker Config
配置
root@SagamiYunCloud ~# docker config
Usage: docker config COMMAND
Manage Docker configs
Commands:
create Create a config from a file or STDIN
inspect Display detailed information on one or more configs
ls List configs
rm Remove one or more configs
Run 'docker config COMMAND --help' for more information on a command.
容器单独没有什么意义,有意义,容器编排
以上三门技术视频说已经很少用了,狂神说可以有兴趣学一学,不过
我可没那个兴趣
哈哈(作为开发是足够足够了)
拓展到K8s
云原生时代
云应用
电商网站
在线教育平台
可视化数据平台
下载 => 配置!
大趋势既是k8s
k8s,10台机器以上
GO
Go语言!必须掌握!
Docker是Go开发的
K8s也是Go开发的
...
Go是一门天生并发语言,与C类似,但是有GC,内存安全与并发
Go 指针!
入门
基础语法
高级对象
如何操作数据库
框架
大厂都在转Go!
完结撒花
Q.E.D.