《Docker 技术入门与实践》-读书笔记一

一、初识Docker

(一) 什么是Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。Docker就是类似的理念。

(二)Docker的优势

对开发和运维人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境、任意时间让应用正常的运行。而Docker恰恰是可以实现这一终极目标的瑞士军刀

具体来说,Docker在开发和运维过程中,有如下几个方面的优势。

  • 更快的交付和部署。使用Docker,开发人员可以使用镜像快速构建一套标准的开发环境,开发完成之后,测试和运维可以直接使用相同环境来部署代码。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试和部署的时间。并且各个步骤都有明确的配置和操作,整个过程可见,使团队更容易理解应用的创建和工作过程。
  • 更高效的利用资源。Docker容器的运行不需要额外的虚拟化管理程序(Virtual Machine Manager VMM)支持。这种兼容性让用户可以在不同的平台之间轻松的迁移应用。
  • 更轻松的迁移和扩展。Docker容器几乎可以在任意平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。
  • 更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式进行分发和更新,从而实现自动化并且高效的容器管理。

Docker与传统虚拟机的比较

特性 容器 虚拟机
启动速度 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个
隔离性 安全隔离 完全隔离

二、Docker的核心概念和安装

(一)核心概念

Docker镜像:类似于虚拟机的镜像,可以将它理解为一个面向 Docker 引擎的只读模板,包含了文件系统。镜像是创建 Docker  容器的基础。通过版本管理和增量的文件系统,Docker 提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用的镜像,并通过简单的命令就可以直接使用。

Docker容器:类似于一个轻量级的沙箱,Docker 利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。

Docker仓库:类似于代码仓库,是 Docker 集中存放镜像文件的场所。根据存储的镜像是否公开,Docker 仓库可以分为公开仓库和私有仓库两种形式。目前最大的公开仓库是 Docker Hub ,存放了数量庞大的镜像供用户下载。同时用户可以创建自己的镜像,并将镜像 push 到公有或者私有仓库。当下次需要使用时,可以从仓库 pull 下来。

这样可以看出,Docker 利用仓库管理镜像的设计理念与 Git 非常相似。

(二)Docker 安装

CentOS

Docker 支持 CentOS 6 及以后的版本。

对于 CentOS 6 系统可以使用 EPEL 库安装 Docker, 命令如下:

$ sudo yum install -y http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
$ sduo yum install -y docker-io

对于 CentOS 7 系统,由于CentOS-Extras 源中已内置 Docker ,读者可以直接使用 yum 命令进行安装:

$ sudo yum install -y docker-io

目前在 CentOS 系统中更新 Docker 软件有两种方法,一是自行通过源码编译安装,二是下载二进制文件进行更新。 

(三)镜像

使用 docker pull 命令从网络上下载镜像

[root@localhost bin]# docker pull ubuntu
Using default tag: latest
Trying to pull repository docker.io/library/ubuntu ...

这是从默认的注册服务器 registry.hub.docker.com 中的 ubuntu 仓库下载标记为 latest 的镜像。

用户也可以选择从其它注册服务器的仓库下载。此时,需要在仓库名称前面指定完整的仓库注册服务器地址。例如从DockerPool 社区的镜像源 dl.dockerpool.com 下载最新的 Ubuntu 镜像。


使用 docker images 命令可以列出本地主机上已有的镜像。

[root@localhost bin]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              1d9c17228a9e        12 days ago         86.7 MB
[root@localhost bin]# 

在列出的信息中,可以看到几个字段信息:

repository: 来自哪个仓库,比如 Ubuntu 仓库。

          tag: 镜像的标签信息,比如 latest。

 image id: 镜像的 ID 号(唯一)。这个ID 信息十分重要,它唯一标识了镜像。

  created: 创建时间。

       size: 镜像大小。


使用 docker inspect 命令可以获取该镜像的详细信息

