Docker

记Docker折腾出来的一点心得

前言

很久没有正经写笔记这些东西了,今天终于入了docker的门,就简单写一下

最近一直在写程序,我个人现在入了不少语言的门,所以在写东西的时候,会根据自己的需求选择一下用哪门语言。

一般来说:

  • 如果是自己用就写Python,也懒得去拆分各种虚拟环境,反正都是自己用,环境一般不会出啥大问题。
  • 如果要分发给别人用,我之前首选Kotlin这门JVM语言,图他完全兼容Java,语法却比Java简单非常多,也完全不用考虑用户的环境问题,一切交给JVM。
  • 当然现在我会考虑golang,golang除了全平台兼容,极快的运行速度外,目前感觉最大的好处在于编译快。而且用了一小段时间,最开始觉着略微难用,最近莫名觉得用的舒服爽快(真香)。

但是最近一直在搞Python,尤其是matplotlib作图的东西,然后需要分发给别人用,之前我分发软件都是pyinstaller,但是感觉不是很舒服,会有各种稀奇古怪的问题。加上后边还有更复杂的需求,于是瞄上了鼎鼎大名的docker。

Docker

Docker类似于虚拟机(虽然它并不是,但是虚拟机更好理解),可以让用户通过配置文件,在虚拟的容器···内部配置各种环境变量,各种软件。然后打包成images发布,其他用户只需要有docker,就可以把这个image pull下来使用期内配置好的软件。

神奇的是docker能够运行各式各样的软件,还基本不拖慢性能。

Docker由镜像(images)、容器(container)和仓库构成。

  • 镜像:就是打包好的各种环境,类似于虚拟机中的各种环境,就是一个只读的模板,可以理解为原生的纯净系统。
  • 容器:用户运行的各项命令和各项操作,就是在容器中完成的。就可以理解为在镜像这个系统基础上安装添加的各种数据和文件环境。所以容器可以启动、停止、删除等等。
  • 仓库:个人用户完成开发,打包了一个镜像,然后需要发布,就可以推送到仓库上,其他人拉一下就可以使用了。

安装

我就不多说了

  • 中文。这个页面介绍的很详细了,基本将官方文档的各方面内容都涵盖了。

  • 官方

  • 注意:

    • 由于安全性考量,docker必须要用root权限安装。
    • 安装后在系统中新建一个docker group。并且将用户添加到该组后,组内成员就能正常使用docker了。
    • 而且docker只需要配置一遍,所有组内成员都能使用
# 添加docker用户组
sudo groupadd docker

# 将当前用户添加到docker组,其他用户就替换相应的username
sudo usermod -a -G docker $USER

# 退出重新登陆后,运行以下命令就能查看是否以进入docker组了
id -aGn username

常用

  1. 更换docker镜像源

    默认用的都是美国镜像,说多了都是泪
    永久更换镜像可以编辑/etc/docker/daemon.json,并且填入以下内容

    # 除了以下的docker中国,还可以选择中科大http://docker.mirrors.ustc.edu.cn/
    {
      "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    
  2. 更换docker储存路径

    默认docker的存储路径为/var/lib/docker
    系统盘可能会面临空间不够的情况,所以最好还是换一个目录。

    1. 软连接

      # stop docker
      sudo systemctl restart docker
      # or
      sudo service docker stop
      
      # move docker data to another directory
      mv /var/lib/docker /root/data/docker
      ln -s /root/data/docker /var/lib/docker
      
    2. 命令行参数,启动docker时添加--graph=/var/lib/docker

    3. 更改配置文件

      • Ubuntu:/etc/default/docker -> OPTIONS=--graph="/root/data/docker" -H fd:// #或者后边这行 DOCKER_OPTS="- /root/data/docker"
      • CentOS: /etc/sysconfig/docker -> OPTIONS=--graph="/root/data/docker" --selinux-enabled -H fd://
  3. 拉取镜像

    基本命令形式为docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

    以拉取Ubuntu 18.04的镜像为例docker pull ubuntu:18.04

  4. 基础运行

    # 该命令的最终效果为,进入ubuntu 18.04的bash环境,在它的bash环境内做操作
    docker run -it -v /mnt:/mnt --rm ubuntu:18.04 bash
    

    以上参数中:

    • -i -> 交互式操作
    • -t -> 终端
    • --rm -> 容器退出后即清除,节省空间
    • -v -> 这个参数是一个非常实用的参数,docker毕竟是虚拟机,docker内部天然跟外部环境无法沟通。
      • 但是用来打包命令行工具,当然需要进行交互。
      • -v就是将外部的地址,挂载映射到内部地址的参数。
      • 比如上方,docker内部的程序,就可以通过同样/mnt路径访问外部的数据了
    • 随后两个就是启用的镜像名称,和执行的命令
  5. 列出镜像,删除镜像

    # 列出镜像
    docker image ls
    
    # 列出镜像体积
    docker system df
    
    # 列出无用镜像
    docker image ls -f dangling=true
    
    # 清除无用镜像
    docker image prune
    
  6. 删除镜像docker image rm [选项] <镜像1> [<镜像2> ...]

  7. Dockerfile,快速构建镜像

    FROM debian:stretch   # 以什么镜像为基础
    
    # 一些在构建镜像时指定的命令,就是基础的bash命令
    RUN apt-get update
    RUN apt-get install -y gcc libc6-dev make wget
    RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
    RUN mkdir -p /usr/src/redis
    RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
    RUN make -C /usr/src/redis
    RUN make -C /usr/src/redis install
    
    # 另一种形式
    RUN buildDeps='gcc libc6-dev make wget' \
        && apt-get update \
        && apt-get install -y $buildDeps \
        && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
        && mkdir -p /usr/src/redis \
        && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
        && make -C /usr/src/redis \
        && make -C /usr/src/redis install \
        && rm -rf /var/lib/apt/lists/* \
        && rm redis.tar.gz \
        && rm -r /usr/src/redis \
        && apt-get purge -y --auto-remove $buildDeps
        
    # 将外部文件复制到docker内部
    COPY ./package.json /app/
    
    # CMD命令则是表明在启动容器时,容器内部需要执行的命令
    # 如下则是在启动容器时,运行nginx并且能够守护nginx的运行
    # 为何不像平常一样使用service比较有讲究,可以看一下本文最开始参见的部分内容
    CMD ["nginx", "-g", "daemon off;"]
    
    # endpoint则是将docker容器转化为命令行工具使用
    ENTRYPOINT [ "python", "main.py" ]
    

    构建镜像则可以通过docker build -t nginx:v3 .实现。

  8. 镜像导入和导出,较简单,不多说

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

推荐阅读更多精彩内容