docker原理及服务编排

news2024/11/24 21:00:35

一、什么是docker

Docker 是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了Apache 2.0协议,项目代码在GitHub上进行维护。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker的基础是Linux容器(LXC)等技术。相对于虚拟机,更加原生和高性能。

二、应用场景

2.1 快速交付,高效部署
2.2 便于管理
标准化开发、测试、生产环境,避免环境不一致带来的问题,极大的简化服务配置和迁移工作

三、docker架构

Docker是一个C/S架构的程序,由两部分组成:
服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器
客户端(client):通过命令或Restful API向Docker服务端发送指令。可同时在本地或远程向服务端发送指令。

四、核心概念

4.1 镜像(image)

将应用程序及其依赖、环境、配置打包在一起,是一个 read-only 文件,可以理解成一个模板
可以自己制作(Dockerfile),也可以从镜像源拉取
利用Dockerfile制作镜像,可参考 python flask 镜像

4.2 容器(container)

一个镜像运行起来,就是一个容器,基于一个镜像可以运行多个容器
其实质是复制image,并在image最上层加上一层 read-write 的层 (称为container layer,容器层)

4.3 仓库(repository)

托管镜像的服务器,除了官方的docker.hub,还有https://registry.cn-hangzhou.aliyuncs.com、http://hub-mirror.c.163.com等

五、基本操作

docker 常用基础命令

docker container run -d --publish 80:80 --name webhost nginx

一条命令背后到底做了什么?

1 在本地查找是否有nginx这个image镜像,但是没有发现
2 去远程的image registry查找nginx镜像(默认的registry是Docker Hub)
3 下载最新版本的nginx镜像 (nginx:latest 默认)
4 基于nginx镜像来创建一个新的容器,并且准备运行
5 docker engine分配给这个容器一个虚拟IP地址
6 在宿主机上打开80端口并把容器的80端口转发到宿主机上
7 启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)

六、容器编排

容器编排就是批量管理容器

pip install docker-compose

docker-compose,常用命令集合(与docker命令几乎一致)

Commands:
  build              Build or rebuild services
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove resources
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show version information and quit

编排配置文件:

docker-compose.yml

基本语法结构

version: "3.8"
services: # 容器
  servicename: # 服务名字,这个名字也是内部 bridge网络可以使用的 DNS name
    image: # 镜像的名字
    command: # 可选,如果设置,则会覆盖默认镜像里的 CMD命令
    environment: # 可选,相当于 docker run里的 --env
    volumes: # 可选,相当于docker run里的 -v
    networks: # 可选,相当于 docker run里的 --network
    ports: # 可选,相当于 docker run里的 -p
  servicename2:

volumes: # 可选,相当于 docker volume create
networks: # 可选,相当于 docker network create

七、基于docker构建PHP运行环境

nginx.conf 配置

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
   worker_connections  1024;
}

http {
   include       /etc/nginx/mime.types;
   default_type  application/octet-stream;

   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

   access_log  /var/log/nginx/access.log  main;
   sendfile        on;
   #tcp_nopush     on;
   keepalive_timeout  65;

   gzip  on;

   server {
      listen 88;
      root /www;  #查找php文件的目录

      location ~ \.php$ { #解析.php后缀的文件
              fastcgi_pass php:9000;  #转发到php容器
              fastcgi_index index.php;
              fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
              include fastcgi_params;
      }
   }
}

www/index.html

<div>
This is Beijing!
</div>

www/test.php

<?php

phpinfo();

docker-compose.yml文件

version: '3.1'  #版本
services:  		#服务配置
  nginx:		#nginx服务
    image: nginx	#镜像名
    container_name: my_nginx #启动容器名
    restart: always			 #重启配置
    ports:					 #容器内外端口映射,外部访问使用8001
      - 8001:88
    volumes:				 #数据卷映射
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./www:/www
  php:			#php服务
    image: php:7.4-fpm		 #镜像名
    container_name: php_7.4  #启动后容器名
    depends_on:
      - nginx
    restart: always			 #重启配置
    volumes:				 #数据卷映射(容器内的www目录映射宿主机的当前目录下的www目录)
      - ./www:/www

接下来运行,命令会在当前目录下查找docker-compose.yml文件

docker-compose run -d

