简单来说,在Windows系统下安装各种运行环境的坑简直不要太多了(● ̄(エ) ̄●),并不仅限于docker、Nginx、PHP、Python等等,我会尽详细写出实际过程中遇到的各种各样的奇葩问题

1.docker适用环境

其实docker本身也没有太多在Windows下花功夫。目前,docker仅支持Linux与Windows企业版、专业版、教育版。ps:家庭版不支持docker,并且win10下可以安装docker-for-windows,这个安装包是
专门适用于win10,安装简单,而对于win7/8则可以使用Docker Toolbox下载地址

2.端口映射的问题

  1. 问题详情

在Windows10系统服务器中安装了docker和docker-compose,并尝试在其中运行Nginx服务,映射也做好。在主机的浏览器中,打开localhost:port无法访问对应的Web服务

  1. 问题解析
    docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。也就是说,服务中使用的localhost指的是这个Linux环境的地址,而不是我们的宿主环境Windows10

  2. 解决办法
    启动docker命令行窗口,输入命令 docker-machine ip default 然后在Windows的浏览器中,输入 http://IP:port 即可启用

3.hyper-v与VMware不可兼容

   在Windows下安装docker,第一步就是要打开Hyper-V(打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V),开启win自带的虚拟管理技术。但是若想要使用VMware,则必须关闭Hyper-V,鱼和熊掌不可兼得呀!(′д` )…彡…彡

1、请移除hyper-v角色。
2、 以管理员身份(win + x)运行命令提示符;
3、执行命令:bcdedit /set hypervisorlaunchtype off
4、重启系统,运行vm即可。
5、如果想要恢复hyper启动: bcdedit / set hypervisorlaunchtype auto

注意:当我们的Windows电脑开启Hyper-V时,此刻我们启动安卓模拟器(夜神)时就会蓝屏

5.bin/sh和bin/bash的区别

这是两种不同的Linux shell,有的container两种都有,有的只有sh,有的只有bash。比如我们要获取一个nginx镜像,同一镜像存在有不同的tags

  • /bin/sh命令仅适用于tags带alpine标签的: nginx:1.17-alpine;
  • /bin/bash命令仅适用于tags不带alpine标识的:nginx:latest、nginx:1.8…

6.数据卷挂载式创建容器

1
2
3
4
5
守护式:docker run -di [--privileged=true] -P(或者指定端口 -p 外部port:该容器默认端口) \--name="newNginx"  -v /home/chd/Desktop/entwechatapp:/var/www/EntWeChatApp:rw  nginx:1.15.7-alpine
交互式:docker run -it [--privileged=true] -P(或者指定端口 -p 外部port:该容器默认端口) \--name="newNginx" -v /home/chd/Desktop/entwechatapp:/var/www/EntWeChatApp:rw nginx:1.15.7-alpine
含义:
a) 以-v /home/chd/Desktop/entwechatapp:/var/www/EntWeChatApp:rw 带rw(read,write)权限来将宿主机与容器进行数据卷挂载
b) docker run 以新容器名和端口号以及守护式或者交互式来创建容器

7.宿主机与docker容器权限纠纷

问题描述:
      它来了!问题又出现了!哭啦。数据卷挂载时,即使声明了rw权限,在宿主机中创建文件,数据共享后,容器内能够具有正常的rw权限;但在容器内新建了文件后,宿主机就只有只读权限,无法修改文件内容。

解决方案:宿主机的权限不够
      在(7)式中的万能公式中添加:docker run ··· --privileged=true ···

8.docker配置nginx的配置文件

我都想把它杀了,部署nginx太多坑了,不过参考了此博文,最终解决了问题,解决方法:

1.创建三个根目录根据情况创建:/docker/nginx/conf www logs

docker run -d -p 80:80 --name=”nginx” --net host -v /docker/nginx/www:/usr/share/nginx/html -v /docker/nginx/logs:/var/log/nginx nginx:1.17.5

2.不对配置文件进行数据挂载即

-v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 这个

3.进入容器 获取文件

docker exec -it nginx /bin/bash

4.cd /etc/nginx/

(这里主要获取配置文件路径的),然后exit

5.数据拷贝

进入宿主机目录文件 cd /docker/nginx/conf/
将已经运行成功的容器的配置文件拷贝到宿主机的配置文件目录:docker cp 容器ID:/etc/nginx/nginx.conf .(ps:“.”表示拷贝到当前目录)

ps:文件copy成功后 把nginx容器先删除掉

6.创建最终的nginx容器

script
1
2
3
4
5
6
7
8
9
docker run -di -p 80:80 
--name nginx
# [--net host] :再思考一下有没有必要写,使用–net = host时,它告诉容器使用主机网络堆栈.
# 因此无法将端口暴露给主机,因为它是主机(就网络堆栈而言).
-v /docker/nginx/www:/usr/share/nginx/html
-v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /docker/nginx/logs:/var/log/nginx
nginx:1.17.5
ps:成功后就代表部署成功

2019-11-29 新增:
      这里宿主机的nginx.conf其实是挂载了一个文件,docker是不推荐这样使用的,可以尝试在宿主机上创建目录为:/docker/nginx/conf/nginx.conf/nginx.conf(当前conf文件是一个具体的配置文件,不是一个目录),这样上式就不会出现docker warning
,结合此篇文章

PS:访问可能会403 因为/docker/nginx/www/ 里面没有index.html放进去就好了

7.权限赋予

挂载成功后,给宿主机上的www目录(或整个文件目录)增加权限,不然一直无法读写:
    sudo chmod -R 777 目标目录 :给目标目录赋予最大管理员权限
    sudo chmod +/-rwx 文件名|目录 给文件或目录的赋予权限

9.docker配置MySQL

script
1
2
3
4
5
6
docker run -di -p 12345:3306 
--name="mysql"
-v /lnmp/mysql/conf:/etc/mysql/conf.d
-v /lnmp/mysql/logs:/logs
-v /lnmp/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456:rw mysql:5.6

命令说明:
-p 12345:3306:将主机的12345端口映射到docker容器的3306端口。
--name mysql:运行服务名字
-v /lnmp/mysql/conf:/etc/mysql/conf.d :将主机/lnmp/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d
-v /lnmp/mysql/logs:/logs:将主机/lnmp/mysql目录下的 logs 目录挂载到容器的 /logs。
-v /lnmp/mysql/data:/var/lib/mysql :将主机/lnmp/mysql目录下的data目录挂载到容器的 /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
-d mysql:5.6 : 后台程序运行mysql5.6

10.容器管理工具portainer使用

  1. 这个数据卷用于持久化Portainer数据

docker volume create portainer_data

  1. 创建相关portainer容器
script
1
2
3
4
5
docker run -di \
-p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer

12.外部Windows如何访问docker内的容器

1.基本架构:Windows,Dockers,Linux三者关系

Windows,Dockers,Linux三者关系

2.相关操作

2.1 关闭Linux防火墙:systemctl stop firewalld.service

2.2 查看Linux,Docker的IP地址:ifconfig(区别于Windows的ipconfig命令)

2.3 Windows访问测试:

思想:docker作为一个容器虚拟技术,创建并启动相关的容器服务,并把端口映射到Linux系统中。比如MySQL:docker启动MySQL服务后,并映射了一个外部访问的某端口(比如还是3306)
,则此刻Linux就具有了3306这个一个端口=>外界访问方式应该是:访问虚拟机Linux上与之相绑定docker容器映射出的端口。


2019-11-27 新增:
Linux:
在 windows 系统中访问 linux 中 nginx,默认不能访问的,因为防火墙问题,即我们可以有两种解决方法
(1)关闭防火墙:参考上述相关操作
(2)开放访问的端口号,比如80端口,操作如下:

查看开放的端口号

firewall-cmd --list-all

设置开放的端口号

firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=80(或其它开放端口号)/tcp --permanent

重启防火墙

firewall-cmd --reload


Ubuntu:
Ubuntu与linux对于防火墙的操作存在很大的区别:注意区分
1、查看端口开启状态(inactive表示已经关闭了防火墙)
sudo ufw status

2、开启某个端口,比如我开启的是3306
sudo ufw allow 3306

3、开启防火墙
sudo ufw enable

4、关闭防火墙
sudo ufw disable

5、重启防火墙
sudo ufw reload

6、禁止外部某个端口比如80
sudo ufw delete allow 80

7、查看端口ip
netstat -ltn

参考文章


 评论

联系我 | Contact with me

Copyright © 2019-2020 谁知你知我,我知你知深。此恨经年深,比情度日久

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议