docker改变了软件世界

  • 保证开发,测试,交付,部署的环境完全一致
  • 保证资源的隔离
  • 启动临时的,用完即放弃的环境,例如测试
  • 循序超大规模部署和扩容

Docker是怎么样隔离的

  • Linux namespace
    • 每个进程能看到的东西
    • Linux允许创建以下Namespace
      • Mount/Pid/Network/IPC
  • Linux Control Groups(cgroups)
    • 限制每个进程所能使用的资源

docker基本概念

镜像image

  • 一个预先定义好的模板文件,Docker引擎可以按照这个模板文件启动无数个一摸一样,互不干扰的容器

    容器container

  • 一台虚拟的计算机,拥有独立的

    • 网络
    • 文件系统
    • 进程
  • 默认和宿主机不发生任何交互

    • 意味着数据是没有持久化的

      基本命令

      docker pull/images

  • 下载一个指定的镜像,方便随时启动

    • 这个镜像里包含软件所有的依赖
  • docker pull mysql:5.7.28 下载指定镜像
  • docker images 查看本地已有的镜像

docker run/ps

  • docker run 装在镜像成为一个容器
    • 好像从蛋糕模子做出来一个蛋糕
    • 再这个容器看来,自己就是一台独立的计算机
    • 每个容器有一个ID,支持缩写
  • docker run -it <镜像名> <镜像中要运行的命令和参数>
    • 交互命令行,当前shell中运行,ctrl+c退出
  • docker run -d <镜像名> <镜像中要运行的命令和参数>
    • daemon模式,再后台运行
  • docker ps 查看当前运行着的容器

docker exec

  • docker exec -it 容器id 容器内的命令 》》》 进入容器内部

image.png

docker run 参数

—name 为容器指定一个名字

—restart=always 遇到错误自动重启

-v <本地文件>:<容器文件>

  1. // -V 参数 把宿主机的文件/目录 映射到镜像机里面,(在container里面进行数据持久化,如果不这样做,那么)
  2. docker run -it -v /Users/liang/Projects:/app ubuntu

image.png

-p <本地端口>:<容器端口>

容器内外互相访问

  1. docker run -d -p 8888:80 'pwd':/usr/local/liang httpd:2.4
  2. docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql

image.png

-e NAME=VALUE

向镜像容器传递数据
image.png

mysql启动命令

  1. // 停止
  2. docker rm -f mysql
  3. // 启动
  4. docker run --name mysql -v `pwd`/mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.27
  5. docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.27

通过docker/Nginx分布式部署应用

image.png

1. 部署两个应用

image.png

2. Nginx

配置文件

搜索nginx load blanancing,可以出现以下的结果

  1. http {
  2. upstream myproject {
  3. server 127.0.0.1:8000 weight=3;
  4. server 127.0.0.1:8001;
  5. server 127.0.0.1:8002;
  6. server 127.0.0.1:8003;
  7. }
  8. server {
  9. listen 80;
  10. server_name www.domain.com;
  11. location / {
  12. proxy_pass http://myproject;
  13. }
  14. }
  15. }
  16. // 然后改成对的
  17. events{}
  18. http {
  19. upstream myproject {
  20. server 宿主机ip:8002;
  21. server 宿主机ip:8003;
  22. }
  23. server {
  24. listen 80;
  25. server_name www.domain.com;
  26. location / {
  27. proxy_pass http://myproject;
  28. }
  29. }
  30. }

image.png

启动nginx

搜索 docker nginx
image.png
出错的情况使用
docker log
image.png
因为nginx里面配置的localhost:8080 8081,端口是nginx里面的8080和8081,需要改成访问宿主机器的8080 8081

1. 多个App共享一个端口,但是域名不同,要求分发到不同的应用上去

image.png

nginx http proxy

搜索以上关键字
image.png
image.png

分层的镜像

image.png

  • 分层的