Docker 初探
开篇先说句 很神奇的docker
刚刚接触这个东西,大致的理解就是在你的机器上安装一个可以迁移的虚拟机,然后把你机器上的应用(例如apache,php,mysql==)放到上面跑,当你想要加机器或者做服务器迁移,只需打包成镜像然后部署到新机子上就好了(现在的理解,有不对的地方欢迎指正)
接下来开始正文研究
1、首先过了一遍runoob,只针对自己的主机和需要,看了docker安装,简单的看了下镜像和容器什么的,有专门的docker-hub源,里面有很多现成的镜像可以选择,当然你也可以后期自己做镜像然后上传到docker-hub或者其它源(看网上说docker-hub被强了,但是本人使用的是港机不会有这点问题,如果看本篇文章的同学用的是国内机子,可以上网搜索一下更换docker源,中国也有的)
2、接下来准备做一个apache的容器,首先简单介绍下docker下的镜像和容器
镜像:简单的理解类似于.iso文件,被打包好的镜像
容器:被运行的镜像,应该是没有安装一说,实际需要用到的只有容器
不是太理解的同学可以继续往下看
3、安装docker,首先要注意使用docker的系统内核版本必须在3.10以上,本人特意装了centos7来配合这一点,之前的6.8 32位是不支持的
$ uname -r //查看系统内核版本
3.10.0-514.21.1.el7.x86_64
$ yum -y install docker //安装docker
$ service docker start //开启docker
4、接下来选择和安装镜像,以centos来举例
$ docker search centos //搜索镜像
runoob@runoob:~/apache$ docker search httpd
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/centos The official build of CentOS. 3617 [OK]
docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 100 [OK]
docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.9 x86_64 / CentOS-7 7.3.1611 x8... 81 [OK]
docker.io docker.io/tutum/centos Simple CentOS docker image with SSH access 33
docker.io docker.io/imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 30 [OK]
docker.io docker.io/gluster/gluster-centos Official GlusterFS Image [ CentOS-7 + Glu... 20 [OK]
docker.io docker.io/kinogmt/centos-ssh CentOS with SSH 16 [OK]
docker.io docker.io/centos/php-56-centos7 PHP 5.6 platform for building and running ... 9
docker.io docker.io/openshift/base-centos7 A Centos7 derived base image for Source-To... 7
docker.io docker.io/centos/python-35-centos7 Python 3.5 platform for building and runni... 6
docker.io docker.io/openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 ima... 6
docker.io docker.io/darksheer/centos Base Centos Image -- Updated hourly 3 [OK]
docker.io docker.io/openshift/jenkins-2-centos7 A Centos7 based Jenkins v2.x image for use... 3
docker.io docker.io/openshift/ruby-20-centos7 DEPRECATED: A Centos7 based Ruby v2.0 imag... 3
docker.io docker.io/blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK]
docker.io docker.io/indigo/centos-maven Vanilla CentOS 7 with Oracle Java Developm... 1 [OK]
docker.io docker.io/openshift/php-55-centos7 DEPRECATED: A Centos7 based PHP v5.5 image... 1
docker.io docker.io/pivotaldata/centos-gpdb-dev CentOS image for GPDB development. Tag nam... 1
docker.io docker.io/pivotaldata/centos-mingw Using the mingw toolchain to cross-compile... 1
docker.io docker.io/jameseckersall/sonarr-centos Sonarr on CentOS 7 0 [OK]
docker.io docker.io/miko2u/centos6 CentOS6 妤娆瑾绨澧 0 [OK]
docker.io docker.io/openshift/wildfly-101-centos7 A Centos7 based WildFly v10.1 image for us... 0
docker.io docker.io/pivotaldata/centos Base centos, freshened up a little with a ... 0
docker.io docker.io/pivotaldata/centos-gcc-toolchain CentOS with a toolchain, but unaffiliated ... 0
docker.io docker.io/smartentry/centos centos with smartentry 0 [OK]
$ docker pull centos:latest //此处对应上边第一项,下载镜像
$docker run -i -t -d centos //此处将镜像运行成容器,跑出来的就是容器
简单介绍一下docker run
, runoob上的介绍是“创建一个新的容器并运行一个命令”大致就是运行你下载的镜像,以下是常用参数
- -i: 以交互模式运行容器,通常与 -t 同时使用;
- -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- -d: 后台运行容器,并返回容器ID;
- -p: 将容器的端口映射到主机的端口,一般都是 -p 80:80
还有一个参数 -v 将容器目录挂载到宿主机上,这个命令本人用起来一直没有看到效果,顶多是在宿主机上创建了挂载目录,并没有正向映射和反向映射,有会的同学欢迎指导以下,在下感激不尽。
5、运行容器后才是关键部分,不是自己创建的镜像基本不会达到run以下就可以达到自己想要的配置,为了能够自己完成配置,保存和迁移,请往下看
run后可以检查以下当前运行的容器,当然也可以看到下载的镜像
$ docker images //查看当前下载过的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 328edcd84f1b 5 weeks ago 192.5 MB
$docker ps //查看当前run的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7559aaf95f72 docker.io/centos "/bin/bash" About an hour ago Up About an hour 0.0.0.0:80->80/tcp gloomy_khorana
以上的IMAGE ID
和CONTAINER ID
请以实际为准,每个人的不一样,简单介绍一些其它操作,刚开始入门的同学可能会进行多次尝试
$ docker stop CONTAINER ID //停止正在run的容器
$ docker rm CONTAINER ID //删除容器,如果想要删除一个容器,建议先执行stop(保证这个容器不会展示在 docker ps 的列表中)
$ docker rmi REPOSITORY //删除一个镜像,后边会用到
本人在尝试过程中出现过一种情况是 REPOSITORY
为<none>,这个时候如果想要删除这个出了bug的镜像,可以使用 docker rmi -f CONTAINER ID
就可以了
接下来就是操作,首先是进入容器进行操作,刚刚安装的是centos镜像,所以可以进去操作一番
$ docker exec -it CONTAINER ID /bin/bash //进入容器,这个时候你就会发现命令行前面的名字变了
。。。接下来进行一番操作,例如 安装 git 安装apache====
接下来执行 exit
或者Ctrl+d可以退出容器
修改后的容器需要提交成新的镜像保存下来,不然下次启动centos镜像又会变成原样
$ docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
这段是网抄的,大致使用了以下就是 docker commit CONTAINER ID name/imagename
接下来使用docker images
就可以看到这条记录了
6、上传到源:
首先创建docker-hub账号 https://hub.docker.com
接下来登录
$ docker login //输入用户名密码登录
$ docker tag IMAGE ID username/tagname //给image打上标签
$ docker push username/tagname //上传到docker-hub
接下来登录到docker-hub上就可以查看刚才的push了
刚开始练习的时候想要尝试httpd镜像,但是尝试过程中遇到了几个问题
1、www目录是在容器中的,在宿主机中需要转到容器中才可以,解决办法或者在容器中安装git或者svn,或者使用挂载
2、同理,httpd.conf以及要创建的虚拟主机的conf都需要到容器中配置,用起来还是麻烦一些的,如果apache和php等应用分开安装就需要到不同的容器中配置,配置时长大大增加
鉴于以上问题,本人选择了centos进行尝试这样全部操作都在一个容器中进行,相对来说比较简单一些。
如果有同学有什么问题或更好的解决方案欢迎联系我一起讨论学习 lx@loodp.com