一、通过远程主机访问和管理docker 

    Docker是C/S架构构成的,当我们使用docker version,可以看到是由客户端和服务端构成。

Client:Version:           20.10.2
Server:
 Engine:
  Version:          20.10.2

    默认情况下 docker 没有打开服务端,其使用的是sock的软件方式 api 与后端的containerd通讯。需要对docker的 systemd service 文件进行修改后方可启动服务器端。找到docker.service文件,在其docker的启动命令中添加如下参数,表示让客户端与服务端分开,让服务端监听主机的接口。如下为 docker.service文件内容:

$ loacte docker.service
/var/lib/systemd/deb-systemd-helper-enabled/multi-user.target.wants/docker.service 
# 下面的文件也是链接到/lib/systemd/system/docker.service
/etc/systemd/system/multi-user.target.wants/docker.service
/lib/systemd/system/docker.service
$ vim /lib/systemd/system/docker.service
...
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 把上面这行改成如下监听tcp服务
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0 --containerd=/run/containerd/containerd.sock
ExecReload=/bin/ki

system restart docker 之后当我们重启之后就可以看到docker主进程,并且监听的是本机地址
#通过远程主机访问docker的镜像, 列出images..
docker -H  192.168.1.121 images

    如上,将docker 改为tcp方式启动之后,就可以远程连接服务器上的 docker 查看服务了。

二、 在debian上使用docker部署nginx+php环境

    使用docker部署环境很方便,但也会遇到很多新的问题。这里列举了一下使用docker部署nginx+php环境时容易遇到的一些问题及解决方法。docker使用的是18.06.1-ce版本,nginx是pull下的使用search查询出来的官方排第一的版本,php使用的是deluxo/php7.1-fpm,一个PHP7.1-FPM stable with modules的版本。pull下下来之后第一步启动nginx,命令如下:

docker run --name nginx -d \

-p 80:80 \

-v /data01/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \

-v /data01/nginx/log:/var/log/nginx \

nginx

    提一下:--name表示你启动下载下来的镜像(最后一个nginx)后生成的这个容器的名字。-d表示端口映射,前面是本机的,后面是docker内部的,后面的-v参数也都是这个顺序。启动之后使用docker ps -a 可以查看到容器列表,第1列即为容器的ID,具体后面的准确地址可以通过如下命令进入容器查看文件目录,每个容器内部都是一个子系统,有自己的目录结构。命令如下:

docker exec -it 4c9b5e7242c2(容器ID) /bin/bash

    在启动nginx的时候可能会出错,排查日志可以通过docker logs 容器ID来显示日志问题。另外启动的时候很容易就出现了一启动然后容器在不停的exit退出(即便加了-d选项),这个一可能是你的启动命令中有问题,比如目录不存在,比如PHP本身扩展不存在,可通过日志查看,二也可以使用加it选项为启动容器。例如如下启动php的命令:

docker run --name php -idt \
-p 9000:9000 \
-v /opt/www-data/test.com:/www \
php7.1-fpm

    成功启动php后,你可以开始配置 nginx 中的 fastcgi 配置,但当你填写写127.0.0.1:9000的后端后会发现nginx根本找不到php。原因很简单,因为php是在docker里面运行的,其IP根本不是127.0.0.1。要查找IP可以通过docker inspect 容器ID,查看php容器的详细信息,其中有多处会涉及:IPAddress项,这才是php upstream的实际监听的IP地址(这里监听的也有服务器的内网IP地址)。

    修改完了这项之后重启nginx,再执行请求依然没有成功,但这时请求打到了php上了,可以使用docker logs -f php容器ID实时查看请求记录,但返回的却是404。没错是404,因为虚拟运行的php有它自己的root地址,就是/www。所以nginx中的location匹配php时,fastcgi_param后面应该是:

SCRIPT_FILENAME /www$fastcgi_script_name;

才可以,再重启就应该没有问题了。

ser@n125:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
php                 latest              0ceab3be41fb        11 days ago         398MB
nginx               latest              540a289bab6c        13 days ago         126MB
deluxo/php7.1-fpm   latest              05a9bb2fc4f0        2 years ago         673MB
user@n125:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2a11136df1e2        deluxo/php7.1-fpm   "docker-php-entrypoi…"   25 minutes ago      Up 25 minutes       0.0.0.0:9000->9000/tcp   php
4c222e7242c2        nginx               "nginx -g 'daemon of…"   3 hours ago         Up 23 minutes       0.0.0.0:80->80/tcp       nginx
user@n147-026-025:~$
#ngin中与php调用的配置
location ~ \.php$ {
			include fastcgi_params;
			fastcgi_param SCRIPT_FILENAME /www$fastcgi_script_name;
			fastcgi_pass 172.17.1.13:9000;
			try_files $uri =404;
		}