一、安装
在ubuntu 18.04上安装docker非常简单,运行sudo snap install docker即可。
二、核心组件
1. docker engine: 运行在runtime(runc)之上,包括daemon和cli。
daemon用systemctl来管理(如: systemctl start docker.service),平时在终端输入的docker指令属于cli。
由于是用snap安装的,所以需要通过systemctl status snap.docker.dockerd.service来查看daemon的状态。
cli指令:
docker pull: 从registry下载镜像(image)。
docker run: 通过镜像启动容器(container),如果本地没有镜像则先下载。
docker ps / docker container ls: 两者均是显示正在运行的容器。
docker images: 显示本地镜像。
2. docker image: 只读模板。
3. docker container: image的运行实例。
4. registry: 存放image的仓库。
三、理解image镜像
从以上的信息判断,docker cli指令可以在使用时查看手册学习,先格物docker image对于致知docker有很大的帮助。
1. 使用最小的hello-world镜像运行容器
docker run hello-world
可以看到会输出Hello from Docker!...的信息
2. 学习dockerfile
由于image是通过dockerfile创建的,我们先看一下linux中hello-world的dockerfile。(在https://hub.docker.com/_/hello-world/可以找到链接)
PS: URL地址中的nanoserver是windows上的。
FROM scratch COPY hello / CMD ["/hello"]
1) FROM scratch
此镜像从零开始构建。
2) COPY hello /
将文件hello复制到镜像的根目录。
3) CMD ["/hello"]
容器启动时,执行/hello。
从零开始构建镜像达到发布程序的目的,对于现在的我来说无法想象。
我希望有一个基本的操作系统环境,在此之上安装配置一些软件,打包一些库和发布程序即可。这种镜像一般被称作base镜像。
四、base镜像
1. base镜像含义
1)不依赖其他镜像,从scratch构建;2)其他镜像可以以之为基础进行扩展。
一般能称作base镜像的通常都是各种Linux发行版的镜像,如:ubuntu、debian、centos等。
2. rootfs
官方发行的base镜像只有几十M到几百M,因为对于base镜像来说底层可以直接用Host的kernel,自己只需提供rootfs即可。
centos7的dockerfile:
FROM scratch ADD centos-7-docker.tar.xz / LABEL org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20180804" CMD ["/bin/bash"]
第二行ADD指令会自动解压。centos-7-docker.tar.xz中包含/dev、/proc、/bin等目录。
LABEL用于给镜像添加信息,使用docker inspect可以查看这些相关信息。
3. kernel
base镜像只是在用户空间与发行版一致,kernel版本与发行版不同。
通过base镜像启动容器后,容器使用kernel为Host的kernel。所以若对kernel版本有要求,则不建议使用docker。