目录
Docker(容器)
是什么?
Docker是Go语言开发的基于Linux内核的操作系统层面的虚拟化技术。
优点:
- 彻底释放计算虚拟化
- 提高应用的维护效率
- 降低云计算应用开发成本
虚拟机和Docker
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
Docker三大基本概念
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
Docker镜像
操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker 镜像,就相当于是一个root文件系统。比如官方镜像ubuntu 18.04 就包含了完整的一套Ubuntu 18.04最小系统的root 文件系统。
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。不包含任何动态数据,其内容在构建之后也不会被改变。
镜像为分层存储的架构,镜像只是一个虚拟的概念,不是ISO那样的打包文件,而是由一组文件系统组成。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
Docker容器
镜像和容器的关系,像是面向对象程序设计中的类和实例的关系。镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主(host)执行的进程不同,容器进程运行于自己的独立的命名空间(opens new window)。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,就像是在一个独立于宿主的系统下操作一样。
容器也是分层存储的架构,每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,为容器运行时读写而准备的存储层称为容器存储层。任何保存于容器存储层的信息都会随容器删除而丢失。
容器不应该向其存储层写入任何数据,容器存储层要保持无状态化。所有文件写入操作应使用数据卷(Volume)或绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,性能和稳定性更高。使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
Docker Registry
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用镜像,我们就需要一个集中的存储、分发镜像的服务Docker Registry。
一个Docker Registry可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。
一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。
仓库名经常以两段式路径形式出现,比如 jwilder/nginx-proxy,前者往往意味着Docker Registry多用户环境下的用户名,后者则往往是对应的软件名。
Docker安装
Ubuntu
方法一
先卸载旧版本
sudo apt-get remove docker \
docker-engine \
docker.io
添加使用 HTTPS 传输的软件包以及 CA 证书
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
添加软件源的 GPG
密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
向 sources.list 中添加 Docker 软件源
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
方法二
使用脚本自动安装
sudo sh get-docker.sh --mirror Aliyun
curl -fsSL get.docker.com -o get-docker.sh
启动Docker
sudo systemctl enable docker
sudo systemctl start docker
建立 docker 用户组
默认情况下,docker 命令会使用 Unix socket (opens new window)与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
建立docker组
sudo groupadd docker
将当前用户加入docker组
sudo usermod -aG docker $USER
退出当前终端并重新登录,进行测试,
docker run --rm hello-world
输出如下内容则安装正确
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Docker镜像加速
镜像服务地址:
- 阿里云加速器(搜索“镜像” -> 容器镜像服务-> 镜像工具 -> 镜像加速器 -> 复制地址)
- 网易云加速器 https://hub-mirror.c.163.com
- 百度云加速器 https://mirror.baidubce.com
由于镜像服务可能出现宕机,建议同时配置多个镜像。各个镜像站测试结果到 docker-practice/docker-registry-cn-mirror-test 查看。
查看是否在 docker.service 文件中配置过镜像地址
systemctl cat docker | grep '\-\-registry\-mirror'
如果该命令有输出,那么执行
systemctl cat docker
查看 ExecStart= 出现的位置,修改对应的文件内容去掉 --registry-mirror 参数及其值,并按接下来的步骤进行配置。
如果以上命令没有任何输出,那么就可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在新建该文件)
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
" 阿里云加速地址 ",
"https://mirror.baidubce.com"
]
}
重新启动服务
sudo systemctl daemon-reload
sudo systemctl restart docker
检查加速器是否生效,执行命令
docker info
输出如下内容,说明配置成功
Registry Mirrors:
"https://hub-mirror.c.163.com"
" 阿里云加速地址 "
"https://mirror.baidubce.com"