docker容器虚拟化技术
简单来说,在Windows系统下安装各种运行环境的坑简直不要太多了(● ̄(エ) ̄●),并不仅限于docker、Nginx、PHP、Python等等,我会尽详细写出实际过程中遇到的各种各样的奇葩问题
1.docker适用环境
其实docker本身也没有太多在Windows下花功夫。目前,docker仅支持Linux与Windows企业版、专业版、教育版。ps:家庭版不支持docker,并且win10下可以安装docker-for-windows,这个安装包是
专门适用于win10,安装简单,而对于win7/8则可以使用Docker Toolbox下载地址
2.Windows下无法对docker容器进行端口访问(端口映射的问题)
1.问题详情
在Windows10系统服务器中安装了docker和docker-compose
并尝试在其中运行Nginx服务,映射也做好
问题:在主机的浏览器中,打开localhost:port无法访问对应的Web服务。
2.问题解析
原因:docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。也就是说,服务中使用的localhost指的是这个Linux环境的地址,而不是我们的宿主环境Windows10。
3.解决办法
启动docker命令行窗口
输入命令:docker-machine ip default
Linux的ip地址,一般情况下这个地址是192.168.99.100
然后在Windows的浏览器中,输入 http://IP:port 即可启用(http://192.168.99.100:8069)
3.docker与VMware不可兼容
在Windows下安装docker,第一步就是要打开Hyper-V(打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V),开启win自带的虚拟管理技术。但是若想要使用VMware,则必须关闭Hyper-V,鱼和熊掌不可兼得呀!(′д` )…彡…彡
4.Windows:vmware与hyper-v不兼容,请移除hyper-v角色
1、请移除hyper-v角色。
(1)以管理员身份(win + x)运行命令提示符;
(2)执行命令:bcdedit /set hypervisorlaunchtype off
(3)重启系统,运行vm即可。
2、如果想要恢复hyper启动:
bcdedit / set hypervisorlaunchtype auto
5.docker run后接/bin/sh和接/bin/bash的区别是什么:
比如我们要获取一个nginx镜像,同一镜像存在有不同的tags
/bin/sh命令仅适用于tags带alpine标签的: nginx:1.17-alpine;
/bin/bash命令仅适用于tags不带alpine标识的:nginx:laster,nginx:1.8...
6.docker运行MySQL服务
(1). 拉取镜像
docker pull mysql:[tag]
(2). 创建并运行容器
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
ps: -p 表示指定访问端口
-e 设置环境变量,或者覆盖已存在的环境变量
-d 表示以守护式方式来运行容器
MYSQL_ROOT_PASSWORD=123456 声明MySQL的用户名为ROOT,密码为123456
(3). 查看容器是否启动
docker ps
(4). 启动容器
docker start container_id
(5). 进入容器内部,以命令行交互
docker exec -it container_id /bin/bash
(6). 登录MySQL
mysql -u root -p 然后在输入密码
(7). 成功表示已经成功登陆MySQL
7.最强万能公式:数据卷挂载式创建容器
守护式: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 以新容器名和端口号以及守护式或者交互式来创建容器
8.宿主机与docker容器权限纠纷
问题描述:
它来了!问题又出现了!哭啦。数据卷挂载时,即使声明了rw权限,在宿主机中创建文件,数据共享后,容器内能够具有正常的rw权限;但在容器内新建了文件后,宿主机就只有只读权限,无法修改文件内容。
解决方案:宿主机的权限不够
在(7)式中的万能公式中添加:docker run ··· --privileged=true ···
9.docker配置nginx的配置文件
命令:docker run --name="dnmp_nginx" -p 80:80 -v /home/docker-nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/docker-nginx/log:/var/log/nginx -v /home/docker-nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -di nginx:\[tags]
第一个-v 表示将你本地的nginx.conf覆盖你要起启动的容器的nginx.conf文件,第二个表示将日志文件进行挂载,就是把nginx服务器的日志写到你docker宿主机的/home/docker-nginx/log/下面。第三个-v 表示的和第一个-v意思一样的
我个人更喜欢守护式映射的方式,麻烦的是需要自己准备好nginx.conf 和default.conf文件,我是直接从容器里面复制的,然后根据自己的需要改的
我都想把它杀了,部署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容器
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 文件名|目录 给文件或目录的赋予权限
10.docker配置MySQL,redis教程等,请点击此处链接
命令: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
11.外部Windows如何访问docker内的容器
1.基本架构: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 新增:
在 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
docker容器虚拟化技术的更多相关文章
- docker和虚拟化技术的区别
1.docker和虚拟化技术的区别 Docker 扩展了 Linux 容器(Linux Containers),或着说 LXC,通过一个高层次的 API 为进程单独提供了一个轻量级的虚拟环境.Dock ...
- 【linxu】部署docker容器虚拟化平台
实验所涉内容 Docker 概述 部署 docker 容器虚拟化平台 docker 平台基本使用方法 创建docker镜像和发布镜像方法 Container 容器端口映射 一 Docker 概述 Do ...
- Linux高级运维 第八章 部署docker容器虚拟化平台
8.1 Docker概述 实验环境: CENTOS7.4-63 64位 Dcoker概述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到 ...
- Docker容器化技术(上)
目录 Docker容器化技术 一.介绍 二.Docker的发展 三.Docker安装 四.阿里云Docker镜像加速 五.Docker的基本概念 六.命令 七.Docker宿主机与容器通信 八.容器内 ...
- Docker 容器虚拟化
Docker 容器虚拟化 1.虚拟化网络 Network Namespace 是 Linux 内核提供的功能,是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自网络栈信息.不管是虚拟机 ...
- Docker容器虚拟化
Docker容器虚拟化 目录 Docker容器虚拟化 虚拟化网络 单节点容器间通信 不同节点容器间通信 虚拟化网络 Network Namespace 是 Linux 内核提供的功能,是实现网络虚拟化 ...
- Docker容器化技术
1. 初始Docker 1.1 Docker概念 Docker概念:Docker是一个开源的应用容器引擎 诞生于2013年初,基于Go实现,dotCloud公司出品(后改名为Docker Inc) D ...
- Docker容器化技术(下)
Docker容器化技术(下) 一.Dockerfile基础命令 1.1.FROM - 基于基准镜像 FROM centos #制作基准镜像(基于centos) FROM scratch #不依赖任何基 ...
- Docker 容器相关技术
Docker 依赖的Linux内核特性 Namespaces 命名空间 Control groups (cgroups) 控制组 理解这两个特性,能够更好的帮助我们理解docker的资源分配和管理 N ...
随机推荐
- 移动开发在路上-- IOS移动开发系列 多线程三
这一次说一点概念性的东西,也是为后边做一些基础 HTTP协议的基本概念 http协议的基本概念 全称“超文本传输协议”,浏览器和服务器之间的通信规则 HTTp协议永远都是客户端发起的请求,服务器回送响 ...
- IPhone下json的解析 NSJSONSerialization
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Lan ...
- HDU5394 Bomb
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5934 There are NN bombs needing exploding. Each bomb ha ...
- B.Box
题目:盒子 题目:排列p是一个整数序列 p = [p1, p2,...,pn],由n个唯一的正整数组成 唯一的线索是你需要打开上锁的盒子 你只知道前缀的最大数,q1, q2, ..., qn,保证qi ...
- Selenium之ActionChains类、Keys类
ActionChains类(鼠标操作)常用于模拟鼠标的行为,比如单击.双击.拖拽等行为. 一些常用的模拟鼠标的操作方法有: click(on_element=None) --- 鼠标单击 do ...
- linux—netstat
netstat--option -a: 列出所有端口,监听的没有监听的 -t: 显示tcp相关的选项 -u: 显示udp相关的选项 -l: 仅仅显示监听选项 -p: 显示与连接有关的程序名和 ...
- InputStream 读取中文乱码 扩展
对于InputStream读取中文乱码,下面这段话给出了很好的解释,以及后续编码上的扩展. BufferedInputStream和BufferedOutputStream是过滤流,需要使用已存在的节 ...
- LNMP-Nginx配置SSL
SLL工作流程: 浏览器发送一个https的请求给服务器: 服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以 ...
- liunx新装tomcat之后,tomcat不能识别新发布的项目
遇到的问题 在liunx新装tomcat之后,发布之前的项目,发现在tomcat不能识别新发布的项目,打成war包,还是直接把项目拷贝过去都不行. 环境:虚拟机:VMware 主机系统:win10 虚 ...
- 2019百度阿里Java面试题(基础+框架+数据库+分布式+JVM+多线程)
前言 很多朋友对面试不够了解,不知道如何准备,对面试环节的设置以及目的不够了解,因此成功率不高.通常情况下校招生面试的成功率低于1%,而社招的面试成功率也低于5%,所以对于候选人一定要知道设立面试的初 ...