jk's notes
  • 第01章 初识 Docker 与容器 [略, 无实质内容]

第01章 初识 Docker 与容器 [略, 无实质内容]

云时代, 注重基于虚拟化技术的集群能力.

1.1 什么是 Docker

1. Docker 开源项目背景

2. Linux 容器技术 -- 巨人的肩膀

3. 从 Linux 容器到 Docker

1.2 为什么要使用 Docker

1. Docker 虚拟化的好处

2. Docker 在开发和运维中的优势

  • 快速交付与部署
  • 高效的资源利用
  • 轻松的扩展与迁移
  • 简单的更新管理

3. Docker 与虚拟机比较

1.3 Docker 与虚拟化

1.4 本章小结

第02章 核心概念与安装配置

三大核心概念

  • 镜像 Image
  • 容器 Container
  • 仓库 Repository

2.1 核心概念

围绕三大核心概念展开

1. Docker 镜像

简单的理解为只读模板. 镜像是创建 Docker 容器的基础.

例如, 一个镜像可包含一个基本的操作系统环境, 里面仅安装了 Apache 应用程序. 可称其为一个 Apache 镜像.

通过版本管理和增量的文件系统, Docker 提供了一套十分简单的机制来创建和更新现有镜像.

用户也可以直接下载一个镜像使用.

jk: 可以将镜像简单的理解为 类

2. Docker 容器

类似于一个轻量级的沙箱. Docker 利用容器来运行和隔离应用.

容器是从镜像创建出来的应用运行实例. 它可以 启动, 开始, 停止, 删除.

而且各个容器是互相隔离, 互不可见的.

可以将容器看成简易版的 Linux 系统环境 (只有 Linux 系统和你所需要的软件).

镜像自身是只读的, 容器从镜像启动后, 会在镜像上创建一个可写层.

3. Docker 仓库

即 Docker 集中存放镜像的位置. 类似于 GitHub 或 Npm.

  • 官方的是 Docker Hub. 国内也有腾讯云和阿里云.
  • 也可以本地创建私有仓库.

利用 push 命令将镜像上传至仓库.

使用 pull 命令从仓库拉取镜像.

2.2 安装 Docker 引擎

Docker 引擎是使用 Docker 容器的核心组件. 可支持多 OS 平台.

可在官网查看获取方式以及支持平台. https://docker.com

Docker 引擎有两个版本: 社区版 (Community, CE, 免费), 企业版本 (Enterprise, EE, 收费).

2.2.1 Ubuntu 环境下安装 Docker

1. 系统要求

系统最低 14.04 LTS. 推荐较新的系统.

可使用下面命令查看内核版本:

$ uname -a
# 或者
$ cat /proc/version

若使用 16.04 LTS, 为了让 Docker 使用 aufs 存储, 推荐安装两个软件包:

$ sudo apt-get update
$ sudo apt-get install -y \
	linux-image-extra-$(uname -r) \
	linux-image-extra-virtual

2. 添加镜像源

首先安装 apt-transport-https 等软件包来支持 https 协议的源:

$ sudo apt-get update
$ sudo apt-get install -y \
	apt-transport-https \
	ca-certificates \
	curl \
	software-properties-common

添加源的 gpg 秘钥

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

确认导入指纹 GPG 公钥

$ sudo apt-key fingerprint 公钥后8位

获取当前 操作系统代号

$ lsb_release -cs

下面添加 Docker 稳定版的官方源

$ sudo add-apt-repository \
	"deb [arch=amd64] https://download.docker.com/linux/ubuntu 系统代号 stable"

添加成功后再次更新

$ sudo apt-get update

3. 开始安装 Docker

软件包名称为 docker-ce

$ sudo apt-get install -y docker-ce

若系统中含有旧版本会提示删除, 确认即可.

jk: 比较推荐的方式

上述为手动添加软件源的方式安装. 除此之外还可以使用官方提供的脚本来安装

$ sudo curl -sSL https://get.docker.com/ | sh

