Windows平台上docker虚拟机导致的非期望现象

2019-10-31

问题背景

Windows10家庭版中安装docker toolbox 19版本;
安装nginx的Dockerfile的如下

FROM centos:centos7

ENV nginxversion="1.14.0-1" \
    os="centos" \
    osversion="7" \
    elversion="7_4"

RUN yum install -y wget openssl sed &&\
    yum -y autoremove &&\
    yum clean all &&\
    wget http://nginx.org/packages/$os/$osversion/x86_64/RPMS/nginx-$nginxversion.el$elversion.ngx.x86_64.rpm &&\
    rpm -iv nginx-$nginxversion.el$elversion.ngx.x86_64.rpm

COPY nginx.conf /etc/nginx/nginx.conf
COPY index.html /data/www/index.html
VOLUME [ "/data/www" ]
EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

其中index.html里面是一条welcome信息。
在git bash中切换当前目录到Dockerfile所在文件夹,
运行docker build -t local/static_web:latest .生成对应的image;起一个容器后,利用
docker port命令可以查看到容器的80端口映射到了宿主机的32773端口。

问题:
– 在容器内curl localhost:80,能正常显示index.html的结果
– 在windows宿主机上curl localhost:32773提示错误

原因与解决

原因在于windows上docker的工作模式是起了一个linux系统,然后容器是基于这个linux虚拟机运行的,所以,32773这个端口,其实是这个linux的端口。

解决: windows上运行powershell,输入docker-machine ip default获取linux虚拟机的ip,一般默认是192.168.99.100,然后在浏览器中输入http://192.1687.99.100:32773,即可显示正常的回显效果。


2019-11-03

为什么nginx启动时,需要默认前台启动

Docker会以pid=1,也就是第一个启动的进程作为判断容器是否存在的依据,守护进程fork新进程时,创建守护进程的进程将退出,容器也会随之退出,因此,需要保持第一个进程始终运行在前台。