Docker 初实践手札


1. Docker简介
Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本! 使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,以在有限的时间内做更多有意义的事。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 3 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

图1.1 虚拟机技术

图1.2 Docker技术
2. Docker 特点
 更高效的利用系统资源
 更快速的启动时间
 一致的运行环境持续交付和部署
 更轻松的迁移
 更轻松的维护和扩展

  1. Docker 安装
    这里以Centos7为例(Docker 最低支持 CentOS 7),Docker 需要安装在 64 位的平台,并且内核版本不低于 3.10。 CentOS 7 满足最低内核的要求。

3.1 使用脚本自动安装
Docker 官方为了简化安装流程,提供了一套安装脚本,CentOS 系统上可以使用这套脚本安装:

curl -sSL https://get.docker.com/ | sh

不过,由于伟大的墙的原因,在国内使用这个脚本可能会出现某些下载出现错误的情况。国内的一些云服务商提供了这个脚本的修改版本,使其使用国内的 Docker 软件源镜像安装,这样就避免了墙的干扰。
阿里云的安装脚本:
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh

3.2 yum源安装
使用”yum search docker” 或”yum list”命令查看yum源的docker安装文件。

使用” yum install docker”命令安装docker;
启动docker: service docer start
4. 使用docker
4.1 镜像使用
4.1.1 制作镜像
Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。
下面列出3种镜像制作方式。

一、 从Docker Hub拉取镜像

Docker Hub 上有大量的高质量的镜像可以用,我们拉取这些镜像并运行。从 Docker Registry 获取镜像的命令是 docker pull。其命令格式为:

docker pull [选项] [Docker Registry地址]<仓库名>:<标签>

如果没有给出 Docker Registry 地址,因此将会从 Docker Hub 获取镜像。

二、 使用Dockerfile定制镜像
暂未使用,先不介绍。可参考一下资料:
https://yeasy.gitbooks.io/docker_practice/content/image/build.html

三、 打包现有文件系统
通过打包现有系统的文件系统到gz包,然后再导入到docker服务中。也可以在虚拟机上最小化安装一个系统,安装自己的基本功能然后打包成基础镜像。

4.1.2 查看镜像
使用docker images 查看所有镜像:

不加任何参数的情况下,docker images 会列出所有顶级镜像,但是有时候我们只希望列出部分镜像。docker images 有好几个参数可以帮助做到这个事情,具体可以docker images –help 查看。
详细方法可参考:https://yeasy.gitbooks.io/docker_practice/content/image/list.html

4.1.3 commit迭代镜像

在使用基础镜像启动容器后,如果想更新基础镜像,把一些必要的新增内容(比如rpm安装)添加到镜像中,可以使用commit命令。

示例:

docker commit -a “lijianfang lijianfang@360.cn” -m “add /home/s/package” c487d421e60f cml_test_centos6.2:v2

4.1.4 删除镜像
如果要删除本地的镜像,可以使用 docker rmi 命令,其格式为:

docker rmi [选项] <镜像1> [<镜像2> …]

注意: docker rm 命令是删除容器,不要混淆。

4.2 容器使用
4.2.1 新建并启动容器
所需要的命令主要为 docker run。

启动一个 bash 终端,允许用户进行交互:

docker run -it 3623959fca82 /bin/bash

例如下面的例子:

docker run -itd –name cml_test_cleandroid -h dtest1.mobi.shbt.qihoo.net -p 8081:8080
-v /data/data_volume/cleandroid_cn/callapp_engine:/home/s/callapp_engine
-v /data/data_volume/cleandroid_cn/data:/home/s/data
–privileged=true 3623959fca82 /bin/bash

 -itd参数:以交互的方式在后台运行;
 –name参数: 启动容器的名称;
 -h参数:设置容器的主机名称;
 -p参数:物理机与容器的端口映射;
 -v参数:数据卷的挂载到容器中目录,这样容器停止,或被删除后,数据不会丢失;
 –privileged:权限设置;
 3623959fca82:镜像ID,实际应用时根据需要设置,以哪个镜像启动容器;
 /bin/bash: 启动容器后运行的命令,再比如”echo hello”, “ls -al”等等

4.2.2 启动或停止已存在的容器
使用docker ps –a命令查看所有容器:

可以利用 docker start|stop [容器名称],直接将一个已经存在的容器启动运行或停止运行。
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在容器终端中利用 ps 或 top 来查看进程信息。

可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。

4.2.3 进入容器
一、attach 命令
docker attach 是Docker自带的命令。

docker attach cml_test_standard

但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

二、exec命令

格式:docker exec -it [容器名称] [执行命令]

例:docker exec -it cml_test_standard /bin/bash

 -it参数:交互方式

三、ssh方式
这种方式首先创建容器时,需要做22端口的映射,启动容器内sshd服务。例如:

docker run -d –name cml_build_lijianfang -h dbuild1.mobi.shbt.qihoo.net \
-p 6001:22 \
-v /data/data_volume/user_home/lijianfang:/home/lijianfang \
–privileged=true e54a1d130b78 /usr/sbin/sshd -D

然后可以用命令ssh lijianfang@k3544v.add.shbt.qihoo.net –p 6001 进行登陆。注意:k3544v.add.shbt.qihoo.net是docker服务所在的机器。
也可以在xshell中设置登陆:

4.2.4 导入/导出容器快照
 Export命令导出容器

Import导入容器快照

例:cat cml_build_lijianfang | docker import – cml_dev_centos6.2:v3

4.2.5 删除容器
格式: docker rm 容器名|容器ID

4.3 私有仓库建设
有时候使用 Docker Hub 这样的公共仓库可能不方便,我们可以创建一个本地仓库供私人使用。docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。

4.3.1 私有仓库安装运行
在安装了 Docker 后,可以通过获取官方 registry 镜像来运行。最简单的通过docker run -d -p 5000:5000 registry来启动一个私有仓库。本地registry镜像不存在的话程序自动从Docker Hub拉取下来并启动。
默认情况下,仓库会被创建在容器的 /var/lib/registry(v1 中是/tmp/registry)下。可以通过 -v 参数来将镜像文件存放在本地的指定路径。
docker run -d -p 5000:5000 -v /data/docker_registry:/tmp/registry registry

4.3.2 上传/下载镜像
创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。
在这里,我们的私有仓库地址为 10.202.131.115:5000

一、上传镜像
a). 使用docker tag 将 cml_dev_centos6.2 这个镜像标记为 10.202.131.115:5000/cml_dev_centos6.2

(格式为 docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG])。

b). 使用 docker push 上传标记的镜像。

二、下载镜像
现在可以到另外一台机器去下载这个镜像。使用docker pull命令下载:

4.4 数据卷的使用
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

 数据卷可以在容器之间共享和重用
 对数据卷的修改会立马生效
 对数据卷的更新,不会影响镜像
 数据卷默认会一直存在,即使容器被删除

*注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
挂载一个主机目录作为数据卷。使用 -v 标记也可以指定挂载一个本地主机的目录到容器中去。例如:

docker run -itd –name cml_test_cleandroid -h dtest1.mobi.shbt.qihoo.net -p 8081:8080
-v /data/data_volume/cleandroid_cn/callapp_engine:/home/s/callapp_engine
-v /data/data_volume/cleandroid_cn/data:/home/s/data
–privileged=true 3623959fca82 /bin/bash

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值