menu Chancel's Blog
rss_feed lightbulb_outline

Docker快速入门

warning 这篇文章距离上次更新于911天前,文中部分信息可能已失效,请自行甄别无效内容。

Docker Wiki

Docker是一个开放源代码软件项目,让应用程序部署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制[1]。

Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免引导一个虚拟机造成的额外负担[2]。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括行程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施。

简言之,可以把Docker视为一个封装好指定运行环境的各种虚拟机

优缺点

  • 优点
    1. 部署方便
      • 省去环境搭建
    2. 部署安全
      • 高度统一的环境
    3. 隔离性好
      • 多个软件版本互不干扰
    4. 快速回滚
      • 类似虚拟机的镜像回滚
    5. 部署成本低
      • 相比虚拟机占用许多资源/宿主机部署环境等购置成本,docker拥有天然的优势(复制->运行)
    6. 管理成本低
      • 学习成本越来越低
    7. 多平台适应
      • Windows、Mac、Linux均支持Docker方案
  • 缺点
    1. 隔离性不够稳定
      • 与虚拟机相比,docker并非完全虚拟
    2. 性能
      • 性能有所损耗是必然的
    3. 存储方案
      • docker的数据持久化会造成部分资源的浪费
    4. 前期可能存在数据丢失
      • 数据持久化的设置比较复杂

了解Docker

  • Docker的核心点
    1. 标准化
    2. 集装箱
    3. 隔离
    4. 核心镜像
    5. 仓库
    6. 容器

镜像、仓库、容器

  • 镜像
    • 相当于集装箱,封装了应用以及应用环境,做到拉取镜像运行镜像应用即可启动
  • 仓库
    • 相当于码头,码头上有很多集装箱提供给宿主机随时拉取 ,可以构建属于自己的私有码头
  • 容器
    • 相当于工厂,使用集装箱里的东西进行加工输出

Docker仓库地址

  • 国外
  • 国内

  • 例子 - 拉取ubuntu:16.04的image

      docker pull registry.docker-cn.com/myname/myrepo:mytag

应用场景

  1. 持续交付的服务
  2. 数据不太重要的服务

常见指令

  • 从仓库拉取镜像:docker pull [your_image_name]
  • 查看本机镜像:docker images
  • 运行镜像:docker run [your_image_name]
  • 后台运行镜像:docker run -d [your_image_name]
  • 查看本机正在运行的容器:docker ps
  • 进入容器:docker exec -it [id] bash
  • 停止容器:docker stop id
  • 重启容器:docker restart id
  • 删除镜像:docker rmi id
  • 帮助指令:docker run --help

Docker文档

推荐参考GitBook -- Docker从入门到实践 系列文档,放在文末的资料引用中。

Docker镜像创建

  • DockerFile - Docker镜像的配置文件,可下面的配置文件说明

    # docker官方镜像仓库
      # 指定docker官方仓库的最新版nodejs镜像作为基础镜像
      From node:latest     
       # 第三方镜像仓库,比如阿里云的 “https://dev.aliyun.com/search.html ”
      # 指定标签为7.5的"registry.cn-hangzhou.aliyuncs.com/sessionboy/node"镜像作为基础镜像
      From registry.cn-hangzhou.aliyuncs.com/sessionboy/node:7.5   
      # MAINTAINER - 作者信息
      MAINTAINER sessionboy <postmaster@boyagirl.com>
      # 镜像操作
      ···
      # 复制文件/目录到某个目录下
      COPY [source_path] [target_path]
      # 拷贝文件/目录到某个目录下(如果是压缩包,会自动解压)
      ADD [source_dir] [target_dir]
      # 接收参数并创建镜像
      RUN [args]
      # 指定运行容器的UID
      USER 123456
      # 持久化数据
      VOLUME ["/data","/home"]
      # 环境变量(例如设置NODE_ENV为production
      ENV NODE_ENV production
      # 指定对外暴露端口
      EXPOSE 8000
      ···
      # 容器启动时执行的指令
      ···
      # 制定启动容器时执行命令的三种方式
      CMD ["executable","param1","param2"] 使用 exec 执行推荐方式
      CMD command param1 param2  /bin/sh 中执行提供给需要交互的应用    
      CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数
      # 容器启动后执行的命令的两种方式
      ENTRYPOINT ["executable", "param1", "param2"]
      ENTRYPOINT command param1 param2shell中执行)。
      #
      ···
    

