menu Chancel's Blog
rss_feed lightbulb_outline

Docker快速入门

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

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 [yourimagename]
  • 查看本机镜像:docker images
  • 运行镜像:docker run [yourimagename]
  • 后台运行镜像:docker run -d [yourimagename]
  • 查看本机正在运行的容器: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)快速部署指南

阅读 - 81
分类 - 操作系统
创建于 2019-03-26 09:19:33
阅读 - 81
分类 - 操作系统
创建于 2019-03-26 09:19:33
博文目录

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

account_circle
email
web_asset
textsms

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

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