本文目的是给几乎从未接触过docker,或者仅仅是据说或者经过新闻了解过Docker的同窗
经过一个已有的Docker仓库构建和提交本身的Docker 镜像
这里会涉及到一些概念,可是不单独介绍php
这里首先推荐一本书:《第一本Docker的书》,若是你有充分的时间来阅读此书,那么本文对你来讲几乎无用,本文内容均摘抄和整理自此书。linux
在准备完成以上环境检查后,就能够去看安装教程,文档很是详尽和具体docker
Docker的正常运行是须要Docker服务的支持,就像Apache Http Server 同样,咱们称之为Docker守护进程shell
# 若是是经过yum atp-get安装,应该已经生成了相应的服务 service docker start # 或者你须要这样来手动运行 /usr/bin/docker daemon
这里可能有个问题,若是你加上docker daemon -H tcp://127.0.0.1:2389 指定监听的地址,那么你须要在全部的指令中指明这个地址。
好比:docker -H tcp://127.0.0.1:2389 infoubuntu
怎么知道一切正常?windows
# 执行info指令 [root@kevin kevin]$ docker info
输出:
Containers: 5
Running: 0
Server Version: 1.10.1
...省略一些
Registry: https://index.docker.io/v1/centos
大多数时候,你应该开始运行Hello World程序,好吧那就开始缓存
docker run hello-world #你会看到Docker在下载这个镜像,而后打印
输出:
Hello from Docker.
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:bash
查看你全部的镜像服务器
[root@kevin kevin]$ docker images
通常教程到这里,你可能被告知能够开始运行一个ubuntu镜像,这很简单:
docker run -i -t ubuntu #docker会自动下载和启动ubuntu容器
其余镜像你能够在这里找到:https://hub.docker.com/
可是在你开始漫长的镜像更新以前,你能够先询问一下,若是你附近有一个私有仓库,那么过程会快的多。下面介绍基于私有仓库使用,若是要使用官方仓库,去掉教程中IP的部分即可。
好比192.168.2.1/centos:6 改成 centos:6 就好了。
假设上面一切顺利,那么你就能够开始构建你的镜像了,这里首先简单解释镜像是什么。在使用Docker的时候,你须要构建不少镜像,它们多是Nginx镜像,Nginx + PHP + MySQL镜像,Cassandra镜像,或者只是一个简单纯粹的Linux镜像。这些镜像就像软件安装包,你能够处处使用,随时随地的使用任何一个镜像,将镜像变成容器。镜像和容器的关系就像:安装包和安装好的软件的关系。若是你以为你的某个IDE由于某些莫名的缘由很差用了,你会选择卸载重装,Docker也是你这个思路。
构建镜像正常来讲有2种方式:经过DockerFile(很像MakeFile)或者就像使用虚拟机那样,启动一个镜像,而后安装你想要的任何东西,再提交。这里主要介绍方法二,对方法一感兴趣的话能够阅读文章开头推荐的书。
note: 镜像地址为虚拟地址,实际按照仓库提供方给的地址为准
usr/bin/docker daemon -H fd:// --insecure-registry 192.168.1.2:5000
# 正常的容器内部,注意@后面就是容器ID [root@8735f1f1ad16 /]$ # 没有看到终端的状况下执行 docker run -i -t 192.168.1.2:5000/centos:6 /bin/bash
新增的/bin/bash指的是,容器启动后,要执行的指令。没必要担忧,你不会被要求从新下载一次,本地已经缓存了这个镜像。
这是一个各方面看起都没有什么问题的Linux环境,就不具体介绍如何在这里安装环境了,这里我简单的安装一个php环境来做为例子。
yum install php #...省略 [root@8735f1f1ad16 /]$ php -v #PHP 5.3.3 (cli) (built: Feb 9 2016 10:36:17) #Copyright (c) 1997-2010 The PHP Group #Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies # 若是你须要更新版本的php,你须要本身下载安装,而不是使用yum
搞定!
# 退出bash [root@8735f1f1ad16 /]$ exit exit [root@kevin kevin]$
恭喜你又回到了外面的世界。。。
提交以前,你须要关掉这个容器,若是你的容器的启动指令是一个服务,那么必须是服务被关闭后,容器才会关闭。不过咱们这个容器的启动指令是bash,因此当执行exit时,指令就完成了,容器天然也就结束了。经过下面的指令,你能够看到你启动过的容器。
[root@kevin kevin]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8735f1f1ad16 192.168.62.187:5000/centos:6 "/bin/bash" 8 minutes ago Exited (0) About a minute ago cocky_mccarthy 55b1257721a7 hello-world "/hello" About an hour ago Exited (0) About an hour ago evil_euclid
你会发现容器最后一列names被起了个奇怪的名字,没办法,由于你启动的时候,没有指定好,就被随便取了(tip:--name用于命名)。第一列是一个ID,它惟一指定了你的容器。注意:当镜像启动为一个容器后,它会被保存起来,当你再次docker run ***的时候,会再生成一个新容器,而不是使用刚才这个,若是你还想使用原先的容器,你得用docker start
[root@kevin kevin]$ docker start 8735f1f1ad16 8735f1f1ad16 [root@kevin kevin]$
没成功吗?
[root@kevin kevin]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8735f1f1ad16 192.168.62.187:5000/centos:6 "/bin/bash" 13 minutes ago Up 41 seconds cocky_mccarthy
应该是成功了,但是命令提示符没有变化,这是由于咱们少了2个参数:-i -t ,-i 参数保证容器的STDIN是开启的,-t 是告诉Docker为容器建立一个伪tty终端。不幸的是docker start 并不支持-i -t 参数,那么你须要使用另个指令来回到容器中
# 从新附着到容器 # 注意在attach 指令后,我敲了个回车,才真正进到了命令提示符下 [root@kevin kevin]$ docker attach 8735f1f1ad16 [root@8735f1f1ad16 /]$ # 在启动的时候,就附着上去 注意-a参数 [root@kevin kevin]$ docker start -a 8735f1f1ad16
提交以前,注意,刚才咱们的容器的名字是摇骰子获得的,容器的ID是一个记不住的16进制数,因此咱们得给容器一个好名字,再提交为镜像。
[root@kevin kevin]$ docker commit 8735f1f1ad16 kevin/hello-php sha256:4981e55b52a9b5f2a4b8884f7f439b5bb4416287e47ba2f542a26f80ad0f7daf [root@kevin kevin]$ #使用docker images看下咱们提交的镜像 #centos 和 hello-php看起来都在 [root@kevin kevin]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE kevin/hello-php latest 4981e55b52a9 36 seconds ago 352.4 MB 192.168.1.2:5000/centos 6 fc73b108c5ae 4 weeks ago 228.9 MB
不过你只是在你本地建立了一个hello-php镜像,并没被提交给服务器
# 用tag指令给hello-php 加上私有仓库地址,而后push [root@kevin kevin]$ docker tag 4981e55b52a9 192.168.62.187:5000/kevin/hello-php [root@kevin kevin]$ docker push 192.168.62.187:5000/kevin/hello-php # 若是你再查看镜像,会看到: [root@kevin ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.62.187:5000/kevin/hello-php latest 4981e55b52a9 6 minutes ago 352.4 MB kevin/hello-php latest 4981e55b52a9 6 minutes ago 352.4 MB 192.168.62.187:5000/centos 6 fc73b108c5ae 4 weeks ago 228.9 MB
漫长的上传后,个人镜像就能够被其余人使用了,虽然这个镜像基本一无可取。。。若是你但愿它作点什么,最好是指定一个指令,好比启动一个服务器,或者一系列的服务器,你能够将你要作的事写成一个shell脚本,而后在启动后执行:好比我建立了一个容器用来看php版本(挺废的,就是举个例子。。。)
[root@kevin kevin]$ docker run --name php-1 192.168.62.187:5000/kevin/hello-php /usr/bin/php -v PHP 5.3.3 (cli) (built: Feb 9 2016 10:36:17) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies # so 每次你想看php版本的时候,你能够: [root@kevin kevin]$ docker start -a php-1