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 | vi /etc/docker/daemon.json |
运行容器
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了。这里不展开。