tech share - docker 入门

date: 2017-12-19 14:04:30
title: tech share - docker 入门

slide: https://c.daydaygo.top/landslide/TS20171222.html

团队内很多同学对 docker 感兴趣, 于是准备了这期分享, 希望可以帮助大家快速入门. 主要包含以下内容:

  • why docker
  • docker 基础概念
  • 入门实战

why docker

先讲讲我自己的经历. 作为一个典型的工具控, 这个可以通过 我的 wiki 看出一二, 比如 tmux / fish 等工具. 对环境的折腾几乎是无底洞般消耗着, 而且在以前经常 以重装系统告终. 一方面是自己重装系统实在确实 6, 大学里还找过 「计导」 的老师尝试自己讲一堂相关的课, 一方面是 太年轻, 基础不够好, 解决问题的方式方法也不在路上, 经常导致问题 解决不了. 分享 2 句话:

在手里只有一把锤子的人眼里,世界就是一个钉子. -- <穷查理宝典>

工匠应该专注于作品的创意,不应该浪费精力,没限制地在折腾自己的工具.

简单记录一下自己开发环境的变迁史:

  • v4 2017年

上面的方式其实推荐一个机器只部署一个项目,每个项目还是分开的,但是我只有一台云主机,却有很多项目,所以重新架构了一次:

独立一个通用的 docker 环境,目前包括 nginx(lnmp)+ cli(php-cli、npm、git 等)
每个项目依旧在不同的 git 仓库中维护
一台腾讯云上面部署所有项目

  • v3 2016年

尝试到了 docker-compose 的甜头,开始信奉 dockerfile + 项目源码 的方式

  • v2 2015年

项目全部进 git
开发环境:vagrant 大量使用(当时 laravel 的 homestead),开始接触 docker
部署环境:申请到一年的腾讯云,裸搭、lnmp 一键环境

  • v1 2014年

项目只包含源码,有的使用 git,有的没使用
本地开发正式接触 virtualbox 和 vagrant,大部分还是 window 下直接搭建或者集成环境
当时的只有 blog 项目,尝试了 各种 gitpage;开始接触腾讯云

期间还有比如选 win / Ubuntu / mac 这样的纠结, 也花了大量时间尝试, 这是我最后的答案:

  • win: 在我看来, win 的 GUI 既是更熟悉的, 也是更易用的(没有挑起圣战的意思, 同时为我的 小米笔记本Pro 打 call)
  • docker: run, run, run
  • 重度命令行使用者

PS: 我本人是 win 环境, 下面的讲解都以此为基础.

再分享 2 句话:

关于 docker: 不要因为环境, 限制了我们的想象力

关于命令行: graphical user interfaces make easy tasks easy, while command line interfaces make difficult tasks possible

docker 基础概念

在讲解 docker 之前, 先对比一下 docker 和传统虚拟机:

  • 虚拟机
虚拟机
  • docker
docker

[图片上传失败...(image-8d2487-1513865934084)]

docker 使用的关键技术(我们是入门教程, 瞄一眼就好了):

  • go 语言实现
  • 操作系统层面的虚拟化技术
  • 基于 Linux 内核的 cgroup,namespace
  • AUFS

Docker 包括三个基本概念

  • 仓库(Repository)
  • 镜像(Image)
  • 容器(Container)

从生命周期的角度来理解和学习新的概念和知识.

docker daemon

镜像和仓库, 我们可以类比 git 仓库来理解, 只是 git 仓库放的代码, 而 docker 仓库, 放置的是镜像. 其他仓库相关的操作, 都是一样一样滴.

镜像和容器, 可以类比 类 和 对象 / 程序 和 进程. 运行容器, 就像实例化一个对象, 类起到定义的作用, 真正干活的是对象.

是不是感觉到触类旁通?

入门实战

入门了解 仓库/镜像/容器 这些概念就可以开始实战了. 在实践的过程中, 要 刻意 去理解这些概念以及 生命周期.

工具链

docker: docker 环境安装好后, 这是我们第一个接触到的工具. 更确切的说法是 docker client. 用来和 docker daemon 进行通信(流程见上面的图). 了解几个常用的就好:

# 镜像相关
docker pull image:tag
docker images
docker rmi

