目录
什么是容器和镜像?
docker基础命令
docker 创建容器方式
复制文件到正在运行的Docker容器中
将正在运行状态中的容器保存为本地docker镜像
发布Docker镜像到Dockhub仓库
Docker的数据卷和网络介绍
NetCore使用EFCore链接Mysql
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