[@bx /opt/projects/docker]# docker-compose up -d
Creating network "docker_default" with the default driver
Creating my_nginx ... done
Creating php_7.4  ... done

访问1:http://宿主机ip:8001

访问2:http://宿主机ip:8001/index.html,等同于 http://宿主机ip:8001

访问3:http://宿主机ip:8001/index.php

访问4:http://宿主机ip:8001/test.php

详细说明请求过程

前两种请求:访问index.html时,nginx去容器中的www目录找,www目录映射到宿主机的www目录,所以,最终是去宿主机的www目录访问,找到index.html,展示其内容。

第三种请求:访问index.php,nginx解析到是php文件,就会去nginx配置php server的root目录查找,该目录同样映射到宿主机的www目录,那么最终就会到宿主机的www目录查找,由于宿主机上没有该文件,所以显示file not found

第四种请求:同第三种请求,宿主机上有该文件,就会解析并显示该文件内容

八、图解

参考文档
1 http://www.dockerinfo.net/document
2 https://dockertips.readthedocs.io/en/latest/index.html
3 https://docs.docker.com/engine/reference/builder/
4 https://www.homenethowto.com/advanced-topics/traffic-example-the-full-picture/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【毕业设计_课程设计】基于Spark网易云音乐数据分析

文章目录0 项目说明1 系统模块2 分析内容3 界面展示4 项目工程0 项目说明 基于Spark网易云音乐数据分析 提示&#xff1a;适合用于课程设计或毕业设计&#xff0c;工作量达标&#xff0c;源码开放 1 系统模块 包含爬虫,Scala代码,Spark,Hadoop,ElasticSearch,logstash,Flume…

基于ChatGPT实现微信智能机器人

ChatGPT近期以强大的对话和信息整合能力风靡全网&#xff0c;可以写代码、改论文、讲故事&#xff0c;几乎无所不能&#xff0c;这让人不禁有个大胆的想法&#xff0c;能否用他的对话模型把我们的微信打造成一个智能机器人&#xff0c;可以在与好友对话中给出意想不到的回应&am…

汇编语言笔记——接口技术与编程

文章目录传送门储存系统与技术材料高速储存器缓冲储存器&#xff08;Cache&#xff09;材料&#xff0c;局部性&#xff0c;访问方式Cache全相联映射Cache交换与一致性单核CPU一致性处理多核CPU的MESI协议主储存器&#xff08;内存&#xff09;主要技术指标容量带宽内存模组与内…

【JavaWeb】Servlet

Servlet简介 Servlet是sun公司开发动态web的一门技术Sun在这些API中提供一个接口叫做&#xff1a;Servlet&#xff0c;如果想开发一个Servlet程序&#xff0c;需要编写一个类&#xff0c;实现Servlet接口把开发好的Java类部署到web服务器中 把实现了Servlet接口的Java程序叫做…

【Anime.js】——Anime.js源码核心理解

一、Anime.js整体结构 Anime.js的强大之处在于代码量非常少&#xff0c;但功能却非常强大。让我们一起来探索Anime.js源码的核心吧~ Anime.js之所以能如此强大主要是因为它的代码结构设计的非常巧妙合理&#xff0c;所以我们想要掌握Anime.js的核心&#xff0c;首先我们要了解…

Linux内核基础篇——动态输出调试

文章目录配置内核编译选项debugfs文件系统挂载动态输出使用实际案例动态输出&#xff08;dynamic print&#xff09;是内核子系统开发者最喜欢的输出技术之一。 上篇说到printk调试&#xff0c;但printk是全局的&#xff0c;只能设置输出等级。而动态输出可以动态选择打开某个…

Tensorflow Serving部署推荐模型

Tensorflow Serving部署推荐模型 1、找到当前模型中定义的variables&#xff0c;并在此定义一个saver用于保存模型参数 def saveVariables(self):variables_dict {}variables_dict[self.user_embedding.op.name] self.user_embeddingvariables_dict[self.item_embedding.op…

【LeetCode】1971. 寻找图中是否存在路径

题目描述 有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n - 1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连…

犀牛插件开发-基础核心-技术概览-总体架构-教程

文章目录1.概述2.基础核心2.1.C Rhino 核心2.2.openNURBS2.3.C SDK3.C Stack3.1.C Plugins3.2.RhinoScript4.NET Stack4.1.C API4.2.NET Framework4.3.RhinoCommon4.4.Eto4.5.net插件4.6.Grasshopper组件4.7.Python脚本5.相关主题1.概述 《Rhinoceros》由许多层组成——用多种…