[root@localhost bin]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              1d9c17228a9e        12 days ago         86.7 MB
[root@localhost bin]# docker inspect 1d9c17228a9e
[
    {
        "Id": "sha256:1d9c17228a9e80a0a23927f24f3cf17d012cf0bb3eae5e3541a8c6987ab9bd5a",
        "RepoTags": [
            "docker.io/ubuntu:latest"
        ],
.......

docker inspect 命令返回的是一个 JSON 格式的消息,如果我们只要其中一项内容时,可以使用 -f 参数来指定,例如,获取镜像 Os 的信息:

[root@localhost bin]# docker inspect -f {{".Os"}} 1d9
linux
[root@localhost bin]# 

1d9 这里的镜像 ID 的前几个字符,通常指定镜像 ID 的时候,使用该 ID 的前几个字符注册的可区分字符串来替代完整的 ID 。


使用 docker search 命令可以搜索远端仓库中共享的镜像,默认搜索 Docker Hub 官方仓库的镜像。

例如,搜索带mysql 关键字的镜像如下所示:

可以看到返回了很多包含关键字的镜像,包括名字、描述、星级(表示该镜像的受欢迎的程度)、是否官方创建、是否自动创建。


使用 docker rmi 命令可以删除镜像

这里使用 docker images 查看当前镜像

[root@localhost bin]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql     latest              102816b1ee7d        12 days ago         486 MB
docker.io/ubuntu    latest              1d9c17228a9e        12 days ago         86.7 MB

使用 docker rmi 102816b1ee7d 删除 mysql 的镜像,再次查看镜像,mysql 镜像已经不存在。

[root@localhost bin]# docker rmi 102816b1ee7d
Untagged: docker.io/mysql:latest
Untagged: docker.io/mysql@sha256:196c04e1944c5e4ea3ab86ae5f78f697cf18ee43865f25e334a6ffb1dbea81e6
Deleted: sha256:102816b1ee7d6f5943c251647275f0d112f4617bb4ab3f7583206404b7834732
Deleted: sha256:11ecf570fd9ad77e66e01d6c4e8ee14ba4662537c55ecd054a1969d47ead36c5
Deleted: sha256:bedca50a86d8dcf697107988432b4f497f2d5c482010482a75ed6ab27a091cca
Deleted: sha256:aba6b732e849978b7cd7f51240b9b1b0b2f5f893f8c5f5dad6fe42ea7bd9fa9a
Deleted: sha256:c5a6c53127d2f4e20daed7646274e1691b5800488e2c72f5d061e2f5cf47f101
Deleted: sha256:f246dda4c169f2e6058620922dd0d53289510dd6c4ff283d1b45354271ff237c
Deleted: sha256:e4e5e2c13bfc19ea0b7931fe111b490026c943d49b9b0fc658134bc168f8f4f0
Deleted: sha256:6cc2a43de520c5c2fb3308ecc23cb93e5ca4e40c2c5c781825572f1dcfc12010
Deleted: sha256:41a87a1b83603cb4cbd7b95fe803ab3c37f5cf1fda058361a89108f5ae6f33cb
Deleted: sha256:fb70646553d25ffeca12296dd9ef69cc6a61567d4636adf41c195ceaa7d91bba
Deleted: sha256:044ab08434546e6569ed9ac43200e0c696c38751e1eb88748063256183beecf9
Deleted: sha256:8de920f11cbdc968c39f60866eaea7e60b3f60e76fca76d585a11ee5a872322d
Deleted: sha256:7b4e562e58dcb7fbe1e27bb274f0ff8bfeb2fd965203380436e159df9f218900
[root@localhost bin]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              1d9c17228a9e        12 days ago         86.7 MB

创建镜像

创建镜像有三种方法:基于已有镜像的容器创建、基于本地模板导入、基于 Dockerfile 创建。

  • 基于已有镜像的容器创建

    该方法主要是使用 docker commit 命令,主要选项包括:

    -a  --author="" 作者信息。

    -m --message="" 提交信息

    -p --pause=true 提交时暂停容器运行。

1. 首先启动一个镜像,并在其中进行修改操作,创建一个 test 文件,之后推出:

[root@localhost bin]# docker run -ti 1d9c17228a9e /bin/bash
root@ba7f88d7ff79:/# touch test
root@ba7f88d7ff79:/# exit
exit

记住容器的 ID 为 ba7f88d7ff79

2. 此时该容器已经与原来的镜像相比发生了变化,可以使用 docker commit 命令提交为一个新的镜像,提交时使用 ID 或名称指定容器。

[root@localhost bin]# docker commit -m "Add a new file" -a "beetle" ba7f88d7ff79 test
sha256:3af2730c06cf5f1c0eb032d9c2f81fe29834b8bfa33fb36f71b9ef60049c2481
[root@localhost bin]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                latest              3af2730c06cf        15 seconds ago      86.7 MB
docker.io/ubuntu    latest              1d9c17228a9e        12 days ago         86.7 MB

顺利的话会和上面显示的一样,返回创建的镜像的 ID 信息,此时查看本地镜像列表,可以看到新创建的镜像。

  • 基于本地模板导入

在这里推荐使用 OpenVz 提供的模板来创建。 OpenVz 模板的下载地址为:https://download.openvz.org/template/precreated/

下载页面如下所示:

这里下载了  ubuntu-14.04-x86_64-minimal.tar.gz 模板,导入命令如下:

[root@localhost bin]# cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
sha256:316b57509753c48d3597828d7d80ffd380f81ff0f8b8839b0fb94411c63a8fea
[root@localhost bin]# 

然后查看导入的镜像:

[root@localhost bin]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               316b57509753        47 seconds ago      215 MB
test                latest              3af2730c06cf        19 minutes ago      86.7 MB
docker.io/ubuntu    latest              1d9c17228a9e        12 days ago         86.7 MB

存出镜像

使用 docker save 命令 可以将镜像保存到本地。

[root@localhost bin]# docker save -o ubuntu_14.04.tar ubuntu:14.04 

查看本地镜像文件:

-rw-------. 1 root root    225830912 1月  10 14:53 ubuntu_14.04.tar
-rw-r--r--. 1 root root     78421150 1月  10 14:46 ubuntu-14.04-x86_64-minimal.tar.gz

载入镜像

使用docker load 从存出的本地文件中导入到本地镜像库,例如:

[root@localhost bin]# docker load --input ubuntu_14.04.tar
#或者
[root@localhost bin]# docker load < ubuntu_14.04.tar

(四)容器

1、创建容器

使用 docker create 命令创建一个容器。

[root@localhost bin]# docker create -it ubuntu:latest
WARNING: IPv4 forwarding is disabled. Networking will not work.
abd8cda4107ebd1864c3d0d57db4e40d5c61d6510db16950b20fdc83caa0d257

查看新建容器;

[root@localhost bin]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
abd8cda4107e        ubuntu:latest       "/bin/bash"         25 seconds ago      Created                                     upbeat_gates
ba7f88d7ff79        1d9c17228a9e        "/bin/bash"         4 days ago          Exited (0) 4 days ago                       suspicious_morse

使用 docker create 命令新建的容器处于停止状态,可以使用 docker start 命令来启动它。

守护态运行

让 Docker 容器在后台以守护态运行,可以通过 -d 参数来实现。

[root@localhost bin]# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
6c759287e5206c38b29b10f2759fe527164c48dec96a93076ca68d7c34706311
[root@localhost bin]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6c759287e520        ubuntu              "/bin/sh -c 'while..."   18 seconds ago      Up 17 seconds                           happy_almeida 

如果要获取容器的输出信息,可以通过 docker logs 命令:

[root@localhost bin]# docker logs 6c7
hello world
hello world
hello world
...

2、终止容器

使用 docker stop 来终止一个运行的容器

[root@localhost bin]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6c759287e520        ubuntu              "/bin/sh -c 'while..."   2 minutes ago       Up 2 minutes                            happy_almeida
[root@localhost bin]# docker stop 6c7
6c7
[root@localhost bin]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost bin]# 

处于终止状态的容器,可以通过 docker restart 命令来重新启动:

[root@localhost bin]# docker restart 6c7
6c7
[root@localhost bin]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6c759287e520        ubuntu              "/bin/sh -c 'while..."   5 minutes ago       Up 3 seconds                            happy_almeida
[root@localhost bin]# 

3、进入容器

使用 attach 命令进入容器,但是当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其它窗口也无法操作了。

[root@localhost bin]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6c759287e520        ubuntu              "/bin/sh -c 'while..."   5 minutes ago       Up 3 seconds                            happy_almeida
[root@localhost bin]# docker attach happy_almeida
hello world
hello world
hello world
...

使用 exec 命令,可以直接在容器内运行命令。例如下面进入到一个刚创建的容器,并启动一个bash :

[root@localhost bin]# docker restart 6c7
6c7
[root@localhost bin]# docker exec -ti 6c7 /bin/bash
root@6c759287e520:/# 

4、删除容器

使用 docker rm 命令删除处于终止状态的容器。

-f , --force=false 强行终止并删除一个运行中的容器。

-l, --link=false 删除容器的连接,但保留容器。

-v --volumes=false 删除容器挂载的数据卷。

[root@localhost bin]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS               NAMES
6c759287e520        ubuntu              "/bin/sh -c 'while..."   19 minutes ago      Up 4 minutes                                happy_almeida
abd8cda4107e        ubuntu:latest       "/bin/bash"              29 minutes ago      Created                                     upbeat_gates
ba7f88d7ff79        1d9c17228a9e        "/bin/bash"              4 days ago          Exited (0) 4 days ago                       suspicious_morse
[root@localhost bin]# docker rm abd
abd
[root@localhost bin]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS               NAMES
6c759287e520        ubuntu              "/bin/sh -c 'while..."   19 minutes ago      Up 5 minutes                                happy_almeida
ba7f88d7ff79        1d9c17228a9e        "/bin/bash"              4 days ago          Exited (0) 4 days ago                       suspicious_morse
[root@localhost bin]# 

如果要删除一个运行中的容器,可以添加 -f 参数。

#查看运行中的容器
[root@localhost bin]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6c759287e520        ubuntu              "/bin/sh -c 'while..."   20 minutes ago      Up 6 minutes                            happy_almeida
#不加 -f 参数删除容器报错
[root@localhost bin]# docker rm 6c7
Error response from daemon: You cannot remove a running container 6c759287e5206c38b29b10f2759fe527164c48dec96a93076ca68d7c34706311. Stop the container before attempting removal or use -f
#添加 -f 参数删除容器,正常
[root@localhost bin]# docker rm -f 6c7
6c7
[root@localhost bin]# 

(五)仓库

仓库是存放镜像的地方,而注册服务器是存放仓库的具体服务器,每个服务器上可以有多个仓库,每个仓库下面有多个镜像。从这方面来说,仓库可以说是一个具体的项目或目录。

用户可以使用 dockr search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来下载到本地。

[root@localhost bin]# docker search mysql
INDEX       NAME                                                             DESCRIPTION                                     STARS     OF
docker.io   docker.io/mysql                                                  MySQL is a widely used, open-source relati...   7670      [O
docker.io   docker.io/mariadb                                                MariaDB is a community-developed fork of M...   2512      [O
docker.io   docker.io/mysql/mysql-server                                     Optimized MySQL Server Docker images. Crea...   582         
docker.io   docker.io/percona                                                Percona Server is a fork of the MySQL rela...   406       [O
docker.io   docker.io/zabbix/zabbix-server-mysql                             Zabbix Server with MySQL database support       160         
docker.io   docker.io/hypriot/rpi-mysql                                      RPi-compatible Docker Image with Mysql          104         
docker.io   docker.io/zabbix/zabbix-web-nginx-mysql                          Zabbix frontend based on Nginx web-server ...   85          
docker.io   docker.io/centurylink/mysql                                      Image containing mysql. Optimized to be li...   60          
docker.io   docker.io/1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          48          
docker.io   docker.io/centos/mysql-57-centos7                                MySQL 5.7 SQL database server                   45          
docker.io   docker.io/mysql/mysql-cluster                                    Experimental MySQL Cluster Docker images. ...   39          
docker.io   docker.io/tutum/mysql                                            Base docker image to run a MySQL database ...   31          
docker.io   docker.io/schickling/mysql-backup-s3                             Backup MySQL to S3 (supports periodic back...   24          
docker.io   docker.io/bitnami/mysql                                          Bitnami MySQL Docker Image                      23          

Docker Hub

目前Docker 官方维护了一个公共仓库 https://hub.docker.com ,大部分需求都可以通过 Docker hub 中直接下载镜像来实现。

Docker Pool

Docker pool (http://dockerpool.com)是国内专业的 Docker 技术社区,目前也提供了官方镜像的下载管理服务。

需要注意的是,下载镜像也是使用 docker pull 命令,但是要在镜像名称前面加上注册服务器的具体地址 dl.dockerpool.com:5000。

猜你喜欢

转载自blog.csdn.net/aiyabeetle/article/details/85318483
今日推荐