Ⅰ、Docker 概念
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
Ⅰ-Ⅰ、Docker 关键字
C\S 架构
一次编译到处运行
Go 语言
镜像分层构建
Ⅰ-Ⅱ、Docker 镜像
镜像存储位置:/var/lib/docker/overlay2
镜像挂载方式:overlay2(当前最新版本18.09.6),之前还有版本采用aufs
镜像是分层构建的,每一层是上面一层的基础:构建镜像的时候我们要保证每一层都只包含我们的应用需要的东西,不要有包含不需要的文件
Ⅰ-Ⅲ、 Docker 容器
承载进程的拥有独立的文件系统,独立网络等资源的独立命名空间
容器和虚拟机的区别:
传统虚拟机是虚拟出一套硬件后在其上运行一整套操作系统,再在该操作系统上运行应用进程;而容器的进程是直接运行于宿主的内核,容器没有自己的内核,也没有进行硬件虚拟。
Ⅰ-Ⅳ、Docker 仓库
一个集中存储和分发镜像的服务,你可以建立自己的私有仓库,也可以使用共有仓库,比如 Docker Hub。
Ⅱ、优势
- 高效的利用系统资源:由于容器直接运行于宿主内核,不需要虚拟硬件,运行操作系统等开销。
- 快速的启动时间:可以做到秒级甚至是毫秒级启动
- 一致的运行环境,轻松迁移:docker镜像提供了除内核外完整的运行时环境
- 持续交付和部署:dockerfile使镜像构建透明化
- 维护和扩展:Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。
Ⅲ、Docker 安装(阿里云ECS)
# 1. 更新软件源
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# 2. 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 3. 验证 key fingerprint(符合该序列:【9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88】):
sudo apt-key fingerprint 0EBFCD88
# 4. 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 5. 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
Ⅳ、Docker基础操作
Ⅳ-Ⅰ、镜像
- 从远程仓库拉取镜像
docker pull ubuntu:16.04
- 查看镜像
docker images
- 删除镜像
docker image rm []
docker rmi []
Ⅳ-Ⅱ、容器
- 以交互的方式启动容器
docker run -ti -p 8080:8080 --name first bash
-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端,-p容器端口映射到宿主机端口
- 以交互的方式进入容器
docker exec -it [容器ID] bash
- 查看容器
docker container ls
docker ps
- 查看容器详情
docker inspect [ID]
- 提交容器为一个新镜像
docker commit [容器名] [镜像名]:[版本号]
- 删除容器
docker rm [容器名]
Ⅴ、Docker数据管理
Ⅴ-Ⅰ、 数据卷
- 挂载容器内数据卷:
docker run -ti --name volume1 -v /test_dir ubuntu:16.04 bash
- 挂载宿主机内目录为数据卷:
docker run -ti --name volume2 -v /temp:/test:ro ubuntu:16.04 bash
删除容器时要删除掉相应的数据卷,不然会比较麻烦:docker rm test -v test_dir