栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

docker基础及在Docker中创建自定义虚拟网络,多个容器组网实现负载均衡

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

docker基础及在Docker中创建自定义虚拟网络,多个容器组网实现负载均衡

目录

什么是容器和镜像?

docker基础命令

docker 创建容器方式

复制文件到正在运行的Docker容器中

将正在运行状态中的容器保存为本地docker镜像

发布Docker镜像到Dockhub仓库

Docker的数据卷和网络介绍

 NetCore使用EFCore链接Mysql

Docker中的虚拟网络是如何进行工作的

在Docker中创建自定义虚拟网络,多个容器组网实现负载均衡


什么是容器和镜像?

docker 基础的两个对象是镜像和容器镜像是一个模板,运行一个应用程序所需要的文件容器是由镜像创建用来隔离的应用,应用与应用之间不会产生干扰

docker基础命令
docker基础命令
命令作用命令作用
docker images ls 查询所有镜像docker cp将文件复制到容器中
docker pull下载镜像docker diff查看容器文件的变化
docker rmi 
docker rmi -f $(docker images -q)
删除镜像docker images -q返回镜像Id
删除全部镜像docker exec在容器中运行命令
docker build创建自定义镜像docker commit将修改的容器创建为镜像
docker create创建容器docker tag为镜像分配一个标记
docker ps查询所有容器docker login从镜像仓库登录

docker start

docker start $(docker ps -aq) 

启动容器docker logout从镜像仓库注销
批量启动容器docker kill杀死容器进程

docker stop

docker stop $(docker ps -q)

停止容器docker ps -q返回容器Id
批量停止容器docker push将镜像发布到仓库中
docker logs  容器名称

docker logs  -f 容器名称

查看容器的运行日志记录docker inspect查看容器的详细配置 

实时查看容器运行日志

docker run创建并运行一个容器

docker 创建容器方式

docker create

docker create -p  宿主机$(3000)端口:docker容器内部$(80)端口 -name  容器名称   镜像 

docker create -p  3000:80 --name examApp3000  hello-wold 

docker create -p  4000:80 --name examApp4000  hello-wold 

容器与容器之间互相隔离,所以examApp3000 中的80端口与examApp4000的80端口不是同一个端口,docker容器默认80端口,也可以根据dockerfile中EXPOSE修改端口号。 

docker run

docker rum -p  宿主机$(5000)端口:docker容器内部$(80)端口 -name  容器名称   镜像  

docker rum -p 5000:80 --name examApp5000  hello-wold

创建并运行examApp5000 容器

 docker rum -p 6500:80  --rm  --name examApp6500  hello-wold

加入--rm命令的容器在停止运行时将自动删除容器。 

复制文件到正在运行的Docker容器中

多个容器根据一个镜像生成,容器内容都是一样。

命令:docker cp 宿主机目录 容器:容器内工作目录 。

例如: docker cp .wwwrootcsssite.css  examApp4000:/app/wwwroot/css/site.css

不建议在生产环境中使用,因为容器容易被创建和销毁,只推荐在测试环境中使用。

docker diff 容器名  这行命令可以用来检测容器内部文化的变化。

C 代表被修改  A代表新增   D代表删除

将正在运行状态中的容器保存为本地docker镜像

docker exec 在容器中运行命令      docker exec -it 容器 目录

 在容器内部安装vim,将修改后的容器打包成docker镜像

docker exec -it examApp4000 /bin/bash            (进入容器)

apt-get update                                                 (更新容器内的apt-get)

apt-get install vim                                            (安装vim)

exit                                                                   (推出容器)

docker commit   examApp4000   hello-wold:changed  (修改后的examApp4000容器打包成hello-wold:changed镜像)

docker images ls                                            查看所有镜像

发布Docker镜像到Dockhub仓库

登录到dockhub仓库    docker login -u 用户名      输入密码

发布  docker push  镜像名:标签

退出dockhub  docker logout 

Docker的数据卷和网络介绍

什么是卷和网络?

**卷** 将应用程序与应用程序产生的数据文件分离,也可以说是将容器的运行环境和产生的数据库分离到了其他存储中,使得更换或者升级容器更加方便。**网络** 允许容器之间进行通信,使得应用程序得以扩展,可以很容易的处理更大的工作负载。

为什么需要Docker 数据卷的存在?

Docker中,容器的应用程序与两种文件相关联:

本身所需的运行文件用户操作产生的如日志、数据库、数据文件

容器的好处之一是容器容易被创建和销毁,而数据的存储文件不能包含在容器中,因为销毁容器时其文件系统中的文件也会被删除,把数据文件一并删除将会永远丢失。这无疑是灾难。