细说OA系统的繁荣发展

改革开放以来&#xff0c;科技发展突飞猛进&#xff0c;我们生活的方方面面都受到了巨大影响。随着信息化时代的到来&#xff0c;企业的办公方式也发生了巨大的改变&#xff0c;OA系统随之走进了大众的视野。细数这四十几年&#xff0c;OA办公系统已经由一个异想天开的想法变成…

centos7.8离线安装pg和postgis

安装包下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1MxJc-5Ws6OPTRAoC-2srJw 提取码&#xff1a;is2q 1.centos7.8 离线安装pg操作步骤 这里基于centos7.8空白系统操作实践写的文档&#xff0c;系统一致的情况下可以照搬教程操作安装&#xff0c;镜像为…

1.0、Hibernate-快速入门初体验

1.0、Hibernate-快速入门初体验 Hibernate 和 mybatis 一样是 ORM (Object Relation Mapping) 对象关系映射框架&#xff0c;将面向对象映射成面向关系。 如何使用呢&#xff1f; 1、导入依赖&#xff1b; 2、创建 Hibernate 配置文件&#xff1b; 3、创建实体类&#xff1b; 4…

Allegro172版本多人协同在线设计操作指导

Allegro172版本多人协同在线设计操作指导 Allegro升级到172版本,可以支持多人协同设计,并且实时同步,具体操作如下 首先用户需要在同一个局域网下,并且Allegro172的版本必须一致,比如都是S082的版本 第一个用户打开PCB,选择Symphony Team design 选择 Start Symphony …

2022年度总结

自我介绍 大家好&#xff0c;我又回来了&#xff01;我在一年之前在 CSDN 写了第一篇文章&#xff0c;到现在也有一年时间了。这次回来呢&#xff0c;也是因为 CSDN 官方发的消息&#xff0c;让写一篇年度总结的文章。在离开的这几个月里&#xff0c;主要是因为工作繁忙&#…

ASO优化:总结APP被下架的5点原因

随着苹果的App Store的监管力度的不断加强&#xff0c;每个APP都会有被下架的风险&#xff0c;而对于开发者来说&#xff0c;APP被下架是一件很严重的事情&#xff0c;不仅会造成用户的流失&#xff0c;还会降低用户对APP 的信任。所以&#xff0c;我们要了解APP被下架的原因&a…

【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)

需要源码和依赖请点赞关注收藏后评论区留言私信~~~ 一、Dataframe操作 步骤如下 1&#xff09;利用IntelliJ IDEA新建一个maven工程&#xff0c;界面如下 2&#xff09;修改pom.XML添加相关依赖包 3&#xff09;在工程名处点右键&#xff0c;选择Open Module Settings 4&a…

整数的大小端序

在存储整数时&#xff0c;一般按字节为逻辑单位进行存储&#xff0c;有“小端序”和“大端序”之分。小端序&#xff08;little-endian&#xff09; 是指将表示整数的低位字节存储在内存地址的低位&#xff0c;高位字节存储在内存地址的高位。如果将整数 1982062410 存储至内存…

【CANN训练营第三季】2022年度第三季新手班之昇腾AI入门课

本次参加CANN训练营&#xff0c;本来我报名的是进阶班课程&#xff0c;再看一遍新手班&#xff0c;学习一下目前CANN的最新进展也是不错的&#xff0c;巩固一下。 视频课程大家可以从这里看到 &#xff08;1&#xff09;【CANN训练营第三季】- 昇腾AI入门课&#xff08;上&am…

使用Keepalived工具实现集群节点的高可用

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;蟹黄瓜子文章来源&#xff1a;社区投稿 1.前言 在集群当中离不开的一个词就是是高可用&#xff0c;用本文来…

OpenWrt + 每步科技DDNS 实现ipv6动态域名解析方法

其实好几个月前我就已经把这个动态域名设置好了&#xff0c;后面重新刷了系统&#xff0c;忘记保存&#xff0c;又得重新再来&#xff0c;这次把过程记录一下&#xff0c;免得下次再从头百度。 工具 刷好openWrt的路由器一个每步科技注册的域名&#xff08;我为什么选择这个&…