Docker入门介绍
和Docker如何结缘
之前对 Docker 完全不熟悉, 偶尔听说但却是和 大数据 结合在一起, 所以一直感觉我用不到这门技术,
但是在我最近做项目的时候, 我却正在思考:
- 每次在开发项目或者需要在服务器上进行测试的时候, 我都需要花差不多一天的时间来安装项目运行依赖环境
- 每次项目在本地测试没问题, 但是正式上线的时候却总是出现问题
问题虽然不大, 但是很烦人。
所以在机缘巧合下接触到了 Docker,开始了学习 Docker 的旅程
什么是Docker
如果连Docker是什么, 那还怎么玩
官方是这样介绍 Docker:
Docker:高速创新的现代平台。唯一使组织能够无缝构建,共享和运行从混合云到边缘的任何地方的任何应用程序的独立容器平台。
Docker是一个容器引擎, 我们可以通过这个容器引擎将我们的应用和依赖移植到任意的机器中, 保证我们的应用不会受到外部环境的影响, 同时简化工作,
先介绍三个概念
- 镜像
Docker中的镜像是一个特殊的文件系统, 我们可以理解为linux系统在运行时挂载的root文件系统
分层架构
因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成
- 容器
容器是Docker运行的实例, Docker可以基于镜像启动一个或多个容器
- 仓库
仓库是集中存储,管理镜像的服务
为什么要使用Docker
-
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
-
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
-
一致的运行环境
-
持续交付和部署
-
更轻松的迁移
Docker安装
不耍流氓, 先说明系统环境
CentOS 7
yum 安装方式
- 卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
yum方式安装
yum配置
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
- 添加国内源
yum-config-manager \
--add-repo \
https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
- 安装
yum makecache fast
yum install docker-ce
脚本快速安装
Docker为了简化安装流程, 提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:
curl -fsSL get.docker.com -o get-docker.sh # 下载shell文件
sh get-docker.sh --mirror Aliyun # 选择源安装
安装完成后会提示将当前用户添加到
docker中 执行
sudo usermod -aG docker $USER
启动
systemctl enable docker
systemctl start docker
验证安装
- 查看安装的docker的版本
> docker --version
Docker version 19.03.5, build 633a0ea
安装过程中遇到的问题
INFO[2019-11-22T10:47:08.360524734+08:00] Starting up
INFO[2019-11-22T10:47:08.361649515+08:00] parsed scheme: "unix" module=grpc
INFO[2019-11-22T10:47:08.361661797+08:00] scheme "unix" not registered, fallback to default scheme module=grpc
INFO[2019-11-22T10:47:08.361675443+08:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0 <nil>}] <nil>} module=grpc
INFO[2019-11-22T10:47:08.361681001+08:00] ClientConn switching balancer to "pick_first" module=grpc
INFO[2019-11-22T10:47:08.363404222+08:00] parsed scheme: "unix" module=grpc
INFO[2019-11-22T10:47:08.363418998+08:00] scheme "unix" not registered, fallback to default scheme module=grpc
INFO[2019-11-22T10:47:08.363428711+08:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0 <nil>}] <nil>} module=grpc
INFO[2019-11-22T10:47:08.363433222+08:00] ClientConn switching balancer to "pick_first" module=grpc
WARN[2019-11-22T10:47:08.373120474+08:00] Usage of loopback devices is strongly discouraged for production use. Please use `--storage-opt dm.thinpooldev` or use `man dockerd` to refer to dm.thinpooldev section. storage-driver=devicemapper
INFO[2019-11-22T10:47:08.493177970+08:00] Creating filesystem xfs on device docker-253:1-419626-base, mkfs args: [-m crc=0,finobt=0 /dev/mapper/docker-253:1-419626-base] storage-driver=devicemapper
INFO[2019-11-22T10:47:08.493822876+08:00] Error while creating filesystem xfs on device docker-253:1-419626-base: exit status 1 storage-driver=devicemapper
ERRO[2019-11-22T10:47:08.493835951+08:00] [graphdriver] prior storage driver devicemapper failed: exit status 1
failed to start daemon: error initializing graphdriver: exit status 1
解决方式: yum update xfsprogs
更加方便的安装过程
将以上步骤写到一个shell文件中, 只要执行shell文件就可以完成安装, 不怕缺少步骤。
#!/bin/bash
yum update xfsprogs
echo "卸载旧版本"
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
echo "安装docker"
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
sudo usermod -aG docker $USER
echo "启动docker"
systemctl enable docker
systemctl start docker
docker命令
安装完成后,当然是迫不及待的来试验下docker的魅力啦
先来看几个简单的命令
查看镜像
> docker image ls -a

介绍:
- REPOSITORY: 镜像的名称
- TAG: 镜像的标志。 latest表示为最新
- IMAGE ID: 编号
- CREATED: 镜像创建的时间
- SIZE: 大小。 可以看到镜像是非常小的
下拉镜像
> docker pull 镜像名称:tag
镜像加速
由于pull的源是在国外, 所以在下载速度上很慢, 需要配置国内的源
> vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://rkuk0y9d.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
}
> sudo systemctl daemon-reload
> sudo systemctl restart docker
我采用的是国内源,快了不是一点点 同时设置docker 日志大小的上限
查看容器
> docker container ls -a

解释:
-a: 列出所有的容器, 包括没有启动的
简单启动
> docker run -d -p 180:80 --name nginx nginx:latest
解释:
-d: 在后台运行
-p: 映射端口 180:宿主机端口 80: 镜像中nginx启动的端口
--name: 启动后容器的名称
nginx:latest: 这是镜像的名称和标志, 最新版可以省略latest
启动后通过 http://ip:180 访问
删除容器
> docker container rm -f 容器名称/容器ID
解释:
-f: 容器启动中, 强制删除
删除镜像
> docker image rm 镜像名称/镜像ID