8. Docker
8.1 Docker基础
Docker:一个快速交付应用、运行应用的技术



虚拟机体量较大但功能更强,而Docker更着重于只运行需要的部分.
Docker是一个系统进程,虚拟机是在操作系统中的操作系统.
8.2 Docker架构

Docker和DockerHub

Docker架构

8.3 linux安装docker
1.清理原有docker文件
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
2.安装yum-utils工具包
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
3.更新本地镜像源
#设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
注意CentOS 8的话最后一条指令需要去掉fast,即yum makecache
创建元数据缓存
4.安装docker-ce版(免费社区版)
yum install -y docker-ce
8.4 Docker基本操作
镜像相关命令
- 镜像名称一般由两部分组成:[repository]:[tag] eg.mysql:5.7
- 没有指定tag则默认使用最新版本

DockerHub官网

docker run 和docker exec区别
都是运行一个容器实例,但是docker exec可以进入容器
8.5 容器数据卷
为什么需要数据卷?
主要是为了解决容器和数据耦合的问题。数据位于容器内部不便于修改数据,需要进入容器内;且在容器内的修改对外不可见,新容器不可复用;此外若容器升级维护则需要删除旧容器,数据也会跟着被删除.
数据卷是一个虚拟目录,指向宿主机文件系统的某个目录.

docker数据卷基本指令
数据卷的指令是二级指令,使用docker volume --help
查看相关使用方式

使用docker volume create
指令创建数据卷后查看其具体信息

挂载数据卷

docker run --help
指令查看

示例:挂载nginx的html目录到宿主机
- 使用
-v
指令将nginx容器的/usr/share/nginx/html
文件挂载到宿主机的html文件夹

- 使用
docker inspect
指令查看挂载到宿主机的文件夹html,发现默认挂载到了宿主机的/var/lib/docker/volumes/html/_data
路径下

- 进入目录,查看具体内容
- 好处:直接修改宿主机的文件即可,需不要进入容器中修改,如下


补充:

不使用数据卷直接挂载
注意
是否使用数据卷进行挂载的区别在于:
- 使用数据卷由docker全自动映射到宿主机目录;不使用数据卷则需要自己手动映射
- 使用数据卷不方便查找映射到了那个宿主机目录;不使用数据卷因为是自己定义的目录,所以更个性化和明晰
- 根据需要自由选择
8.6 Docker File自定义镜像
镜像结构
镜像结构:镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成.

镜像采用分层结构的好处是:升级时只需修改一部分涉及到的层,其他层不用再重新修改和配置.

自定义镜像
Dockerfile:Dockerfile就是一个文本文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。官方文档

案例

- 新建文件夹
- 文件传输后
- DockerFile
- build镜像
- 创建成功
- 启动和查看
利用已有半成品制作dockerfile:

使用新的dockerfile覆盖原dockerfile,然后重新build新的镜像:

可以发现新的docker images比原来小很多,盲猜原因是web1.0基于整个ubuntu基础镜像来构建,而web2.0使用别人发布的java:8-alpine已经优化过,更轻量。

不同docker容器使用相同端口时,需要将其映射到不同的宿主机端口:

之后可以分别通过8090和8091访问两个容器。
Docker Compose
问题:微服务集群内容过多,手动依次部署太麻烦
解决:docker compose可以基于compose文件快速部署分布式应用,无需手动一个个创建和运行容器

安装docker-compose后可以配置一下docker-copmose的自动补全,以后使用docker-compose会有命令提示

如果修改hosts之后还是不行,可以先关闭docker。