Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。

Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示 软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的业界的隔离兼容。

Docker 利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括行程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。

Docker的三个重要概念:Dockerfile,image,container

image:镜像,可以看成是一个快照,通过一个镜像,可以创建许多不同的container容器。类似于类和对象。

container:容器,它就像一台台虚拟机,可以由相同或不同的镜像创建运行,相互之间不受影响。

Dockerfile:快速创建部署的自动化脚本。

Docker安装

请参考官方网站或博客,建议使用Linux安装。

Docker镜像

类似于pip,apt等包管理工具,docker可以拉取docker hub上的镜像,格式大概为:仓库名/镜像名:版本号。其中版本号lastet或者省略代表最新版。

1
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

例如拉取ubuntu的镜像:

1
docker pull ubuntu:18.04

拉取python镜像:

1
docker pull python:3.10.0

值得注意的是,国内直接访问docker hub速度较慢,容易导致拉取失败,同样的情况也会发生在使用Dockerfile自动化部署的过程中。因此最好配置国内镜像源。

国内镜像源:

名称url
中国官方镜像https://registry.docker-cn.com
网易163镜像http://hub-mirror.c.163.com
中科大镜像https://docker.mirrors.ustc.edu.cn
阿里云镜像
https://[xxx].mirror.aliyuncs.com
DaoCloud镜像http://[xxx].m.daocloud.io
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vi /etc/docker/daemon.json

# 内容如下:
{
"registry-mirrors": [
"https://xx4bwyg2.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}{}

# 退出并保存
:wq

# 使配置生效
systemctl daemon-reload

# 重启Docker
systemctl restart docker

运行容器

1
docker run -it 镜像名 COMMAND

常用命令

查看所有镜像:

1
docker images

查看所有容器:

1
docker ps -a

启动/停止/重启/删除容器

1
docker start/stop/restart/rm CONTAINER_ID

后台启动容器(添加-d参数):

1
docker run -itd --name ubuntu-test ubuntu /bin/bash

执行容器命令(不推荐使用attach,因为从这个容器退出,会导致容器的停止。):

1
docker exec -it CONTAINER_ID /bin/bash

启动时,添加-p参数可以映射容器到主机的网络端口。例如 -p 80:8000,就是将容器里的8000端口映射到80端口。

另外还有-v参数,可以映射容器内的路径到主机的路径。

其他使用方法可以自行google。

当我们需要一次性快速部署多个容器时,就需要用到docker compose了。这里不展开。

2021-11-22
Contents

⬆︎TOP