Docker实践篇:来一场说走就走的Docker之旅
  

规划经理 7763

{{ttag.title}}
本帖最后由 规划经理 于 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改造自身业务
为避免纯理论偏枯燥,会交替穿插一些实践或应用篇
你怎么看呢? 如果有好的建议也欢迎跟帖哦~

打赏鼓励作者,期待更多好文!

打赏
暂无人打赏

北回归线 发表于 2016-3-31 13:20
  
又深入了一些,不过还得去搞Ubuntu来玩,看完以后有些这样的问题不解,求解答:
1、创建一个容器用来做数据卷,容器不运行怎么实例化?
2、Docker容器的端口开放到主机上,这个主机是指哪个?
andy_AAAAA 发表于 2016-3-31 15:30
  
安装虚机开启疯玩模式
adds 发表于 2016-3-31 21:05
  
对Linux服务器不太熟悉的小伙伴估计会看的有点儿晕,但文章写的确实很好,有理有据,看来要学好Docker要恶补Linux了。
woshishui 发表于 2016-4-1 14:44
  
CentOS 升级内核:我的不是3.+的要升级
uname -r
2.6.32-504.23.4.el6.x86_64
在yum的ELRepo源中,有 m ain l ine(3.13.1)、 l ong- t erm(3.10.28)这2个内核版本,考虑到long-term更稳定,会长期更新,所以选择这个版本。

1、导入public key

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
2、安装ELRepo到CentOS-6.5中

rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
3、安装 kernel-lt(lt=long-term)

yum --enablerepo=elrepo-kernel install kernel-lt -y
或者安装kernel-ml(ml=mainline)

yum --enablerepo=elrepo-kernel install kernel-ml -y
4、编辑grub.conf文件,修改Grub引导顺序

vim /etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd0,0)
#          kernel /boot/vmlinuz-version ro root=/dev/sda1
#          initrd /boot/initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (3.10.28-1.el6.elrepo.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-3.10.28-1.el6.elrepo.x86_64 ro root=UUID=0a05411f-16f2-4d69-beb0-2db4cefd3613 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=en_US.UTF-8
rd_NO_LVM rd_NO_DM rhgb quiet
        initrd /boot/initramfs-3.10.28-1.el6.elrepo.x86_64.img
title CentOS (2.6.32-431.3.1.el6.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-431.3.1.el6.x86_64 ro root=UUID=0a05411f-16f2-4d69-beb0-2db4cefd3613 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=en_US.UTF-8 r
d_NO_LVM rd_NO_DM rhgb quiet
        initrd /boot/initramfs-2.6.32-431.3.1.el6.x86_64.img
title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=0a05411f-16f2-4d69-beb0-2db4cefd3613 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO
_LVM rd_NO_DM rhgb quiet
        initrd /boot/initramfs-2.6.32-431.el6.x86_64.img
确认刚安装好的内核在哪个位置,然后设置default值(从0开始),一般新安装的内核在第一个位置,所以设置default=0。

5、重启,查看内核版本号

[root@comk ~]# uname -r
3.10.28-1.el6.elrepo.x86_64
woshishui 发表于 2016-4-1 16:53
  
感谢分享,虽然不能全部试验一遍,但是还是收获颇丰,期待楼主下一次分享
一三五七九 发表于 2016-4-4 22:01
  
Mark,期待后续连载
修业时代朱 发表于 2016-4-11 08:30
  
恶补了一段时间的Linux,期待楼主的后续连载!
规划经理 发表于 2016-4-15 19:46
  
新增分享,欢迎围观

Docker基础篇:图解微服务,程序员友谊不翻船
Docker应用篇:Docker应用案例之搭建wordpress
新手664893 发表于 2019-5-4 22:57
  
期待。。。。。。。
发表新帖
热门标签
全部标签>
西北区每日一问
技术盲盒
安全效果
【 社区to talk】
技术笔记
干货满满
每日一问
信服课堂视频
新版本体验
GIF动图学习
技术咨询
功能体验
2023技术争霸赛专题
产品连连看
安装部署配置
通用技术
秒懂零信任
技术晨报
自助服务平台操作指引
原创分享
标准化排查
排障笔记本
玩转零信任
排障那些事
SDP百科
深信服技术支持平台
POC测试案例
畅聊IT
答题自测
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
每日一记
运维工具
云计算知识
用户认证
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
产品预警公告
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
社区帮助指南
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
每周精选
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
高手请过招
升级&主动服务
高频问题集锦
社区新周刊
全能先锋系列
云化安全能力

本版达人

新手89785...

本周建议达人

YangZhe...

本周分享达人