安装完成后会自动启动 Docker 服务.

还可以指定安装源中的其他版本 (略)

jk:

官方给出的安装步骤: https://docs.docker.com/engine/install/ubuntu/

阿里云的文档: https://developer.aliyun.com/article/110806

Docker官方在推广 Docker Desktop

2022年7月4日

2.2.2 CentOS 环境下安装 Docker [略]

2.2.3 通过脚本安装 [略]

在 2.2.1 结束部分有介绍

2.2.4 macOS 环境下安装 Docker [略]

2.2.5 Windows 下安装 Docker [略]

2.3 配置 Docker 服务

将当前用户加入安装中自动创建的 docker 用户组 (避免每次 sudo)

$ sudo usermod -aG docker 当前用户名

重新登录生效.

Docker 启动实际上调用了 dockerd 命令. 该命令支持多中参数.

例如, 启动 Docker 服务, 开启 Debug 模式, 并监听本地 2376 端口:

$ dockerd -D -H tcp://127.0.0.1:2376

似乎安装好 docker 后就会自动启动.

这些选项可以写入到启动配置文件中: 在 /etc/docker 目录下的 daemon.json 文件中.

{
    "debug": true,
    "hosts": [ "tcp://127.0.0.1:2376" ]
}

jk: 问题是还有什么参数???

操作系统也对 Docker 也有封装, Docker 默认配置文件在 /etc/default/docker

可以修改 DOCKER_OPTS 来修改启动参数.

文件默认是空的:

image-20220704112040276

例如, 让 Docker 服务开启网络 2375 端口的监听:

DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

修改后, 通过 service 命令来重启 Docker 服务

$ sudo service docker restart

CentOS 或 RedHat 通过 systemd 来管理, 配置文件路径为 /etc/systemd/system/docker.service.d/docker.conf

更新后需要使用 systemctl 命令来管理 Docker 服务

$ sudo systemctl daemon-reload
$ sudo systemctl start docker.service

如果启动存在问题, 可与查看 docker 日志. 可执行命令

$ journalctl -u docker.service

可以使用命令 docker info 查看 docker 信息.

2.4 推荐实践环境 [略]

2.6 本章小结

第03章 使用 Docker 镜像

Docker 的运行依赖于镜像.

如果本地没有镜像会从默认镜像仓库 (Docker Hub) 中下载. [镜像仓库可配置]

3.1 获取镜像

使用命令 docker [image] pull 命令从 Docker Hub 镜像源下载镜像. 命令格式为:

$ docker [image] pull NAME[:TAG]

NAME 是镜像仓库名 (用于区分镜像)

TAG 是镜像的标签 (常表示版本), 若不指定, 默认为 lastest

通常描述一个镜像需要包括 名称 + 标签 信息.

例如, 获取 ubuntu 18.04 系统镜像可以使用下面命令

$ docker pull ubuntu:18.04

latest 一般会随发布新的版本而变化, 稳定性无法保证, 一般不推荐使用.

从下载过程可见, 镜像文件一般由若干层 (layer) 组成

在镜像名前还可以跟上仓库路径. 默认为 docker hub, 例如使用网易蜂巢的镜像可以写成:

docker pull hub.c.163.com/public/ubuntu:18.04

pull 的子命令主要有:

$ docker pull --help

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Pull an image or a repository from a registry

Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --platform string         Set platform if server is multi-platform capable
  -q, --quiet                   Suppress verbose output

如果希望使用镜像代理服务器来加速 Docker, 可以在 Docker 服务启动配置中加上 --registry-mirror 来指定代理. 阿里的加速配置即为如此.

jk@jk-System-Product-Name:~$ cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://iglfr1u0.mirror.aliyuncs.com"]
}

将镜像下载到本地后即可使用镜像.

例如利用镜像创建容器 (好比使用类, 实例化一个对象的逻辑一样), 在其中运行 bash 应用, 执行打印 "Hello World"

$ docker run -it ubuntu:18.04 bash

即可进入这个 ubuntu 系统环境.

