docker改变了软件世界
- 保证开发,测试,交付,部署的环境完全一致
- 保证资源的隔离
- 启动临时的,用完即放弃的环境,例如测试
- 循序超大规模部署和扩容
Docker是怎么样隔离的
- Linux namespace
- 每个进程能看到的东西
- Linux允许创建以下Namespace
- Mount/Pid/Network/IPC
- Linux Control Groups(cgroups)
- 限制每个进程所能使用的资源
docker基本概念
镜像image
一个预先定义好的模板文件,Docker引擎可以按照这个模板文件启动无数个一摸一样,互不干扰的容器
容器container
一台虚拟的计算机,拥有独立的
- 网络
- 文件系统
- 进程
默认和宿主机不发生任何交互
下载一个指定的镜像,方便随时启动
- 这个镜像里包含软件所有的依赖
- 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 容器内的命令 》》》 进入容器内部
docker run 参数
—name 为容器指定一个名字
—restart=always 遇到错误自动重启
-v <本地文件>:<容器文件>
// -V 参数 把宿主机的文件/目录 映射到镜像机里面,(在container里面进行数据持久化,如果不这样做,那么)
docker run -it -v /Users/liang/Projects:/app ubuntu
-p <本地端口>:<容器端口>
容器内外互相访问
docker run -d -p 8888:80 'pwd':/usr/local/liang httpd:2.4
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
-e NAME=VALUE
向镜像容器传递数据
mysql启动命令
// 停止
docker rm -f mysql
// 启动
docker run --name mysql -v `pwd`/mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.27
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.27
通过docker/Nginx分布式部署应用
1. 部署两个应用
2. Nginx
配置文件
搜索nginx load blanancing,可以出现以下的结果
http {
upstream myproject {
server 127.0.0.1:8000 weight=3;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80;
server_name www.domain.com;
location / {
proxy_pass http://myproject;
}
}
}
// 然后改成对的
events{}
http {
upstream myproject {
server 宿主机ip:8002;
server 宿主机ip:8003;
}
server {
listen 80;
server_name www.domain.com;
location / {
proxy_pass http://myproject;
}
}
}
启动nginx
搜索 docker nginx
出错的情况使用
docker log
因为nginx里面配置的localhost:8080 8081,端口是nginx里面的8080和8081,需要改成访问宿主机器的8080 8081
1. 多个App共享一个端口,但是域名不同,要求分发到不同的应用上去
nginx http proxy
分层的镜像
- 分层的