The value of knowledge lies not in possession, but in share.

0%

初用Docker总结

关于Docker,第一次是在做OCR部署的时候接触,但是项目并没真正使用Docker进行部署。而后也多次在公司其他部门技术分享会上学习,但都没有达到真正的理解,皆是泛泛而过。

近三天,疯狂捣鼓Docker的云化部署的过程中,同时不断与同事的交流下,终于初步理解了Docker这个工具,以下便是自己对近几天所学到的内容作一个总结,方便以后进行查阅。

本文主要记录Docker的基本使用流程和用法,后面会出一篇有关算法Web API项目的Docker部署过程,也算是对今日的一个总结。

Docker 简介

  1. 镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。
  2. 容器(Container):类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。
  3. 仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像

建议三个概念充分理解,要不然在下文阅读的过程中容易产生混乱。

Docker 安装

Ubuntu下安装:Install Docker Engine on Ubuntu

CentOS下安装:Install Docker Engine on CentOS

……

本处暂只介绍Ubuntu下Docker的安装,有两种方式(a.使用 APT 安装; b.使用脚本自动安装),请务必看完本节后,再选择使用哪一种方式进行安装。

  1. 使用 APT 安装

    • 由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      # 更新 apt 软件包缓存
      sudo apt-get update
      # 安装使用 HTTPS 传输时所需的软件包以及 CA 证书
      sudo apt-get install \
      apt-transport-https \
      ca-certificates \
      curl \
      gnupg-agent \
      software-properties-common
    • 为确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。

      1
      2
      3
      4
      5
      # 中科大源
      curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

      # 官方源
      # curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    • sources.list 中添加 Docker 软件源

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      # 中科大源
      sudo add-apt-repository \
      "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
      $(lsb_release -cs) \
      stable"

      # 官方源
      # sudo add-apt-repository \
      # "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
      # $(lsb_release -cs) \
      # stable"
      # 以上命令会添加稳定版本的 Docker APT 镜像源,如果需要测试版本的 Docker 请将 stable 改为 test。
    • 开始安装

      1
      2
      3
      4
      # 更新 apt 软件包缓存
      sudo apt-get update
      # 安装 docker-ce
      sudo apt-get install docker-ce docker-ce-cli containerd.io
  2. 使用脚本自动安装

    Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:

    1
    2
    curl -fsSL get.docker.com -o get-docker.sh
    sudo sh get-docker.sh --mirror Aliyun

    执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在系统中。

Docker 卸载

旧版本的 Docker 称为 docker 或者 docker-engine,使用以下命令卸载旧版本:

1
2
3
sudo apt-get remove docker \
docker-engine \
docker.io

创建 Docker 镜像