jk@jk-System-Product-Name:~$ docker run -it ubuntu:18.04
root@14682e28533c:/# echo "hello world"
hello world
root@14682e28533c:/# exit
exit

3.2 查看镜像信息

主要介绍 docker 的 ls, tag 和 inspect 子命令.

1. 使用 images 命令列出镜像

使用 docker images 或 docker image ls 命令可以列出本机已有镜像.

jk@jk-System-Product-Name:~$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   6 months ago   141MB
ubuntu       18.04     5a214d77f5d7   9 months ago   63.1MB

其中 ID 是镜像的唯一标识, 如果有多个镜像, 但 ID 相同仅表示同一个镜像, 只是 Tag 等信息不同.

images 的子命令有

jk@jk-System-Product-Name:~$ docker images --help

Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

Options:
  -a, --all             Show all images (default hides intermediate
                        images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show image IDs

2. 使用 tag 命令添加镜像标签

可以使用该名字添加自定义标签, 以便管理

jk@jk-System-Product-Name:~$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   6 months ago   141MB
ubuntu       18.04     5a214d77f5d7   9 months ago   63.1MB
jk@jk-System-Product-Name:~$ docker tag nginx:latest nginxserver
jk@jk-System-Product-Name:~$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    605c77e624dd   6 months ago   141MB
nginxserver   latest    605c77e624dd   6 months ago   141MB
ubuntu        18.04     5a214d77f5d7   9 months ago   63.1MB

其中 nginx 和 nginxserver 的 ID 是相同的, 表示同一个镜像.

3. 使用 inspect 命令查看详细信息

例如:

$ docker inspect ubuntu:18.04

4. 使用 history 命令查看镜像历史

例如:

$ docker history ubuntu:18.04

3.3 搜寻镜像

命令 docker search [option] 关键字 可以在 Docker Hub 官方仓库中搜寻镜像.

jk@jk-System-Product-Name:~$ docker search --help

Usage:  docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output

3.4 删除和清理镜像

主要介绍 rm 和 prune 子命令.

1. 使用标签删除镜像

使用 docker rmi 或 docker image rm 命令可以删除镜像. 后可以跟标签或 ID.

jk@jk-System-Product-Name:~$ docker rmi --help

Usage:  docker rmi [OPTIONS] IMAGE [IMAGE...]

Remove one or more images

Options:
  -f, --force      Force removal of the image
      --no-prune   Do not delete untagged parents

jk@jk-System-Product-Name:~$ docker image rm --help

Usage:  docker image rm [OPTIONS] IMAGE [IMAGE...]

Remove one or more images

Aliases:
  rm, rmi, remove

Options:
  -f, --force      Force removal of the image
      --no-prune   Do not delete untagged parents

注意, 同一个镜像有多个 Tag 的时候, 若使用 Tag 来删除, 仅会删除对应 Tag.

2. 使用镜像 ID 来删除镜像

当镜像创建的容器存在时, 镜像文件是无法被删除的.

可以使用 docker ps -a 查看本机上存在的所有容器.

不是说容器在运行无法删除, 容器存在就无法删除.

可以强制删除 (带上 -f 选项), 但不建议.

一般操作是先用 rm 删除容器, 再删除镜像.

3. 清理镜像

清除遗留的镜像或未使用的镜像

$ docker image prune
jk@jk-System-Product-Name:~$ docker image prune --help

Usage:  docker image prune [OPTIONS]

Remove unused images

Options:
  -a, --all             Remove all unused images, not just dangling ones
      --filter filter   Provide filter values (e.g. 'until=<timestamp>')
  -f, --force           Do not prompt for confirmation

3.5 创建镜像 [暂略]

创建镜像有三种方法:

  1. 基于已有镜像的容器创建
  2. 基于本地模板创建
  3. 基于 Dockerfile 创建

1. 基于已有容器创建

命令格式为: docker [container] commit [OPTIONS] CONTAINER [REPOSTORY[:TAG]]

Last Updated:
Contributors: jk