Docker的构成
-
Docker仓库:https://hub.docker.com
-
Docker自身组件
Docker Client:Docker的客户端
Docker Server:Docker daemon的主要组成部分,接受用户通过Docker Client发出的请求,并按照相应的路由规则实现路由分发
Docker镜像:Docker镜像运行之后变成容器(docker run)
Docker的基本组成
- 镜像
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。 - 容器
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。 - 仓库
仓库(Repository)是集中存放镜像文件的场所。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等。
docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
镜像的特性
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作"容器层","容器层"之下的都叫"镜像层"。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
docker基础命令
systemctl start docker | 启动docker |
systemctl stop docker | 停止docker |
systemctl restart docker | 重启docker |
systemctl status docker | 查看docker状态 |
systemctl enable docker | 开机启动 |
docker info | 守护进程的系统资源设置 |
docker search 镜像名称 | docker仓库的查询 |
docker pull 镜像名称 | 下载docker仓库 |
docker images | docker镜像的查询 |
docker rmi 镜像名称id | docker镜像的删除 |
docker ps | 容器的查询 |
docker run 镜像名称+版本号 | (docker run mysql:8.0.29)容器的创建启动 |
docker start/stop | 容器启动停止 |
systemctl 是管理 Linux 的 systemd 服务的工具,systemctl 只能用于linux系统。
run命令扩展
单一容器管理
每个容器被创建后,都会分配一个CONTAINER ID作为容器的唯一标示,后续对容器的启动、停止、修改、删除等所有操作,都是通过CONTAINER ID来完成偏向于数据库概念中的主键。
docker ps --no-trunc | 查看 |
docker start/stop CONTAINER ID | 启动/停止 |
docker start/stop wordPress | 通过容器别名启动/停止 |
docker kill 容器id或容器名 | 强制停止容器 |
docker rm 容器id | 删除已停止的容器 |
docker inspect wordPress | 查看容器所有基本信息 |
docker logs wordPress | 查看容器日志 |
docker stats wordPress | 查看容器所占用的系统资源 |
docker exec 容器名 容器内执行的命令 | 容器执行命令 |
docker exec -it 容器名 /bin/bash | 登入容器的bash(我们可以使用该命令来创建mysql数据库,如下所示) |
docker-compose编排
compose是docker公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。需要定义一个yaml格式的配置文件docker-compose.yaml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。
compse的核心概念
- 一个文件:docker-compose.yaml
- 两个要素:
- 服务:一个个应用容器实例,比如订单微服务,redis容器,mysql容器。
- 工程:由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yaml文件中定义。
三个步骤
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用docker-compose.yml定义一个完整的业务单元,按照先后顺序安排好整体应用中的各个容器服务
- 最后,执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线
compse常用命令
docker-compse -h | 查看帮助 |
docker-compse up | 启动所有docker-compose服务 |
docker-compse up -d | 启动所有docker-compose服务并后台运行 |
docker-compse down | 停止并删除容器、网络、卷、镜像 |
docker-compse start | 启动服务 |
docker-compse pause | 暂停服务 |
docker-compse unpause | 恢复暂停 |
docker-compse rm | 删除容器 |
docker-compse stop | 停止服务 |
docker-compse restart | 重启服务 |
docker-compse config | 检查配置 |
docker-compse config -q | 检查配置,有问题才有输出 |
docker-compse logs yml里面的服务id | 查看容器输出日志 |
docker-compse top | 展示当前docker-compose编排过的容器进程 |
docker-compse ps | 展示当前docker-compose编排过的运行的所有容器 |
docker-compse exec yml里面的服务id /bin/bash | 进入容器实例内部 |
如何编写docker-compose
官网:https://docs.docker.com/compose/compose-file/03-compose-file/。自然就是参考官网了,如果忘记了相关的语法看官网就行了,这个东西没必要深究,会使用就可以了。而且,如果使用了GoLand编译器安装了Docker插件之后编写docker-compose的时候都会有提示的。
- 案例如下:
java
version: '3.0'
services:
mysql8:
image: mysql:8.0.29
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
# 设置初始化脚本
- ./script/mysql/:/docker-entrypoint-initdb.d/
ports:
# - 映射为13316端口
- "13316:3306"
redis:
image: 'bitnami/redis:latest'
environment:
- ALLOW_EMPTY_PASSWORD=yes
ports:
- '6379:6379'