例子 - 在Cent7OS下制作开源笔记leanote的docker镜像

安装Docker-Compose

  • 安装Python-pip

      # 检查是否安装了Python-pip
      pip -V
      # 安装Python-pip并升级
      yum -y install epel-release
      yum -y install python-pip
  • 更改Python-pip源至国内源

      mkdir ~/.pip/
      vim ~/.pip/pip.conf 
      # 输入以下内容并保存
      [global]
      index-url = https://pypi.tuna.tsinghua.edu.cn/simple
      # 升级pip
      pip install --upgrade pip
  • 安装Docker-Compose

      # 安装Docker-Compose
      pip install docker-compose --ignore-installed requests 
      # 检查Docker-Compose版本
      docker-compose -version
  • 安装并启动docker

      yum -y install docker
      systemctl start docker

制作DockerFile

  • 创建DockerFile文件/home/chancel/leanote-docker/Dockerfile

      FROM alpine:edge
      ARG LEANOTE_VERSION=2.3
      RUN apk add --no-cache --update wget ca-certificates \
          && wget https://jaist.dl.sourceforge.net/project/leanote-bin/${LEANOTE_VERSION}/leanote-linux-amd64-v${LEANOTE_VERSION}.bin.tar.gz \
          && tar -zxf leanote-linux-amd64-v${LEANOTE_VERSION}.bin.tar.gz -C / \
          && rm -rf /leanote/mongodb_backup \
          && rm leanote-linux-amd64-v${LEANOTE_VERSION}.bin.tar.gz \
          && apk del --purge wget
      VOLUME /leanote/public/upload
      EXPOSE 9000
      CMD ["/leanote/bin/run.sh"]
  • 创建initdb.sh文件/home/chancel/leanote-docker/initdb.sh

      #! bin/sh
      apk add --no-cache wget
      wget https://jaist.dl.sourceforge.net/project/leanote-bin/2.3/leanote-linux-amd64-v2.3.bin.tar.gz
      tar zxf leanote-linux-amd64-v2.3.bin.tar.gz
      mv leanote/mongodb_backup /
      mongorestore -h mongo -d leanote --dir /mongodb_backup/leanote_install_data/
  • 创建docker-compose.yml文件/home/chancel/leanote-docker/docker-compose.yml

      version: '2'
      services:
          leanote:
          image: chancel/leanote
          ports:
              - "9000:9000"
          volumes:
              - ./app.conf:/leanote/conf/app.conf
              - ./upload:/leanote/public/upload
              - /etc/localtime:/etc/localtime:ro
          links:
              - mongo
    
          mongo:
              image: mvertes/alpine-mongo
          volumes:
              - ./data:/data/db
    
          initdb:
              image: mvertes/alpine-mongo
          links:
              - mongo
          volumes:
              - ./initdb.sh:/initdb.sh
              - ./data:/data/db
          command: sh /initdb.sh
  • 执行创建命令

      docker build -t chancel/leanote .
      docker-compose run initdb
      docker-compose up leanote mongo

遇到一些问题

Docker启动失败?

使用systemctl status docker查看情况,发现是selinux没有关闭,遂关闭selinux并重启系统

vim /etc/selinux/config
# 修改SELINUX的值为disabled
SELINUX=disabled 
# 重启
reboot

参考资料

1.GitBook -- Docker从入门到实践

2.Docker化你的应用

3.应该把什么样的服务放到Docker上?

4. 简年14:蚂蚁笔记(Leanote)快速部署指南

阅读: 217
分类: 操作系统
创建时间: 2019-03-26 09:19:33
更新时间: 2019-03-26 09:36:36
博文目录

[[replyMessage== null?"发表评论":"@" + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageList.data.items.length]])

[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[messageItem.m_environ.browser]] [[messageItem.m_environ.os]] [[messageItem.m_environ.device]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[subMessage.m_environ.browser]] [[subMessage.m_environ.os]] [[subMessage.m_environ.device]]