一、Docker 是什么?
引用官网给出的解释:Docker 是一个用于开发、发布和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分离,以便您可以快速交付软件。使用 Docker,您可以像管理应用程序一样管理基础设施。通过利用 Docker 快速交付、测试和部署代码的方法,您可以显著减少编写代码和在生产环境中运行之间的延迟,个人的理解直白一点,docker更像一个大集装箱,里边装着各种小箱子,而这个小箱子就是一个应用程序。
二、为什么要使用 Docker ?
- 可以使用镜像快速构建一套标准的开发环境,快速部署代码;
- 高效的资源利用,可以实现更高的性能,同时对资源的额外需求很低;
- 兼容性高,让用户可以在不同平台间轻松地迁移应用;
- 可以实现自动化且高效的容器管理。
三、Docker架构
Docker 使用客户端-服务器架构。Docker 客户端与 Docker 守护进程对话,后者负责构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护程序可以在同一系统上运行,或者您可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护程序使用 REST API,通过 UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许您使用由一组容器组成的应用程序。
- Docker 守护进程
Docker 守护程序 (dockerd) 侦听 Docker API 请求并管理 Docker 对象,例如镜像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。
- Docker 客户端
Docker 客户端 ( docker)是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如 docker run 之类的命令时,客户端会将这些命令发送到 dockerd执行它们。该docker命令使用 Docker API。Docker 客户端可以与多个守护进程通信。
- Docker 桌面
Docker Desktop 是一个易于安装的应用程序,适用于您的 Mac 或 Windows 环境,使您能够构建和共享容器化应用程序和微服务。
Docker Desktop 包括Docker 守护程序(dockerd)、Docker 客户(docker)、Docker Compose、Docker Content Trust、Kubernetes和Credential Helper。有关更多信息,请参阅Docker桌面(https://docs.docker.com/desktop/)。
- Docker 注册表
Docker 注册表存储 Docker 镜像。Docker Hub 是一个任何人都可以使用的公共注册表,并且 Docker 默认配置为在 Docker Hub 上查找镜像。您甚至可以运行自己的私有注册表。
当您使用 docker pullordocker run 命令时,将从您配置的注册表中提取所需的镜像。当您使用该 docker push 命令时,您的镜像会被推送到您配置的注册表中。
- Docker 对象
当您使用 Docker 时,您正在创建和使用镜像、容器、网络、卷、插件和其他对象。本节简要概述了其中一些对象。
- 镜像
镜像是一个只读模板,其中包含创建 Docker 容器的说明。通常,一个镜像基于另一个镜像,并带有一些额外的自定义。例如,您可以基于该镜像构建一个镜像 ubuntu ,安装 Apache Web 服务器和您的应用程序,以及使您的应用程序运行所需的配置详细信息。
您可以创建自己的镜像,也可以只使用其他人创建并在注册表中发布的镜像。要构建您自己的镜像,您需要使用简单的语法创建一个Dockerfile,用于定义创建和运行镜像所需的步骤。Dockerfile 中的每条指令都会在镜像中创建一个层。当您更改 Dockerfile 并重建镜像时,仅重建那些已更改的层。与其他虚拟化技术相比,这是使镜像如此轻量、小巧和快速的部分原因。
- 容器
容器是镜像的可运行实例。您可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。您可以将容器连接到一个或多个网络,将存储附加到它,甚至可以根据其当前状态创建新镜像。
默认情况下,一个容器与其他容器及其主机的隔离相对较好。您可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。
容器由其镜像以及您在创建或启动它时提供给它的任何配置选项定义。当容器被移除时,任何未存储在持久存储中的状态更改都会消失。
四、Docker的安装使用
4.1 以 linux/macO 环境为例:
yum install docker
验证是否安装成功 docker version
其他安装方式:可使用图形界面安装
Docker 镜像加速设置
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
科大镜像:
https://docker.mirrors.ustc.edu.cn/
网易:https://hub-mirror.c.163.com/
阿里云 :
https://< 你 的 ID>.mirror.aliyuncs.com
七牛云加速器:https://reg-mirror.qiniu.com
vim /etc/docker/daemon.jso
添加下面代码
{
"registry-mirrors": ["https://c6jvvira.mirror.aliyuncs.com"],
"live-restore": true
}
4.2 docker 使用
想必看到这里您一定想部署⼀个自己开发的应用,在后文会教会您如何将程序发布开发环境,生产环境,以及将本地服务打包成镜像,在任意 docker 环境中运行您的服务。
- 发布开发环境
将jar服务打包成镜像,运行,这种方式适用于生产环境,而开发环境存在频繁发布,所以使用docker-compose(https://docs.docker.com/compose/)
插件可以省去中间打包环节,docker-compose也可以同时部署多个应用,docker-compose安装
sudo pip install docker-compose
开始部署第一步创建 Dockerfile 并将 demo.jar 放至和 Dockerfile 同一目录下,本示例目录为 stock
FROM java:8run mkdir -p /app/democopy /stock/ /app/demo/WORKDIR /app/demoENTRYPOINT ["java","-Dfile.encoding=utf-8","-Duser.timezone=GMT+08","-Dspring.config.location=/app/
其次编写 docker-compose.yml 文件 (文件名不为该文件名运行时需要指定文件名)
version: '3'
services:
stock_lk:
build
context: .
dockerfile: stock/Dockerfile
working_dir: /app/demo
ports
- "8088:8083"
volumes:
#同步宿主机时区⾄容器
-/usr/share/zoneinfo/Asia/:/usr/share/zoneinfo/Asia/
environment:
-TZ=Asia/Shanghai
#虚拟机中⽂显示
-LANG=C.UTF-8
container_name: stock_lk
links:
-mysql_lk
restart: always
networks:
-mynet
#mysql
mysql_lk:
container_name: mysql_lk
image: mysql:latest
ports:
- "3306:3306"
expose:
- 3306
volumes:
#是将宿主机该⽬录下内容挂在到容器⽬录下
- /usr/share/zoneinfo/Asia/:/usr/share/zoneinfo/Asia/
- /Users/vampire/appdir/docker_datas/mysql:/var/lib/mysql
environment:
- TZ=Asia/Shanghai
#虚拟机中⽂显示
- LANG=C.UTF-8
- MYSQL_ROOT_PASSWORD=xxx@123
- MYSQL_ROOT_HOST=%
- MYSQL_DATABASE=stock_db
restart: always
command: --default-authentication-plugin=mysql_native_password
networks:
- mynet
networks:
mynet:
driver: bridge
目录结构如下
执 ⾏ 命 令 docker-compose -f docker-compose-stock.yml up -d
执行结果如下显示 demo 和 mysql 以运行
当jar包有变动时docker restart CONTAINER ID 则可重新部署
停 ⽌ 命 令 docker-compose -f docker-compose-stock.yml down
- 发布生产环境
创建本地镜像 docker build -t vampire11/demo:v3 .
查看本地镜像 docker images
发现镜像版本v3创建成功。
启动
docker run -d -p 8083:8083 --name demo vampire11/demo:v3
查看运行的容器
docker ps不进⼊容器查看⽇志docker logs CONTAINER ID进⼊容器docker exec -it CONTAINER ID
一般情况 docker 服务部署在云服务容器或远程服务器中,所以需要将本地镜像上传至私服
docker push vampire11/demo:v3
然后在远程docker环境中拉取镜像
docker pull vampire11/demo:v3
此处附上 Docker 命令:
容器生命周期管理
run:创建⼀个新的容器并运行一个命令
start/stop/restart:启动一个或多个已经被停止的容器/停止一个运行中的容器/重启容器
kill:杀掉⼀个运行中的容器
rm:删除一个或多个容器
pause/unpause:暂停容器中所有的进程/恢复容器中所有的进程
create:创建⼀个新的容器但不启动它
exec:在运行的容器中执行命令
容器操作
ps:列出容器
inspect:获取容器/镜像的元数据
top:查看容器中运行的进程信息,支持 ps 命令参数
attach:连接到正在运行中的容器
events:从服务器获取实时事件
logs:获取容器的日志
wait:阻塞运行直到容器停止,然后打印出它的退出代码
export:将文件系统作为⼀个tar归档文件导出到STDOUT
port:列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口
stats:显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等
容器 rootfs 命令
commit:从容器创建一个新的镜像
cp:用于容器与主机之间的数据拷贝
diff:检查容器里文件结构的更改
镜像仓库
login:登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
pull:从镜像仓库中拉取或者更新指定镜像
push:将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
search:从Docker Hub查找镜像
本地镜像管理
images:列出本地镜像
rmi:删除本地一个或多个镜像
tag:标记本地镜像,将其归入某一仓库
build:命令用于使用 Dockerfile 创建镜像
history:查看指定镜像的创建历史
save:将指定镜像保存成 tar 归档文件
load:导入使用docker save(https://www.runoob.com/docker/docker-save-command.html)命令导出的镜像
import:从归档文件中创建镜像
info|version
info:显示 Docker 系统信息,包括镜像和容器数
version:显示 Docker 版本信息