docker的基本介绍这里就不在叙述了,百度以及谷歌上很多介绍。这里主要是介绍如何使用docker搭建基本的php-nginx环境。
docker下一般将每个服务器作为一个单独的容器,这里也是这样来实现。
本文中使用的镜像均为官网上的。
准备工作,现在电脑上创建一个目录作为映射到容器中的配置文件、数据库db等,路径根据自己的环境修改。
mkdir -p /docker/www
mkdir -p /docker/nginx/conf.d
mkdir -p /docker/php/7-2/
创建专属的网络,使用bridge模式。
docker network create -d bridge lnmp-network
1.安装nginx
docker pull nginx
在电脑上创建nginx配置文件(可以直接从别的地方拷贝过来)
vim /docker/nginx/conf.d/default.conf
server {
listen 80 default_server;
server_name _;
root /usr/share/nginx/html;
location / {
index index.html index.htm index.php;
autoindex off;
}
location ~ \.php(.*)$ {
root /var/www/html/;
fastcgi_pass localhost:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
启动nginx服务
docker run -itd --network lnmp-network -p 33231:80 --name nginx \
-v /docker/www/:/usr/share/nginx/html \
-v /docker/nginx/conf.d:/etc/nginx/conf.d \
--privileged=true \
-d nginx
这的命令是
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--network 指定使用的网络,不填则为默认的bridge0
-p 指定与宿主主机的IP地址映射,这里是本机的33231端口映射到nginx容器中的80端口
--name 指定容器的名字
-v 将本地的配置文件映射到容器,本地修改后会同步修改容器(修改配置信息记得需要重启服务)
--privileged 容器中的root用户将会获得root权限(容器的root用户为一般用户权限)
-d 指定镜像
运行后,就可以通过http://localhost:33231进行访问
2.安装php7-2-2
docker pull php:7.2.2-fpm
这里对不修改php的配置文件,就直接启动了。如有需要修改就类似nginx的方式进行配置文件映射即可
docker run --net=container:nginx --name php72 \
-v /docker/www/:/var/www/html/ \
-d php:7.2.2-fpm
这里的命令是:
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;这里使用的是container类型,与nginx的容器是公用同一个网络,这种情况下就不需要单独的配置端口映射,IP地址等。因为docker每次启动的ip地址都是不固定的,通过这种方式,只需要localhost即可。
在很多时候本机有一个php版本,已经占用了9000端口,通过这种网络方式可以不要占用本机的端口进行映射。
其他的命令与nginx一致,就不在多说了。
下面介绍下四种网络类型:
- bridge模式是docker默认的,也是开发者最常使用的网络模式。在这种模式下,docker为容器创建独立的网络栈,保证容器内的进程使用独立的网络环境。
-host模式| 由于容器和宿主机共享同一个网络命名空间,换言之,容器的IP地址即为宿主机的IP地址。所以容器可以和宿主机一样,使用宿主机的任意网卡,实现和外界的通信。其网络模型可以参照下图
采用host模式的容器,可以直接使用宿主机的IP地址与外界进行通信,若宿主机具有公有IP,那么容器也拥有这个公有IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行NAT转换,而且由于容器通信时,不再需要通过linuxbridge等方式转发或者数据包的拆封,性能上有很大优势。
当然,这种模式有优势,也就有劣势,主要包括以下几个方面:
1)最明显的就是容器不再拥有隔离、独立的网络栈。容器会与宿主机竞争网络栈的使用,并且容器的崩溃就可能导致宿主机崩溃,在生产环境中,这种问题可能是不被允许的。
2)容器内部将不再拥有所有的端口资源,因为一些端口已经被宿主机服务、bridge模式的容器端口绑定等其他服务占用掉了。
-none模式在这种模式下,容器有独立的网络栈,但不包含任何网络配置,只具有lo这个loopback网卡用于进程通信。也就是说,none模式为容器做了最少的网络设置,但是俗话说得好“少即是多”,在没有网络配置的情况下,通过第三方工具或者手工的方式,开发这任意定制容器的网络,提供了最高的灵活性。
-container模式是docker中一种较为特别的网络的模式。在这个模式下的容器,会使用其他容器的网络命名空间,其网络隔离性会处于bridge桥接模式与host模式之间。
网络拓扑图如下:
当容器共享其他容器的网络命名空间,则在这两个容器之间不存在网络隔离,而她们又与宿主机以及除此之外其他的容器存在网络隔离。
在这种模式下的容器可以通过localhost来同一网络命名空间下的其他容器,传输效率较高。而且这种模式还节约了一定数量的网络资源,但它并没有改变容器与外界通信的方式。
在一些特殊的场景中非常有用,例如,kubernetes的pod,kubernetes为pod创建一个基础设施容器,同一pod下的其他容器都以其他容器模式共享这个基础设施容器的网络命名空间,相互之间以localhost访问,构成一个统一的整体。
docker常用命令介绍
容器启动,停止,重启操作:
docker start container(容器名)
docker stop container(容器名)
docker restart container(容器名)
查看容器实时状态:
docker stats
查看容器运行列表:
docker ps
停止所有正在运行的容器:
docker kill $(docker ps -a -q)
删除所有已停止运行的容器:
docker rm $(docker ps -a -q)
进入容器内进行操作:
docker exec -it content-name-or-id /bin/bash
搭建到这就完成了,特别感谢以下资料来源:
http://www.jb51.net/article/113296.htm
http://www.cnblogs.com/kevingrace/p/6590319.html
https://www.centos.bz/2017/01/docker-network-create-create-a-network/
网友评论