发布网友 发布时间:2024-09-27 04:44
共1个回答
热心网友 时间:2024-09-27 20:55
使用docker搭建一个php、redis、mysql、nginx的常用实例,基础好的同学可直接跳过前面的基础讲解,直接开始实战,其中解决了Mac docker中实例间网络不通的问题,对docker宿主机的磁盘映射、网络通信有了更深层次的理解。
镜像操作
1.查看docker版本
2.获取镜像
一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新版本的变更而变化,内容是不稳定的。因此,从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的latest标记的镜像,镜像优先在本地查找如果没有就从dockerhub仓库里拉去。
pull子命令支持的选项主要包括:
3.查看镜像
使用docker images命令可以列出本地主机上已有镜像的基本信息。
TAG信息用于标记来自同一个仓库的不同镜像。例如ubuntu仓库中有多个镜像,通过TAG信息来区分发行版本,如18.04、18.10等。
另外,使用inspect命令查看详细信息。
4.存入和导出镜像
导出镜像:
存入镜像:
有不清楚的地方,可以执行帮助命令docker image help
5.删除镜像和实例
这里有一个地方要注意,docker rmi 删除的是镜像,rmi 代表的是images的意思, docker rm 删除的是docker的实例
容器操作
1.登陆容器
bash:以bash的形式进行交互模式
2.删除容器
默认情况下,docker rm命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器,强制删除参数加-f。
3.容器的导出与导入
导出镜像命令
导入镜像命令
4.查看容器
查看容器详情命令
查看容器内进程,b0b5a9371ce4是容器ID
查看docker状态
Docker数据管理
1.数据卷
数据卷(Data Volumes)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。
2.绑定数据卷
除了使用volume子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。
-mount选项支持三种类型的数据卷,包括:
下面使用training/webapp镜像创建一个Web容器,并创建一个数据卷挂载到容器的/opt/webapp目录:
上述命令等同于使用旧的-v标记可以在容器内创建一个数据卷:
另外,本地目录的路径必须是绝对路径,容器内路径可以为相对路径。如果目录不存在,Docker会自动创建。
3.数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。
创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata:
然后,可以在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷。
注意:使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
端口映射与容器互联
1.从外部访问容器应用
在启动容器时加入映射端口 -p 宿主机端口:容器端口
2.互联机制实现便捷互访
使用--link参数可以让容器之间安全地进行交互。
实战 单独安装部署Mysql、Redis、PHP、Nginx 应用
执行命令,查看本地镜像,stark_lnmp:v1.0 是我之前集成了lnmp1.7的镜像,有需要的同学可以从我要镜像地址
执行命令:
登陆docker:
启动lnmp
mysql测试:
执行结果:
Mysql,redis
2.修改默认配置
3.启动redis
php+Nginx
2.运行
3.安装Nginx
Mac Docker宿主机与容器不能通信问题
问题说明:再容器安装成功后,我遇到一个问题,好久不能得到解答,前几天终于茅塞顿开,为此我在放假期间,特意学了一遍Docker,从数据卷、网络方面入手,我当时所困惑的问题是为什么用客户端从可以访问,但是我容器中的PHP代码不能访问呢?
lnmp的docker实例中,php和mysql就可以正常访问到,但是到了容器间通信的时候就链接不到了,但是用客户端软件链接时却可以正确访问到。
访问代码:
“Connection refused”报错信息,是因为没有开启服务端,或者网络不通。我想尽办法都还是不行。
后来知道了底层的网络原理,原因是这样的,Docker的通信默认是网桥,宿主机和容器不在同一个网桥里,Mac的网桥里少了Docker0网段,外部部署的网络之所以能通是因为访问服务时,网段进行了网络的Nat的自动转换,lnmp可以访问到是因为所有的服务都部署在了同一个容器中,原来是这样。
知道的原理确实是不一样的,之后我也遇见过类似的问题,便可轻松化解,下面我说一下这个问题的解决办法。
1. 使用 docker-connector,然后执行以下命令把 docker 的所有 bridge 网络都添加到路由中。
也可以手动修改 /usr/local/etc/docker-connector.conf 文件中的路由,格式是:
配置完成,直接启动服务(需要 sudo,路由配置启动之后仍然可以修改,并且无需重启服务立即生效)
查看容器,启动成功了,问题就解决了,访问时把容器Ip绑定在Dns上就可以了。
测试一下,Mysql、Redis都可以链接了!