什么是 docker

docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。

docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

docker 优点

  • 灵活:即使是最复杂的应用也可以集装箱化。
  • 轻量级:容器利用并共享主机内核。
  • 可互换:您可以即时部署更新和升级。
  • 便携式:您可以在本地构建,部署到云,并在任何地方运行。
  • 可扩展:您可以增加并自动分发容器副本。
  • 可堆叠:您可以垂直和即时堆叠服务。

docker 应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

docker 架构

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。

架构图如下所示:

概念说明
Docker 镜像(Images)Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container)容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client)Docker 客户端通过命令行或者其他工具使用 Docker SDK 与 Docker 的守护进程通信。
Docker 主机(Host)一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker RegistryDocker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
Docker MachineDocker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,例如VirtualBox。

PS:Docker Hub 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Ubuntu 18.04 安装 Docker-ce

  1. 推荐更换ubuntu国内软件源为中科大的源(视服务器而定):
    1
    2
    3
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
    sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    sudo apt update
  2. 安装需要的包:
    1
    sudo apt install apt-transport-https ca-certificates software-properties-common curl
  3. 添加 GPG 密钥,并添加 Docker-ce 软件源,以中国科技大学的 Docker-ce 源为例:
    1
    2
    3
    curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
    $(lsb_release -cs) stable"
  4. 添加成功后更新软件包缓存:
    1
    sudo apt update
  5. 安装docker-ce:
    1
    sudo apt install docker-ce
  6. 设置开机自启动并启动 Docker-ce(安装成功后默认已设置并启动,可忽略):
    1
    2
    sudo systemctl enable docker
    sudo systemctl start docker
  7. 测试运行:
    1
    sudo docker run hello-world
    终端显示以下内容时说明安装成功:

    PS:可以添加当前用户到 docker 用户组,可以不用 sudo 运行 docker(可选):
    sudo groupadd docker
    sudo usermod -aG docker $USER

镜像使用

基础命令

  • docker images :列出本地主机上的镜像。

    参数说明:

    • REPOSITORY:表示镜像的仓库源
    • TAG:镜像的标签。同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本;使用REPOSITORY:TAG 来定义不同的镜像。
    • IMAGE ID:镜像ID
    • CREATED:镜像创建时间
    • SIZE:镜像大小
  • docker search name:在Docker Hub中查找镜像。

    参数说明:

    • NAME: 镜像仓库源的名称
    • DESCRIPTION: 镜像的描述
    • STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。
    • OFFICIAL: 是否 docker 官方发布
    • AUTOMATED: 自动构建。
  • docker pull name:从Docker Hub中下载镜像。

  • docker rmi name:删除镜像。前提是基于该镜像的容器已不再处于使用状态。

创建镜像

  • 从已经创建的容器中更新镜像,并且提交这个镜像。
    更新镜像之前需要使用镜像来创建一个容器:

    例如用ubuntu镜像创建的容器中进行apt update更改,然后exit退出容器。
    此时容器ID为04f3b433a4a9。可以通过命令 docker commit 来提交容器副本,提交后可以再次查看本地镜像文件: docker commit -m="update" -a="dreamhomes" 04f3b433a4a9 dreamhomes/ubuntu
  • docker tag IMAGE_ID dreamhomes/ubuntu:version:设置镜像标签
  • 使用 Dockerfile 指令来创建一个新的镜像。

镜像保存和导入

  • docker save IMAGE > PATH/IMAGE.tar.gz: 导出镜像到本地;

  • docker load < PATH/IMAGE.tar.gz: 导入镜像到docker镜像库;


    更新:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 保存 container 为归档文件
    docker export -o test.tar container-name/ID
    # 对应的导入镜像
    docker import test.tar image-name

    # 保存 image 为归档文件
    docker save -o test.tar image-name
    # 对应的导入镜像
    docker load --input test.tar 或 docker load < test.tar

镜像容器重命名

1
2
3
4
# 镜像
docker tag 500b941e6f79 tomcat7:jre7
# 容器
dokcer rename 容器ID mytomcat7:jre7

复制文件

1
docker cp ./test.txt  container-name[or ID]:/root/path

容器使用

  • docker run -it --name ubuntu-test ubuntu bash:创建容器;

    参数说明:

    • -i: 交互式操作。
    • -t: 终端。
    • –name:容器名字。
    • ubuntu: ubuntu 镜像。
    • /bin/bash:在镜像名后的是命令,交互式 Shell为 /bin/bash。
      要退出终端,直接输入 exit;
  • docker ps -a:查看所有容器(包括已停止的)
  • docker start ID :启动一个已停止的容器(加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec)
  • docker stop ID:停止运行的容器;
  • docker run -d --name ubuntu-test ubuntu /bin/bash:容器后台运行;
  • docker exec -it ID /bin/bash:进入运行的容器;docker attach ID:进入容器后退出会导致容器停止!
  • docker export ID > name.tar:导出容器快照到本地文件;
  • cat docker/ubuntu.tar | docker import - test/ubuntu:v1:从本地快照文件导入为镜像;
  • docker import http://example.com/exampleimage.tgz example/imagerepo:从URL或目录导入镜像;
  • docker rm -f ID:删除运行的容器;
  • docker container prune:清理掉所有处于终止状态的容器;

容器连接

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P-p 参数来指定端口映射。也可通过-v参数将主机文件映射到容器中。

端口映射

  • docker run -d -P training/webapp python app.py
    -P :是容器内部端口随机映射到主机的高端口。
  • docker run -d -p 5000:5000 training/webapp python app.py
    -p : 是容器内部端口绑定到指定的主机端口。(前面是主机端口,后面是容器端口)
  • docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
    指定容器绑定的网络地址。

数据卷

  • sudo docker run -d -P --name test -v /home/dreamhomes:/home/dreamhomes:ro ubuntu bash
    挂载一个主机目录作为数据卷,本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它;:ro表示文件只读。($PWD当前目录中增加前缀)
  • sudo docker run -it --rm -v /home/v-smj19:/home/v-smj19 ubuntu bash
    --rm参数表示在容器退出时自动清理容器内部的文件系统。等价于:docker rm -v

了解上述命令后即可满足基础的需求了,如果有更复杂的需求可以参考官网哦!https://docs.docker.com/engine/reference/run/

联系作者