怎么做网站从0做到权重7,seo是什么简称,普通的宣传网站用什么做,创做网站什么是Docker#xff1f;
Docker是一个开源的应用容器引擎#xff0c;让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中#xff0c;然后发布到任何流行的Linux机器上#xff0c;也可以实现虚拟化。容器完全使用沙盒机制#xff0c;相互之间不会存在任何接口。几…什么是Docker
Docker是一个开源的应用容器引擎让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中然后发布到任何流行的Linux机器上也可以实现虚拟化。容器完全使用沙盒机制相互之间不会存在任何接口。几乎没有性能开销可以很容易的在机器和数据中心运行。最重要的是他们不依赖于任何语言、框架或者包装系统。
Docker是dotCloud公司开源的一个基于LXC的高级容器引擎源码托管在Github上基于go语言并且遵从Apache2.0协议开源。
Docker 为提供了一整套的解决方案不仅解决了容器化问题而且解决了分发问题很快被各大厂商选择变成了云基础设施厂商围绕 Docker 也开始了生态建设。
什么是虚拟化、容器化
物理机实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理机提供给虚拟机以硬件环境有时也称为“寄主”或“宿主”。
虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机每个逻辑计算机可运行不同的操作系统并且应用程序都可以在相互独立的空间内运行而互不影响从而显著提高计算机的工作效率。
容器化容器化是一种虚拟化技术又称操作系统层虚拟化Operating system level virtualization这种技术将操作系统内核虚拟化可以允许用户空间软件实例 instances被分割成几个独立的单元在内核中行而不是只有一个单一实例运行。这个软件实例也被称为是一个容器containers。对每个实例的拥有者与用户来说他们使用的服务器程序看起来就像是自己专用的。容器技术是虚拟化的一种。docker 是现今容器技术的事实标准。
为什么需要虚拟化、容器化
其实虚拟化和容器化最主要的目的就是为了资源隔离随着资源隔离的实现也带来了更大的利益。
容器对比虚拟机更轻量启动更快 传统的虚拟机技术启动应用服务往往需要数分钟而 Docker 容器应用由于直接运行于宿主内核无需启动完整的操作系统因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。 这是因为docker不需要加载内核了所以启动更快。资源利用率高 将利用率较低的服务器进行整合用更少的硬件资源运行更多的业务降低IT支出和运维管理成本。环境标准化 一次构建随处执行。 实现执行环境的标准化发布部署和运维。开发过程中一个常 见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境 确保了应用运行环境一致性从而不会再出现 「这段代码在我机器上没问题啊」 这类 问题。
docker image
docker images [OPTIONS] [REPOSITORY[:TAG]] 关键参数
-a列出本地所有的镜像含中间印象层、默认情况下过滤掉中间镜像层–digests显示镜像的摘要信息-f显示满足条件的镜像–format指定返回值的模版文件–no-trunc显示完整的镜像信息-q显示出镜像ID
docker pull
拉取出需要的镜像
什么是dockerfile
dockerfile是一个文本文件其中包含了一条条的指令用于构建镜像。
FROM 指定镜像
指定基础镜像并且Dockerfile中第一条指令必须是FROM指令且在同一个Dockerfile中创建多个镜像时可以使用多个FROM指令。
语法格式如下
FROM image
FROM image:tag RUN 运行指定的命令
RUN command CMD 容器启动时要运行的命令
CMD command param1 param2ENTRYPOINT-为容器指定默认运行程序
ENTRYPOINT command param1 param2
docker compose
什么是docker compose docker-compose是Docker官方的开源项目使用python编写实现上调用了Docker服务的API进行容器管理和编排其官方定义和运行多个docker容器的应用。
dockere-compose有2个很重要的概念
服务一个应用的服务实际上可以包含若干运行相同镜像的实例项目由一组关联的应用容器组成的一个完整业务单元在docker-compose.yml中定义整个docker-compose.yml定义一个项目。
Compose 的默认管理对象是项目通过子命令对项目中的一组容器进行便捷地生命周期管理。 有了上面最基本的认识后我来介绍一下我的项目及如何进行项目部署。 在我的项目中有7个业务子服务
入口网关子服务用户管理子服务好友管理子服务消息转发子服务消息存储子服务文件管理子服务语言转化子服务
每一个子服务都需要打包成一个镜像要知道每个服务都需要链接很多库这时候有2种方式
手动将库一一拷贝到指定目录下用shell脚本来拷贝到指定目录下我采取的方式
下列是文件子服务需要链接的库 这里我用wak命令将连接的库给提取了出来
ldd file_server | awk {if (match($3,/)){print $3}}然后我们需要将库给拷贝到指定的路径下
#!/bin/bash#传递两个参数
# 1. 可执行程序的路径名
# 2. 目录名称 --- 将这个程序的依赖库拷贝到指定目录下
declare depends
get_depends() {depends$(ldd $1 | awk {if (match($3,/)){print $3}})mkdir $2cp -Lr $depends $2
}get_depends ./gateway/build/gateway_server ./gateway/depends
get_depends ./file/build/file_server ./file/depends
get_depends ./friend/build/friend_server ./friend/depends
get_depends ./message/build/message_server ./message/depends
get_depends ./speech/build/speech_server ./speech/depends
get_depends ./transmite/build/transmite_server ./transmite/depends
get_depends ./user/build/user_server ./user/dependscp /bin/nc ./gateway/
cp /bin/nc ./file/
cp /bin/nc ./friend/
cp /bin/nc ./message/
cp /bin/nc ./speech/
cp /bin/nc ./transmite/
cp /bin/nc ./user/
get_depends /bin/nc ./gateway/depends
get_depends /bin/nc ./file/depends
get_depends /bin/nc ./friend/depends
get_depends /bin/nc ./message/depends
get_depends /bin/nc ./speech/depends
get_depends /bin/nc ./user/depends
get_depends /bin/nc ./transmite/depends其中nc命令可以作为客户端发起TCP和UDP连接用于测试主机端口是否开放还可以用来监听端口等。 这里不详细解释了
此时我们就完成了依赖库的指定我们就可以来创建dockerfile了。 这里我是ubuntu22.04版本
# 声明基础镜像来源
FROM ubuntu:22.04
# 声明工作路径
WORKDIR /im
RUN mkdir -p /im/logs \mkdir -p /im/data \mkdir -p /im/conf \mkdir -p /im/bin
# 将可执行程序文件拷贝进入镜像
COPY ./build/gateway_server /im/bin/
# 将可执行程序依赖拷贝进入镜像
COPY ./depends/ /lib/x86_64-linux-gnu/COPY ./nc /bin/
# 设置容器的启动默认操作 --- 运行程序
CMD /im/bin/gateway_server -flagfile/im/conf/gateway_server.conf但是有7个子服务如果一个一个创建容器还是太麻烦了所以有了docker-compose来编排容器。 当我们写完docker-compose后只需要使用docker-compose up就可以将容器创建出来。
version: 3.8services:etcd:image: quay.io/coreos/etcd:v3.3.25container_name: etcd-serviceenvironment:- ETCD_NAMEetcd-s1- ETCD_DATA_DIR/var/lib/etcd- ETCD_LISTEN_CLIENT_URLShttp://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLShttp://0.0.0.0:2379volumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上- ./middle/data/etcd:/var/lib/etcd:rwports:- 2379:2379restart: alwaysmysql:image: mysql:8.0.39container_name: mysql-serviceenvironment:MYSQL_ROOT_PASSWORD: 123456volumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上- ./sql:/docker-entrypoint-initdb.d/:rw- ./middle/data/mysql:/var/lib/mysql:rwports:- 3306:3306restart: alwaysredis:image: redis:6.0.16container_name: redis-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上- ./middle/data/redis:/var/lib/redis:rwports:- 6379:6379restart: alwayselasticsearch:image: elasticsearch:7.17.21container_name: elasticsearch-serviceenvironment:- discovery.typesingle-nodevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上- ./middle/data/elasticsearch:/data:rwports:- 9200:9200- 9300:9300restart: alwaysrabbitmq:image: rabbitmq:3.9.13container_name: rabbitmq-serviceenvironment:RABBITMQ_DEFAULT_USER: rootRABBITMQ_DEFAULT_PASS: 123456volumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上- ./middle/data/rabbitmq:/var/lib/rabbitmq:rwports:- 5672:5672restart: alwaysfile_server:build: ./file#image: server-user_servercontainer_name: file_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息 entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/file_server.conf:/im/conf/file_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10002:10002restart: alwaysentrypoint:# 跟dockerfile中的cmd比较类似都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379 -c /im/bin/file_server -flagfile/im/conf/file_server.confdepends_on:- etcdfriend_server:build: ./friend#image: file-server:v1container_name: friend_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息 entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/friend_server.conf:/im/conf/friend_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10006:10006restart: alwaysdepends_on:- etcd- mysql- elasticsearchentrypoint:# 跟dockerfile中的cmd比较类似都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379,3306,9200 -c /im/bin/friend_server -flagfile/im/conf/friend_server.confgateway_server:build: ./gateway#image: file-server:v1container_name: gateway_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息 entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/gateway_server.conf:/im/conf/gateway_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 9000:9000- 9001:9001restart: alwaysdepends_on:- etcd- redisentrypoint:# 跟dockerfile中的cmd比较类似都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379,6379 -c /im/bin/gateway_server -flagfile/im/conf/gateway_server.confmessage_server:build: ./message#image: file-server:v1container_name: message_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息 entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/message_server.conf:/im/conf/message_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10005:10005restart: alwaysdepends_on:- etcd- mysql- elasticsearch- rabbitmqentrypoint:# 跟dockerfile中的cmd比较类似都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379,3306,9200,5672 -c /im/bin/message_server -flagfile/im/conf/message_server.confspeech_server:build: ./speech#image: file-server:v1container_name: speech_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息 entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/speech_server.conf:/im/conf/speech_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10001:10001restart: alwaysdepends_on:- etcdentrypoint:# 跟dockerfile中的cmd比较类似都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379 -c /im/bin/speech_server -flagfile/im/conf/speech_server.conftransmite_server:build: ./transmite#image: file-server:v1container_name: transmite_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息 entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/transmite_server.conf:/im/conf/transmite_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10004:10004restart: alwaysdepends_on:- etcd- mysql- rabbitmqentrypoint:# 跟dockerfile中的cmd比较类似都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379,3306,5672 -c /im/bin/transmite_server -flagfile/im/conf/transmite_server.confuser_server:build: ./user#image: file-server:v1container_name: user_server-servicevolumes:# 1. 希望容器内的程序能够访问宿主机上的文件# 2. 希望容器内程序运行所产生的数据文件能落在宿主机上# 挂载的信息 entrypoint.sh文件 数据目录(im/logs, im/data), 配置文件- ./conf/user_server.conf:/im/conf/user_server.conf- ./middle/data/logs:/im/logs:rw- ./middle/data/data:/im/data:rw- ./entrypoint.sh:/im/bin/entrypoint.shports:- 10003:10003restart: alwaysdepends_on:- etcd- mysql- redis- elasticsearchentrypoint:# 跟dockerfile中的cmd比较类似都是容器启动后的默认操作--替代dockerfile中的cmd/im/bin/entrypoint.sh -h 172.20.253.66 -p 2379,3306,5672,9200 -c /im/bin/user_server -flagfile/im/conf/user_server.conf现在我已经通过docker pull将需要用到的中间件镜像给拉取了下来。 此时进行docker-compose up -d 将容器启动起来。
此时我们所有的子服务都打包成了一个镜像并且已经启动通过docker container ls -a可以查看。
此时所有子服务就在docker中启动起来了就可以直接来提供服务不需要自己来解决库依赖问题以及Linux版本问题。
最后我们只需要将运行程序和其依赖的库打包就可以在任何服务器上运行。只需要简单的拉取和运行这就是为什么docker风靡全球的原因。