alwaystest / Blog

24 stars 2 forks source link

Docker #10

Open alwaystest opened 8 years ago

alwaystest commented 8 years ago

使用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 Hub已经有针对某个功能的镜像存在,新手最好先直接使用人家提供的镜像来直接实现功能,然后再考虑人家是怎么实现的。完成任务为主。

Docker中实现VPNDocker Hub上已经提供了基于Ununtu的实现,一条命令就可以实现所需要的功能。


大坑

Centos 7的Docker容器使用systemctl命令来启动服务的时候会遇到问题,反正是启动不了,网上查询,可能与系统底层的是实现有关,使用最新版的CentOS就可以解决问题,但是我pull使用最新版的CentOS依旧报错,不能启动pptpd服务,只能手动找到其shell位置(/usr/sbin/pptpd)来启动,但是映射了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操作还是比较麻烦的。因为会出现各种小问题。

  1. 资料:GitLab-Issue #1157

    在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 git@x.x.x.x是成功的。这里ip地址使用VM的。 这里我是懵的,不知道GitLab对容器的端口搞了什么魔法。

    而在CI的Biuld的时候,Docker 使用git pull的时候,使用的是HTTPS协议,默认使用80端口,我修改了GitLab的配置添加一行external_url "https://gitlab.example.com:8080",发现CE直接起不来了。索性直接把80端口映射出来了。又是一个TODO。

  2. 资料 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