docker原理及服务编排

10 篇文章 0 订阅
6 篇文章 0 订阅

一、什么是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.comhttp://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/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值