通过已有镜像来新建自有镜像

  1. 查找某某镜像是否存在,已ubuntu镜像为例

    1
    2
    # 查找ubuntu镜像是否存在,
    docker search ubuntu
  2. 拉取镜像

    1
    2
    3
    4
    5
    6
    7
    8
    # 拉取镜像
    docker pull ubuntu
    # 显示内容如下:
    # Using default tag: latest
    # latest: Pulling from library/ubuntu
    # 08d48e6f1cff: Pull complete
    # Digest: sha256:b2f9d1c0ff5f87a4743104d099a3d561002ac500db1b9bfa02a783a46e0d366c
    # Status: Downloaded newer image for ubuntu:latest
  3. 查看镜像信息

    1
    2
    3
    4
    5
    # 查看镜像信息
    docker images
    # 显示内容如下:
    # REPOSITORY TAG IMAGE ID CREATED SIZE
    # ubuntu latest 0584b3d2cf6d 9 days ago 196.5 MB
  4. 启动一个容器

    1
    2
    3
    4
    # 启动一个容器
    docker run -it ubuntu:latest /bin/bash
    # docker run -it REPOSITORY:TAG /bin/bash 和上面对照
    # 回车后命令行形式变了,表示已经进入该容器中

    这里-it是两个参数:-i和-t。前者表示打开并保持stdout,后者表示分配一个终端(pseudo-tty)。

  5. 在容器中新安装所需软件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 查看git版本
    git --version
    # 显示内容如下:
    # bash: git: command not found

    # 安装git
    sudo apt-get install git

    # 再次查看git版本
    git --version
    # 显示内容如下:
    # git version 2.25.1
  6. 退出容器

    1
    2
    # 退出容器
    eixt

    使用exit退出,则容器的状态处于Exit,而不是后台运行。如果想让容器一直运行,而不是停止,可以使用快捷键 ctrl+p ctrl+q 退出,此时容器的状态为Up。

  7. 查看docker中运行的程序(容器)

    1
    2
    3
    4
    5
    # 查看所有容器
    docker ps -a
    # 显示内容如下:
    # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    # 72f1a8a0e394 ubuntu:latest "/bin/bash" 9 minutes ago Exited (0) 3 minutes ago
  8. 将容器转化为一个镜像,即执行commit操作:

    1
    2
    3
    4
    5
    6
    7
    8
    # 将容器转化为一个镜像
    docker commit -m "ubuntu with git" -a "wangcong" 72f1a8a0e394 wangcong/ubuntu:git
    # 查看镜像信息
    docker images
    # 显示内容如下:
    # REPOSITORY TAG IMAGE ID CREATED SIZE
    # wangcong/ubuntu git 52166e4475ed 5 seconds ago 358.1 MB
    # ubuntu latest 0584b3d2cf6d 9 days ago 196.5 MB

    其中,-m指定说明信息;-a指定用户信息;72f1a8a0e394代表容器的id;wangcong/ubuntu:git指定目标镜像的用户名、仓库名和 tag 信息。注意这里的用户名wangcong,后边会用到。

  9. 停止容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 查看所有正在运行容器
    docker ps
    # 显示内容如下:
    # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    # 72f1a8a0e394 ubuntu:latest "/bin/bash" 9 minutes ago Exited (0) 3 minutes ago

    # 停止单个容器
    docker stop 72f1a8a0e394
    # docker stop ContainerId

    # 停止所有容器
    docker stop $(docker ps -aq)
  10. 删除容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 查看所有已存在的容器
    docker ps -a
    # 显示内容如下:
    # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    # 72f1a8a0e394 ubuntu:latest "/bin/bash" 9 minutes ago Exited (0) 3 minutes ago

    # 删除单个容器
    docker rm 72f1a8a0e394
    # docker rm ContainerId

    # 删除所有容器
    docker rm $(docker ps -aq)
  11. 删除镜像

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 查看镜像信息
    docker images
    # 显示内容如下:
    # REPOSITORY TAG IMAGE ID CREATED SIZE
    # ubuntu latest 0584b3d2cf6d 9 days ago 196.5 MB
    # wangcong/ubuntu git 52166e4475ed 5 seconds ago 358.1 MB

    # 删除镜像
    docker rmi 0584b3d2cf6d
    # docker rmi IMAGEID
  12. 保存镜像

    1
    2
    # 保存镜像
    docker save -o ubuntu.tar wangcong/ubunt:git
  13. 加载镜像

    1
    2
    # 加载镜像
    docker load -i ubuntu.tar
  14. 后台运行容器

    1
    docker run -d ubuntu:latest /bin/bash -c "while true; do echo hello; sleep 1; done"

    使用了-d参数,使这个容器处于后台运行的状态,不会对当前终端产生任何输出,所有的stdout都输出到log,可以使用docker logs container_name/container_id查看。

  15. 启动、停止、重启容器命令集合:

    1
    2
    3
    4
    5
    6
    # 启动容器
    docker start container_name/container_id
    # 停止容器
    docker stop container_name/container_id
    # 重启容器
    docker restart container_name/container_id

通过 Dockerfile 创建镜像

Dockerfile可以理解为一种配置文件,用来告诉docker build命令应该执行哪些操作。一个简易的Dockerfile文件如下所示,官方说明:Dockerfile reference

  1. 编写Dockerfile文档

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 说明该镜像以哪个镜像为基础
    FROM ubuntu:latest

    # 构建者的基本信息
    MAINTAINER wangcong

    # 在build这个镜像时执行的操作
    RUN sudo apt-get update
    RUN sudo apt-get install git

    # 拷贝本地文件到镜像中
    COPY ./* /usr/share/gitdir/
  2. 构建镜像

    1
    2
    3
    4
    # 构建镜像
    docker build -t wangcong/ubuntu:gitdir .
    # 注意,最后有一个点,表示在本目录下进行构建
    # 其中-t用来指定新镜像的用户信息、tag等。
  3. 查看构建后的镜像

    1
    2
    3
    4
    5
    6
    7
    # 查看构建后的镜像
    docker images
    # 显示内容如下:
    # REPOSITORY TAG IMAGE ID CREATED SIZE
    # xianhu/centos gitdir 0749ecbca587 34 minutes ago 359.7 MB
    # xianhu/centos git 52166e4475ed About an hour ago 358.1 MB
    # centos latest 0584b3d2cf6d 9 days ago 196.5 MB

Docker 加速

使用阿里云镜像加速器

1
2
# 编辑守护进程文件
vim /etc/docker/daemon.json

内容如下:

1
2
3
4
5
6
7
8
{
"registry-mirrors": [
"https://9cpn8tt6.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"insecure-registries":["10.1.93.164:5000"]
}

注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。

“insecure-registries”:[“10.1.93.164:5000”] 为本地仓库

使之生效:

1
2
3
4
# 重载 daemon
systemctl daemon-reload
# 重启 docker
systemctl restart docker

参考文献

  1. https://docker_practice.gitee.io/zh-cn/install/ubuntu.html

🍭支持一根棒棒糖吧!