Blog
Blog copied to clipboard
Docker
使用Docker创建虚拟机
标签(空格分隔): Docker
2016-03-30 Update :
果然学一个新的软件的时候,首先应当好好的阅读官方文档,即使是英文。
在Docker的官方文档里面说的很清楚,在OS X的系统上面,Docker的容器运行在一个Linux的VM中,而这个VM是VirtualBox创建的。所以之前即使指定了host模式来运行容器,外部也没有办法访问到容器里面的服务,除非外网能直接连接到VM的IP。原来的操作不管是使用-P
还是-p 80:8080
,都是把VM的端口转发到容器当中,对宿主机器当然没有影响了。所以访问localhost:8080
是找不到页面的。
而在Linux的系统上面,去掉了中间层的VM,所以我在VPS上面搭建的服务是直接可以用的。
PS:由于网络方面接触的少,不会通过各种工具验证容器的服务是否已经对外开放,选了个笨办法,建立一个nginx的容器,尝试从外部访问nginx的index,如果能访问到,就说明这么做建立的容器是可以在外网访问到的。
最终:
截至目前,Docker-machine 并没有提供官方的桥接方式的VM创建方法,手动修改VM的网络模式会影响docker-machine工作,参考。所以VM默认的网卡全部不能修改,顶多手动添加第三个网卡工作在桥接模式,但是这样又会出新的错误,但是起码还可以通过某些方式让docker正常工作,详见上面参考。
现在知道服务器为什么总是用Linux系列的系统了。
2016-04-15
终于发现可以利用Virtual Box的端口映射功能,把Host的端口映射给VM,从而实现暴露容器端口的功能。需要通过配合-p
使用。
Docker入门--极客学院
Chinese_Docker
基本的命令上面基本已经说的很清楚了。
第一次接触图方便,直接使用加了阿里源的Centos来搭建SS的服务器,结果人家直接里面个装好了一个Supervisor,强制镜像的进入点就是Supervisor,闹不来。
刚刚找到一个文章,完美的解决了我不会使用supervisor的问题。感谢博主。 参见:https://github.com/billycyzhang/docker
- docker build 最后使用原始的CentOS,修改了一下DockerFile,自己Build了一个镜像,然后在上面搭建ShadowSocks服务和VPN服务。shadowsocks映射端口之后可以使用,但是速度特别慢。VPN映射端口以后还是连接不上,下一步计划采用桥接的方式直接新建容器试试。
- docker run
用来启动容器,此处需要注意:
- 使用此命令的时候,需要加入参数
--privileged=true
来开启一些专用的命令权限,比如IPTabels。 - 启动的时候需要端口映射,使用
-p 10022:22
可以把容器的22端口映射到宿主机器的1022端口。 - docker file 里面暴露接口的命令需要配合
-P
指令使用,会随机分配宿主机器的端口给容器的对应端口。使用docker port <容器名>
可以查看容器端口映射情况。 - 使用桥接模式来把容器暴露在外网上,使用的是Linux桥接,所以配置这里的时候应该是跟宿主机器有关的,在宿主机器上自定义网桥,启动容器的时候使用
-b
指定使用的网桥。
- 使用此命令的时候,需要加入参数
- docker commit
~~在Docker的容器里面做的改动不会保存~~,每次从镜像启动的时候都会基于镜像新建一个容器。如果要保存对容器的改动,使用
docker commit
,会基于给出的容器新建一个镜像,保存下来。 参见:http://www.docker.org.cn/book/docker/docer-save-changes-10.html- 2016-04-15 注
-
docker run
是基于image直接新建一个容器,所以出现了容器里面的改动没有保存的情况,实际上,使用docker start <container_name>
就可以继续使用上次操作过的容器了,里面的数据还是在的。 - 另一方面,可以使用Volume功能,可以直接将HOST机器的目录挂载到容器中,实现数据持久化。或者使用数据卷来做数据持久化功能,详见数据卷。
-
- 2016-04-15 注
如果Docker Hub已经有针对某个功能的镜像存在,新手最好先直接使用人家提供的镜像来直接实现功能,然后再考虑人家是怎么实现的。完成任务为主。
Docker中实现VPNDocker Hub上已经提供了基于Ununtu的实现,一条命令就可以实现所需要的功能。
- VPN和ShadowSocks的镜像参见此处:http://codecloud.net/docker-6766.html
大坑
Centos 7的Docker容器使用systemctl
命令来启动服务的时候会遇到问题,反正是启动不了,网上查询,可能与系统底层的是实现有关,使用最新版的CentOS就可以解决问题,但是我pull使用最新版的CentOS依旧报错,不能启动pptpd服务,只能手动找到其shell位置(/usr/sbin/pptpd)来启动,但是映射了1723端口也不能连接,下一步使用桥接模式直接把容器暴露出来试一下。
- 分析,上面出现问题的原因还是OSX在Docker外层嵌套了一层VM导致的,我映射1723端口并没有真正的把端口映射出来,而是做到了VM的端口上,而我连接HOST的1723端口是不可能有反应的。
CentOS 7的systemctl使用
CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/。 参考: http://blog.csdn.net/yuanguozhengjust/article/details/38019923
加速器
国内的网络情况实在特殊,为了加速从DockerHub下载镜像,只能通过私有仓库了。 daocloud.io 提供了一个不错的平台,可以在上面体验体验。 这里主要使用了他的加速器功能和镜像仓库的功能。
加速器的话,按照他的说明,接入自有主机就可以使用dao pull ***
.
公司的网络状况不是很理想,这样接入加速器,效果不是特别明显,而且在我pull一个gitlab-ci-android的镜像的时候,发现居然每次执行pull都会重新把3层镜像重新下载一遍,每次下载的镜像大小都不一样,不知道是不是他的BUG,不过加速倒是有效果,第一次pull很慢,再往后就快了。我去掉DaoCloud的加速器直接使用docker pull
来下载镜像的话,每次镜像的大小都是稳定的,为什么说每次,因为公司网络问题,下载实在太龟速,而且会假死,只有重启docker-machine,从头重新下载这三个镜像才能恢复下载。虽然也不能叫恢复。
但是我使用docker作为CI的执行器,这样每次都要pull,时间上是无法接受的。
所以干脆自己从自己的VPS上从DockerHub下载好镜像,使用DaoCloud提供的镜像仓库功能,自己push镜像,然后在公司直接下载自己push的镜像,由于服务器在国内,速度果然杠杠的。 自己push镜像是需要收费的,刚好他们在做活动,领一个红包,够两个月用了。一个月20也不算太贵。 另外我看到DaoCloud的官网不推荐自己push镜像,建议自己写DockerFile到他那里构建镜像,但是我不会……
数据卷
OS X上进行Docker操作还是比较麻烦的。因为会出现各种小问题。
-
在Docker里面建立一个GitLab-CE的容器,VM的22端口是被端口转发占用的,
docker-machine ssh default
应该就是这样连接到VM中的。GitLab使用SSH协议来传输代码的时候,默认使用的端口也是22,这就造成了冲突,经过实验,修改GitLab的配置,使用别的端口比如2222,同时docker做端口映射
-p 2222:22
,没错,转发到容器的22端口,因为根据资料,sshd的配置文件并没有改变,所以容器里面监听的还是22端口,但是比较奇怪的是在外部ssh -T -p 2222 [email protected]
是成功的。这里ip地址使用VM的。 这里我是懵的,不知道GitLab对容器的端口搞了什么魔法。而在CI的Biuld的时候,Docker 使用
git pull
的时候,使用的是HTTPS协议,默认使用80端口,我修改了GitLab的配置添加一行external_url "https://gitlab.example.com:8080"
,发现CE直接起不来了。索性直接把80端口映射出来了。又是一个TODO。 -
资料 Docker中文指南 深入理解Docker Volume 一 深入理解Docker Volume 二
深入理解Docker Volume中观点可能过时,请注意。但是把Volume的工作方式讲了一下。
错误在这里。
使用OS X建立容器GitLab-CE的时候,使用--volume参数会有问题,并且到目前(2016-04-15)为止,官方指导文档并没有提及这个问题。也不知道现在修复了没有,反正我按照教程来搞是没办法启动CE的。据说是boot2docker不支持,现在用的是Docker-Machine嘛。我也不敢肯定。
解决办法就是使用数据卷。把CE和产生的数据解耦,方便。
CentOS7 安装Docker yum install 冲突问题
http://www.docker.org.cn/thread/63.html http://blog.csdn.net/beer_do/article/details/50469008
先安装 lvm2,然后再装 docker 既可以解决问题: yum install lvm2 yum install docker