使用Docker Volume 管理数据

    修改dockerfile文件 在dockerfile文件中加入数据卷配置 “ VOLUME  /data     WORKDIR  /data  ”  配置的目录是应用程序中对应的目录创建镜像  docker build . -t   镜像名称  -f dockerfile文件名称 (默认使用dockerfile)创建数据卷 docker volume create --name  数据卷名称  查询数据卷命令:docker  volume ls 启动容器与数据卷绑定  docker run  --name  容器名 -v  数据卷名称:/工作目录 镜像名称

 NetCore使用EFCore链接Mysql

目的:1、添加种子数据连接到数据库。2、将数据库中的数据保存到Docker中的Volume中。

拉取Mysql镜像创建Mysql容器

    docker pull  mysql:8.0     拉取mysql镜像docker  inspect  mysql:8.0     查看mysql:8.0镜像的详细配置,查找Volumes关键字对应mysql数据库文件   docker volume create --name  devdata 创建一个预备数据卷,将项目中的数据存放在这个数据卷中。docker rum -d[后台运行]  -p 3306[宿主机暴露端口]:3306[容器内部端口]  --name mysql -v devdata[预备数据卷]:/var/lib/mysql[Volumes关键字对应]  -e MYSQL_ROOT_PASSWORD=123456789 [数据库用户root的密码]  -e bind-address=0.0.0.0 [默认绑定IP地址]  mysql:8.0 [镜像]     运行mysql容器。查看容器日志命令 docker logs -f mysql 

NetCore程序初始化EFCore配置及配置种子数据

    项目引入Microsoft.EntityframeworkCore.Tools包创建数据库连接字符串。创建种子数据。配置Startup,先配置服务,配置数据库字符串,添加初始化种子中间件。在容器化环境下,数据库字符串不需要在appsettings.json中配置,通过环境变量的方式去指定。生成迁移文件。dotnet CLL命令两个容器之间的访问涉及到容器内部的访问地址,这里的两个容器指的是运行Mysql的容易和运行NetCore应用程序的容器。
    查询容器IP地址命令 docker network inspect  bridge[桥接]     查找对应IP地址 启动NetCore应用程序的容器  docker run -d --name devtest -p 3000[宿主机端口]:80[容器默认端口]  -e DBHOST=172.17.0.2  [环境变量-数据库地址分配的IP地址是动态的]  -e DBPASSWORD=123456789 [环境变量-数据库密码]  (同理可配置对应的端口号及数据库名称) dev-images [镜像]

总结:将Mysql容器中的数据与卷进行绑定,并可以与多个应用容器之间进行通讯(数据流转),容器之间的创建与销毁不影响数据卷中的数据。

Docker中的虚拟网络是如何进行工作的

软件定义网络(SDN)

SDN行为和传统网络一样,通过IP地址加端口号的形式进行通信,但是没有物理网络接口,并且它的基础机构都是由docker提供的,比如网络名称、服务地址、路由等信息,所以被称为docker虚拟网络。SDN运行容器见进行通信,bridge 桥接了两个默认网络的容器。

docker network  ls 

bridge    多个容器之间的相互通信host       当前宿主机本身none      容器之间隔离(为分配的情况下相互隔离)

docker network inspect  bridge  查看网络命令 分配的IP地址是动态的

问题:当mysql容器关闭以后重启分配到的IP地址会变化,之前引用的原mysql容器IP的应用容器无法正常使用数据库。

在Docker中创建自定义虚拟网络,多个容器组网实现负载均衡

动态IP地址问题的解决方案:

 创建前端、后端网络:

docker   network caete frontend   (前端)

docker   network caete backend  (后端)

创建mysql容器绑定到后端网络

docker run -d --name mysql   -v  devdata:/var/lib/mysql  --network  =backend  -e  MYSQL_ROOT_PASSWORD=123456789  -e bind-address=0.0.0.0  mysql:latest 

 创建多个容器绑定在后端网络

docker  create --name [容器名称]  -e DBHOST=[mysql 容器名称]  -e MESSAGE="第一台服务器" --network [后端网络]  [镜像]

docker  create --name devapp1  -e DBHOST=mysql  -e MESSAGE="第一台服务器" --network backend  dev-images docker  create --name devapp2  -e DBHOST=mysql  -e MESSAGE="第二台服务器" --network backend  dev-images docker  create --name devapp3  -e DBHOST=mysql  -e MESSAGE="第三台服务器" --network backend  dev-images 

将容器连接到前端网络

docker network connect [前端网络]  [容器名称]

docker network connect frontend    devapp1 docker network connect frontend    devapp2docker network connect frontend    devapp3

运行负载均衡容器

创建haproxy.cfg文件,当Haproxy进行了roundrobin模式出现seeionc失效时【Haproxy基础知识 -运维小结 - 散尽浮华 - 博客园】

docker run -d  --name loadbalancer  --network  frontend [绑定前端网络]  -v "$(pwd)[当前文件夹路径]/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg"  -p 3000:80 haproxy:1.7.0 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/741091.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号