# 容器相关
docker run xxx
docker ps
docker rm

# other
docker info
docker help

docker build # 马上 Dockerfile 就要讲到

到了这大家有没有疑问:

  • 镜像哪来的?
  • 刚才用 来类比镜像, 类是可以用代码定义的, 那镜像可以么?

先回答第一个问题, 我们可以通过容器来构建镜像, 命令是 docker commit, 和 git 仓库确实很相似. 但是在上面的列表里, 我并没有列举这个, 因为 非主流 -- 我们也可以用代码来定义镜像, 这就是 Dockerfile.

直接看个例子就好:

FROM mysql:8
MAINTAINER daydaygo <1252409767@qq.com>

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

ADD my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod -R 644 /etc/mysql/conf.d/*

CMD ["mysqld"]

EXPOSE 3306

Dockerfile 就是这样一条一条 指令 组成, 我们从 基础镜像 开始, 一步一步构建出我们需要的环境的. 每一条指令, 对应我们在容器中执行相关操作, 然后把这个容器 commit 成新的镜像.

到这一步, 怎么构建环境和运行环境折腾清楚了, 然后继续实践, 比如 phper 的经典的环境: linux + nginx + php + mysql. 传统的做法, 我们把这个都安装到一个镜像里面就好了.

此处可以有停顿.

既然镜像都能一步一步的慢慢构建起来, 为什么我们不通过一个一个服务来组合成我们需要的环境呢? 于是到了 docker-compose 登场.

直接看例子就能明白:

fpm:
    build:
        context: ./server
        dockerfile: fpm.Dockerfile
    volumes:
        - ../:/var/www
        - ./logs/nginx/:/var/log/nginx
        - ./logs/fpm/:/var/log/php7
    # 注意这里, 通过 links 表示 fpm 这个服务需要 redis 和 fpm 服务
    links:
        - mysql
        - redis
        # - rabbitmq
    dns:
        - 223.5.5.5
        - 223.6.6.6
    extra_hosts:
        - "fpm:127.0.0.1"
    ports:
       - "80:80"
       - "443:443"
mysql:
    build:
        context: ./server
        dockerfile: mysql.Dockerfile
    volumes:
        - ./data/mysql:/var/lib/mysql
    ports:
        - "3306:3306"
    environment:
        # MYSQL_DATABASE: test
        # MYSQL_USER: test
        # MYSQL_PASSWORD: test
        MYSQL_ROOT_PASSWORD: root
redis:
    build:
        context: ./server
        dockerfile: redis.Dockerfile
    volumes:
        - ./data/redis:/data
        - ./logs/redis:/var/log/redis
    ports:
        - "6379:6379"

这个是 docker-compose 的配置文件, yaml 格式, yaml 的语法就不多讲了, 简单程度和 json 一个级别. 配置内容也很简单, 看 key 基本就能看懂.

然后, 跑起来吧:

docker-compose up -d fpm # 启动 fpm, 应为 fpm 需要 redis 和 mysql, 所以也会跟着启动
docker-compose stop fpm
docker-compose logs fpm
docker-compose exec fpm bash # 执行容器中的命令

环境安装 & 配置

win 下的安装现在非常简单, 按照 阿里云容器 - 镜像加速器 中的文档操作就好了.

  • 推荐 win10 + docker for window, 当然 docker toolbox 也能玩, 希望现在没有我以前踩过的坑了
  • 配置阿里云镜像加速
  • 配置文件挂载
  • 配置 docker 硬件资源, 推荐 2核4G

ok, 安装及环境就好了

docker 的 lnmp 之旅

其实这部分内容, 上面在讲工具链的时候, 基本都提到了, 这里就演示一下最终效果就好.

写在最后

程序员认为自己需要交付的是代码,只要代码逻辑正确就好了,但实际上项目需要交付的是 代码 + 代码运行所需的环境

纯工具的角度来使用 docker, 其实相当轻松. 这次分享之后, 希望对 docker 有兴趣的同学可以:

  • 一定要实践
  • 实践中巩固这些概念
  • 站在巨人的肩膀上 -- 读官方镜像的 Dockerfile, 看其他人的源码

资源推荐:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容