目录
docker
1、概念
2、docker启动nginx
1、基本流程
2、下载nginx
3、启动容器
4、docker run 详解
5、修改nginx页面
6、保存镜像
7、镜像分享到社区
8、总结
3、docker存储与Nginx页面挂载
1、目录挂载
2、卷映射
总结
4、docker网络
5、redis主从同步集群
docker
1、概念
1、运行docker pull redis,命令会发给docker主机,主机获取下载这个软件镜像到本地-----》运行docker run redis, docker主机会先查看是否有这个镜像,没有则下载,有则放入容器中运行。
2、使用 docker build my,就会制作名为my的镜像 -----》使用docker push my,就会把my的镜像放到镜像仓库上
3、容器:安装容器的运行时环境,利用容器启动一个个应用,每个应用运行在自己的容器内部,每个容器都包含这个应用运行的完整环境,且容器相互隔离。简单理解,容器就是轻量的虚拟机技术,共享操作系统内核
2、docker启动nginx
1、基本流程
2、下载nginx
docker search nginx # 查看是否有镜像 docker pull nginx # 获取镜像 docker images # 查看系统的镜像 docker pull nginx:版本 # 下载指定版本nginx: docker rmi 镜像名:版本|镜像id # 删除镜像3、启动容器
1、每一个容器都代表一个运行中的应用
2、启动nginx应用:
docker run [选项] 镜像名 [启动命令] [启动参数] docker run nginx # 启动nginx docker run nginx # 启动nginx3、查看运行中的容器:
docker ps docker ps -a # 查看所有容器,包括停止的, 查看容器名字4、启动容器
docker start 容器名 | 容器id5、停止容器
docker stop 容器名 | 容器 id6、查看容器状态
docker stats 容器id | 容器名7、查看容器日志
docker logs 容器id | 容器名8、删除容器, 但删除前需要先停止容器运行
docker rm 容器id4、docker run 详解
1、先删除之前启动的容器 docker rm -f 容器id
2、每个容器启动时,都运行在自己的空间内,互相隔离。需要给容器做一个映射。例如图中,把88端口对应到容器内的80端口上,而容器内的nginx运行在80端口。由此,我们可以访问容器内部的nginx。(每个容器就是一个小虚拟机)
2、启动命令
docker run -d(后台启动) --name 容器名(给这个容器起名字) -p 主机端口:容器端口 (设置主机端口和容器端口的映射) 镜像名5、修改nginx页面
1、使用docker exec 进入到装了nginx的容器里,容器里有一个文件路径 /usr/share/nginx/html, 存放着nginx的默认页面。nginx的镜像里有官方文档可供查阅
2、进入docker交互模式
docker exec -it(启动交互模式) 容器名 | id /bin/bash(使用控制台模式交互) # 进入容器内部3、容器内部基本就是一个linux系统,linux系统命令在这里也可以使用
4、进入nginx页面存放位置
cd /usr/share/nginx/html # 进入Nginx页面5、可以使用 echo "文本内容" > index.html 来尝试着修改默认页面
echo "文本内容" > index.html # 直接修改Nginx页面6、exit # 退出容器
exit # 退出容器6、保存镜像
1、提交镜像
docker commit -m "提交信息" 容器名 镜像名 #把运行中的容器变成镜像2、把镜像保存成文件
docker save -o 文件名.tar(把镜像写出成tar文件) 镜像名3、使用别人的本地镜像文件:
docker load -i 镜像压缩包路径 # 加载镜像后,使用 docker run 命令就可以运行镜像成容器7、镜像分享到社区
1、登录网站
docker login # 之后按照提示输入用户名密码就行2、对镜像进行改名:
docker tag 原来的镜像 用户名/新的镜像名:tag标签。 # 例如:docker tag my-nginx-service:v1.0 username/nginx-service:latest3、镜像改名后,推送镜像
docker push 更改后的镜像名 # 推送镜像8、总结
3、docker存储与Nginx页面挂载
1、目录挂载
1、正常情况下,容器内部数据修改麻烦容易丢失
2、docker的目录挂载:指定外部主机的一个文件夹A,告诉容器,这个文件夹A就是容器内的文件B。需要在docker run 运行容器时使用-v 外部路径:容器内部路径选项
3、目录挂载是将宿主机上一个你非常熟悉的具体目录路径,直接映射到容器内的一个目录。两边操作的是同一份文件。
docker run -d(后台启动) --name 容器名(给这个容器起名字) -p 主机端口:容器端口 (设置主机端口和容器端口的映射) -v 外部路径:容器内部路径 镜像名2、卷映射
1、在docker run中使用 -v选项时,使用 -v ngconf(卷名):/etc/nginx, 可以读取配置文件。这个目录放在主机的/var/lib/docker/volumes/(容器名),里面有配置文件,修改那里面的配置文件可以同步改变容器内nginx的配置。
2、使用卷映射后, cd /var/lib/docker/volumes/ngconf/data.容器里边的/etc/nginx的内容被放到了这个目录下
3、目录挂载:初始启动外部目录有什么,容器里面就有什么
卷映射: 初始启动容器内部有什么,外部就有什么。外部的修改会实时同步到容器内部,且外部目录位置固定
4、卷挂载是由Docker创建和管理的存储空间。你可以把它想象成一块由Docker分配的“U盘”,你只需要给它起个名字,然后挂载到容器里即可,不需要关心它在宿主机上的具体路径。
4、
# 创建一个名为“my-website”的卷 docker volume create my-website # 启动容器并挂载卷 docker run -d --name my-nginx-with-volume -p 8080:80 -v my-website:/usr/share/nginx/html nginx docker volume ls # 列出所有的卷 docker volume inspect 卷名 # 查看卷的详细信息5、
如果卷是空的,Docker会自动将容器内部目标目录的原始内容复制到卷中。这确保了应用能正常启动。
你可以通过docker volume inspect my-website命令查看这个卷在宿主机上的真实存储路径,但通常不需要直接操作它。
删除容器后,my-website这个卷和数据依然存在。下次新启动一个容器并挂载同一个卷,数据就会恢复。
总结
假设外部主机目录为A,容器内部目标目录为B
1、使用目录挂载:A的内容直接覆盖B。对A的修改同步修改B。容器迁移后,必须创建相同路径的A才能正常使用。适用于开发时
2、使用卷挂载:当一个新创建的、空的卷挂载到容器目录B时,Docker会先将B目录里的原始内容(来自镜像)复制到卷中,然后容器再启动。适用于开发完成,需要迁移或数据备份时。
4、docker网络
1、每个容器启动时,都会加入一个docker的默认网络,叫docker0。
2、每个启动的容器,相当于连接在这个网络里的虚拟机,docker会为每个容器分配ip
3、命令
docker container inspect 容器名 # 查看这个容器的具体状态4、容器内部可以通过这个虚拟网络互相访问
5、docker为每个容器分配唯一ip,使用容器ip + 容器端口可以互相访问
6、ip可能会变化,包括内部的。因此,我们需要创建自定义网络,容器名就是域名,使用域名来访问对方的服务。
7、
docker network create 网络名 # 创建一个自己的网络 docker network ls # 列举出网络 docker run -d(后台启动) --name 容器名(给这个容器起名字) --network 网络名(这个容器要加入的网络) -p 主机端口:容器端口 (设置主机端口和容器端口的映射) -v 外部路径:容器内部路径 -v 卷名:容器内部配置文件路径(卷映射同步更改配置文件) 镜像名8、在容器内部可以通过 http://容器名:容器端口 访问另一个容器
5、redis主从同步集群
1、概念
1、redis1主机负责写请求,redis2主机负责读请求。
2、两个容器需要放入到同一个网络
3、同时,保存redis数据的目录可以挂载到机器外边
4、同时,需要手动设置两个redis同步
5、redis1设置复制模式为master,同时设置访问密码
6、redis2,设置同步模式为slave下属,设置主机的地址(容器内部自定义网络,容器名即为域名),设置主机容器内部的端口,设置访问master的密码,设置自己的密码。
7、推荐使用比特纳米的redis镜像,已经配置好了集群设置。官方的没有。我们只需要按照说明设置环境变量就行
8、具体的命令如下