本帖最后由 规划经理 于 2016-5-16 18:22 编辑
Docker实践篇:来一场说走就走的Docker之旅
上一篇我们已经对“docker是神马”做了一些基本的介绍,Docker的神奇大家都get到了吗?是否有股跃跃欲的冲动了呢? 为避免大家觉得Docker仍是飘在空中看不见模不着的大神,这一篇就让我们脚踏实地,看看到底要肿么用起来吧!
1...2...3,GO!!!
基本概念开始之前,我们先来了解一下上一篇已经提到过的几个Docker基本概念: 镜像:我们可以理解为一个预配置的系统光盘,这个光盘插入电脑后就可以启动一个操作系统。当然由于是光盘,所以你无法修改它或者保存数据,每次重启都是一个原样全新的系统。Docker里面镜像基本上和这个差不多。 容器:同样一个镜像,我们可以同时启动运行多个,运行期间的产生的这个实例就是容器。把容器内的操作和启动它的镜像进行合并,就可以产生一个新的镜像。 仓库:仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。目前,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。
运行环境Docker目前已经支持非常多的Linux平台,Ubuntu、Red Hat企业版Linux、Debian、CentOs、Fedora、Oracle Linux等。如果使用虚拟环境,甚至可以在OS X 和 windows中运行。linux内核版本建议在3.8及以上 本文以ubuntu14.04为例简单做下说明。另外,实验环境需确保可访问公网。
安装方法
Docker仓库Docker使用基本的镜像可以定制创建出来不同种应用的Docker镜像。Docker Hub是Docker官方提供的镜像中心。在这里可以很方便地找到各类应用、环境的镜像。 docker pull ubuntu #从公有仓库上拉取镜像 通过上述命令,我们很容易就能从Docker Hub镜像注册中心下载一个最新版本的ubuntu镜像到本地。
运行一个容器以ubuntu为例,我们启动一个新容器,并将ubuntu的Shell作为入口: root@ubuntu-132:/home/wlb# docker run -it ubuntu:latest sh -c '/bin/bash' root@95374bb36046:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
这时候我们成功创建了一个Ubuntu的容器,并将当前终端连接为这个Ubuntu的bash shell。这时候就可以愉快地使用Ubuntu的相关命令了~可以快速体验一下。 参数-i表示这是一个交互容器,会把当前标准输入重定向到容器的标准输入中,而不是终止程序运行。-t指为这个容器分配一个终端。 按Ctrl+D可以退出这个容器。 在容器运行期间,我们可以通过docker ps命令看到所有当前正在运行的容器。添加-a参数可以看到所有创建的容器: [root@localhost ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a9e9320df1b1 ubuntu:latest "/bin/bash" 36 minutes ago Up 36 minutes test
每个容器都有一个唯一的ID标识,通过ID可以对这个容器进行管理和操作。在创建容器时,我们可以通过--name参数指定一个容器名称。 注意:每次执行docker run命令都会创建新的容器,建议一次创建后,使用docker start/stop来启动和停用容器。
存储在Docker容器运行期间,对文件系统的所有修改都会以增量的方式反映在容器使用的联合文件系统中,并不是真正的对只读层数据信息修改。每次运行 容器对它的修改,都可以理解成对夹心饼干又添加了一层奶油。这层奶油仅供当前容器使用。当删除Docker容器,或通过该镜像重新启动时,之前的更改将会 丢失。这样做并不便于我们持久化和共享数据。 Docker的数据卷这个东西可以帮到我们。 在创建容器时,通过-v参数可以指定将容器内的某个目录作为数据卷加载: 格式:docker run -it -v [host_dir]:[container_dir] host_dir是主机的目录,container_dir是容器的目录。
docker run -it -v /home/docker:/home/www ubuntu:latest sh -c '/bin/bash' 在容器中会多一个/home/www挂载点,在这个挂载点存储数据会绕过联合文件系统。 容器和容器之间是可以共享数据卷的,我们可以单独创建一些容器,存放如数据库持久化存储、配置文件一类的东西,然而这些容器并不需要运行。
docker run --name dbdata ubuntu echo "Data container." 在需要使用这个数据容器的容器创建时--volumes-from [容器名的方式来使用这个数据共享容器。
网络Docker容器内的系统工作起来就像是一个虚拟机,容器内开放的端口并不会真正开放在主机上。可以使我们的容器更加安全,而且不会产生容器间端口的争用。想要将Docker容器的端口开放到主机上,可以使用类似端口映射的方式。 在Docker容器创建时,通过指定-p参数可以暴露容器的端口在主机上, 可以通过-p [主机端口]:[容器端口参数指定: docker run -it -p 22345:22 ubuntu sh -c '/bin/bash'
容器和容器之间想要网络通讯,可以直接使用--link参数将两个容器连接起来。例如WordPress容器对some-mysql的连接: docker run --name some-wordpress --link some-mysql:mysql -p 8080:80 -d wordpress
环境变量通过Docker打包的应用,对外就像是一个密闭的exe可执行文件。有时候我们希望Docker能够使用一些外部的参数来使用容器,这时候参数可以通过环境变量传递进去,通常情况下用来传递比如MySQL数据库连接这种的东西。 环境变量通过-e参数向容器传递: docker run --name some-wordpress -e WORDPRESS_DB_HOST=10.1.2.3:3306 \ -e WORDPRESS_DB_USER=... -e WORDPRESS_DB_PASSWORD=... -d wordpress
结束语到这里,大家是否找到了真实感呢?快去动手试一试吧~ 当然,以上都还只是基础,集群、弹性伸缩...都还木有涉及咧@_@
很大一部分小伙伴也许抓头发开吼:oh, NO!别让我敲代码,别让我敲代码,别让我敲代码!! 作为最理解大家的信服君笑而不语,大家觉得他会怎么帮大家呢?或者你需要什么样的帮助,大可跟帖吼出来哈~
这里说下我们Docker系列的分享思路,预计分三个系列 Docker基础篇:主要分享docker的一些理论知识,理解Docker以便更好的应用 Docker实践篇:以实战为主,带大家一起来做使用、测试 Docker应用篇:以分享应用场景、趋势为主,带大家使用docker改造自身业务 为避免纯理论偏枯燥,会交替穿插一些实践或应用篇 你怎么看呢? 如果有好的建议也欢迎跟帖哦~ |