Docker 简易入门
简介
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
用途
Dockers 的主要用途,目前有三大类:
- 提供一次性的环境。 比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
- 提供弹性的云服务。 因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
- 组建微服务架构。 通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
核心组件
概念图
镜像 (Image)
类似虚拟机镜像。
Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。
# 列出本机的所有 image 文件。
$ docker image ls
# 删除 image 文件
$ docker image rm [imageName]
仓库 (Registry)
仓库是集中存放镜像的地方。仓库又分为公有仓库(DockerHub)和私有仓库
Registry 上有很多 Repository,比如 Ubuntu、Redis、Tomcat 等,共同组成了 Registry。
容器 (Container)
类似 Linux 系统环境,运行和隔离应用。容器从镜像启动的时候,docker 会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变(除非你 commit 了镜像)。
image 文件生成的容器实例,本身也是一个文件,称为容器文件。 也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。
# 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all
Dockerfile
它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。
基本操作和命令
镜像 (image)
搜索 (search)
docker search <image> # 在docker index中搜索image
--automated=false # 仅显示自动创建的镜像
--no-trunc=false # 输出信息不截断显示
-s 0 # 指定仅显示评价为指定星级的镜像
docker search
截至目前(2020 年 12 月 10 日)暂不支持查看镜像的 Tag,可以用 脚本 实现
下载 (pull)
docker pull <image> # 从docker registry server 中拉取image
docker pull [:TAG] # 还可通过指定标签下载某镜像
docker pull centos:latest
docker pull centos:centos8.3.2011
docker pull pytorch/pytorch:1.7.0-cuda11.0-cudnn8-devel
查看
docker images # 列出镜像
docker images -a # 列出所有的镜像(包含历史)
删除
docker rmi <image ID>/<image name> # 通过镜像ID或者名字删除
docker rmi <image ID1> <image ID2> # 删除多个镜像
上传
# 用户在dockerhub网站注册后,即可上传自制的镜像。
docker push NAME[:TAG]
存储
# 存出本地镜像文件为.tar
docker save -o ubuntu_21.04.tar ubuntu:21.04
docker save > nginx.tar nginx:latest
# 其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)
载入
docker load --input ubuntu_21.04.tar
docker load < ubuntu_21.04.tar
关于 [[#存储|save]] 和 [[#载入|load]]l 与 [[#导出|export]] 和 [[#导入|import]] 的区别参见 这里
容器 (container)
容器是镜像的一个运行实例,不同的是它带有额外的可写层。
可认为 docker 容器就是独立运行的一个或一组应用,以及它们所运行的必需环境。
创建 (运行)
使用镜像来创建 (运行) 一个容器实例,首先得查看镜像的 REPOSITORY 和 TAG,docker run -i -t REPOSITORY:TAG
(等价于先执行 docker create
再执行 docker start
命令),如下图所示:
其中 -t
选项让 docker 分配一个伪终端并绑定到容器的标准输入上, -i
则让容器的标准输入保持打开。若要在后台以守护态(daemonized)形式运行,可加参数 -d
在执行 docker run
来创建并启动容器时,后台运行的标准包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
- 从宿主机配置的网桥接口中桥接一个虚拟接口到容器
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
docker start/stop/restart <container ID/name> #:开启/停止/重启容器
进入
docker exec -it <container ID/name> /bin/bash
删除
docker rm <container ID1/name1> <container ID2/name2> #:删除一个或多个容器
docker rm `docker ps -a -q` # 删除所有的容器
docker ps -a -q | xargs docker rm # 同上, 删除所有的容器
docker -rm
-f # 强制中止运行的容器
-l # 删除容器的连接,但保留容器
-v # 删除容器挂载的数据卷
修改
docker commit <container> [repo:tag] # 将一个容器固化为一个新的镜像,后面的repo:tag可选。
导出
docker export container_id > test.tar
导入
cat test.tar | sudo docker import - ubuntu:latest
仓库 (Registry)
仓库分为公共仓库和私有仓库。
关于私有仓库的搭建,可以参考 这里