一、初识 Docker
1. 什么是 Docker
(1) 项目部署存在的问题:
大型项目组件较多,运行环境也较为复杂,
部署时会碰到一些问题:
① 依赖关系复杂,容易出现兼容性问题
② 开发、测试、生产环境有差异
1) Docker 解决依赖的兼容问题:
① 将应用的 Libs (函数库)、Deps (依赖)、
配置与应用一起打包
② 将每个应用放到一个隔离容器去运行,
避免互相干扰
2) Docker 解决不同环境操作系统不同的
问题:
操作系统可分为三层,系统应用、内核
还有计算机硬件
其中内核与硬件交互,提供操作硬件的
指令,系统应用封装内核指令为函数,
便于程序员调用,用户程序基于系统函
数库实现功能
Ubuntu 和 CentOS 都是基于 Linux 内核,
只是系统应用不同,提供的函数库有差异
解决方式:
① Docker 将用户程序与所需要调用的系
统 (比如Ubuntu) 函数库一起打包
② Docker 运行到不同操作系统时,直接
基于打包的库函数,借助于操作系统的
Linux 内核来运行
(2) Docker 解决大型项目
解决大型项目依赖关系复杂,不同组件依赖
的兼容性问题:
① Docker 允许开发中将应用、依赖、函
数库、配置一起打包,形成可移植镜像
② Docker 应用运行在容器中,使用沙箱
机制,相互隔离
解决开发、测试、生产环境有差异的问题:
Docker 镜像中包含完整运行环境,包括
系统函数库,仅依赖系统的 Linux 内核,
因此可以在任意 Linux 操作系统上运行
(3) 总结
Docker 是一个快速交付应用、运行应用的
技术:
① 可以将程序及其依赖、运行环境一起
打包为一个镜像,可以迁移到任意
Linux操作系统
② 运行时利用沙箱机制形成隔离容器,
各个应用互不干扰
③ 启动、移除都可以通过一行命令完成,
方便快捷
2. Docker 和虚拟机的区别
虚拟机 (virtual machine) 是在操作系统
中模拟硬件设备,然后运行另一个操作
系统,比如在 Windows 系统里面运行
Ubuntu 系统,这样就可以运行任意的
Ubuntu 应用了
① docker 是一个系统进程;
虚拟机是在操作系统中的操作系统
② docker 体积小、启动速度快、性能好;
虚拟机体积大、启动速度慢、性能一般
特性 | Docker | 虚拟机 |
---|---|---|
性能 | 接近原生 | 性能较差 |
硬盘占用 | 一般为 MB | 一般为 GB |
启动 | 秒级 | 分钟级 |
3. Docker架构
(1) 镜像和容器
镜像 (Image):Docker 将应用程序及其
所需的依赖、函数库、环境、配置等文
件打包在一起,称为镜像
容器 (Container):镜像中的应用程序运
行后形成的进程就是容器,只是 Docker
会给容器做隔离,对外不可见
(2) Docker 和 DockerHub
DockerHub:DockerHub 是一个 Docker
镜像的托管平台,这样的平台称为 Docker
Registry
国内也有类似于 DockerHub 的公开服务,
比如 网易云镜像服务、阿里云镜像库等
(3) Docker 架构
Docker 是一个CS架构的程序,由两部分组成:
服务端(server):Docker 守护进程,负责处
理 Docker 指令,管理镜像、容器等
客户端(client):通过命令或 RestAPI 向
Docker 服务端发送指令,可以在本
地或远程向服务端发送指令
4. 安装 Docker
二、Docker 的基本操作
1. 镜像操作
镜像名称一般分两部分组成:
[repository]:[tag]
例如:mysql:5.7
在没有指定 tag 时,默认是 latest,代表
最新版本的镜像
① docker images:查看镜像
② docker rmi:删除镜像
③ docker pull:从服务器拉取镜像
④ docker push:推送镜像到服务器
⑤ docker save:保存镜像为压缩包
⑥ docker load:加载压缩包为镜像
⑦ docker build:构建镜像
(2) 案例:从 DockerHub 中拉取一个 nginx
镜像并查看
输入命令拉取:docker pull ngnix
通过命令:docker images 查看拉取到的镜像
2. 容器操作
docker ps:查看所有运行的容器及状态
docker logs:查看容器运行日志
docker exec:进入容器执行命令
docker rm:删除指定容器
(2) 案例:创建运行一个 Nginx 容器
去 docker hub 查看 Nginx 的容器运行命令
docker run --name containerName -p 80:80 -d nginx
命令解读:
docker run :创建并运行一个容器
--name : 给容器起一个名字
-p :将宿主机端口与容器端口映射
-d:后台运行容器
nginx:镜像名称,例如nginx
3.数据卷 (容器数据管理)
(1) 容器与数据耦合的问题:
① 不便于修改
当我们要修改 Nginx 的 html 内容时,
需要进入容器内部修改,很不方便
② 数据不可复用
在容器内的修改对外是不可见的,所
有修改对新创建的容器是不可复用的
③ 升级维护困难
数据在容器内,如果要升级容器必然
删除旧容器,所有数据都跟着删除了
数据卷(volume)是一个虚拟目录,指向
宿主机文件系统中的某个目录
(2) 数据卷的作用:
将容器与数据分离,解耦合,方便操作
容器内数据,保证数据安全
(3) 数据卷操作:
docker volume create:创建数据卷
docker volume ls:查看所有数据
docker volume inspect:查看数据卷详
细信息卷
docker volume rm:删除一个或多个数
据卷
docker volume prune:删除未使用数据
卷
(4) 挂载数据卷
我们在创建容器时,可以通过 -v 参数
来挂载一个数据卷到某个容器目录
1) docker run 的命令中通过 -v 参数挂载
文件或目录到容器中:
① -v volume名称 : 容器内目录
② -v 宿主机文件 : 容器内文件
③ -v 宿主机目录 : 容器内目录
2) 数据卷挂载与目录直接挂载的区别
① 数据卷挂载耦合度低,由 docker 来
管理目录,但是目录较深,不好找
② 目录挂载耦合度高,需要我们自己管
理目录,不过目录容易寻找查看
三、Dockerfile 自定义镜像
很多时候需要自己构建镜像,构建镜像需
要写 Dockerfile
1. 镜像结构
镜像是分层结构,每一层称为一个 Layer
① 底层是系统函数库(例如 Ubuntu),这一
层也叫做基础镜像(BaseImage),相当于
地基
② 在地基上添加安装包,添加安装包、配
置、依赖等,每次形成新的一层
③ 最后需要提供一个入口(Entrypoint),也
就是程序启动的脚本和参数
2. Dockerfile 语法
Dockerfile 是一个文本文件,没有后缀,
其中包含一些指令(Instruction),每一个
指令就是一层
常用指令:
① Dockerfile 的第一行必须是 FROM,
从一个基础镜像来构建
② 基础镜像可以是基本操作系统,如
Ubuntu,也可以是其他人制作好的
镜像,例如:java:8-alpine
③ 写好 Dockerfile 后使用 docker build
命令构建镜像
四、Docker-Compose
1. 初识 Docker Compose
① Docker Compose 可以基于 Compose
文件帮我们快速的部署分布式应用,而
无需手动一个个创建和运行容器!
② Compose 文件是一个文本文件,通过
指令定义集群中的每个容器如何运行
version: "3.8"
services:
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "/tmp/mysql/data:/var/lib/mysql"
- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
web:
build: .
ports:
- "8090:8090"
2. 安装步骤
# 下载docker-compose
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 添加执行权限
chmod +x /usr/local/bin/docker-compose
# 下载自动补全
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
3. 基本命令
# 后台启动当前项目 也可以指定服务
docker-compose up -d
# 查看项目容器
docker-compose ps
# 停止容器运行 可以指定服务
docker-compose stop
# 停止并删除容器 可以加参数来删除镜像、数据卷等
docker-compose down
# 持续查看日志
docker-compose logs -f
# 构建或重新构建镜像 可以指定服务
docker-compose build
五、Docker 镜像仓库
镜像仓库(Docker Registry)有公共的和
私有的两种形式,企业自己的镜像最好
是采用私有 Docker Registry 来实现
1. 搭建私有镜像仓库
① 准备好 docker-compose.yml:
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 5000:80
environment:
- REGISTRY_TITLE=docker私服
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
② 设置信任地址
私服采用的是 http 协议,默认不被 Docker
信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://yourip:port"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
③ 启动
docker-compose up -d
④ 访问 ip + 端口登录
2. 向镜像仓库推送镜像
① 上传镜像
重新 tag 本地镜像,名称前缀为私有仓库
的地址:192.168.150.101:8080/
docker tag nginx:latest 192.168.150.101:8080/nginx:1.0
② 推送镜像
docker push 192.168.150.101:8080/nginx:1.0
③ 从镜像仓库拉取镜像
docker pull 192.168.150.101:8080/nginx:1.0
总结:
① 推送本地镜像到仓库前都必须重命名
(docker tag)镜像,以镜像仓库地址为
前缀
② 镜像仓库推送前需要把仓库地址配置
到 docker 服务的 daemon.json 文件
中,被 docker 信任
③ 推送使用 docker push 命令
④ 拉取使用 docker pull 命令