
Docker从入门到入土详解与部署
一、Docker简介

Docker是一个开源的容器引擎,它有助于更快地交付应用。 Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。 Docker的优点如下:
1、简化程序
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。
2、节省开支
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。 Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
Docker的架构

- Docker daemon( Docker守护进程)
Docker daemon是一个运行在宿主机( DOCKER-HOST)的后台进程。可通过 Docker客户端与之通信。
- Client( Docker客户端)
Docker客户端是 Docker的用户界面,它可以接受用户命令和配置标识,并与 Docker daemon通信。图中, docker build等都是 Docker的相关命令。
- Images( Docker镜像)
Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系 统,同理,使用Docker镜像可以运行 Docker镜像中的程序。
- Container(容器)
容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过 Docker API或者 CLI命令来启停、移动、删除容器。
- Registry
Docker Registry是一个集中存储与分发镜像的服务。构建完 Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助 Docker Registry来避免镜像的手动复制。 一个 Docker Registry可包含多个 Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个 Docker镜像。这跟Maven的仓库有点类似,如果把 Docker Registry比作 Maven仓库的话,那么 Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。 Docker Registry可分为公有Docker Registry和私有Docker Registry。 最常⽤的Docker Registry莫过于官⽅的DockerHub, 这也是默认的Docker Registry。 Docker Hub上存放着⼤量优秀的镜像, 我们可使⽤Docker命令下载并使⽤。
二、Docker的安装
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩 写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。 Docker CE 的安装请参考官方文档,我们这里以CentOS为例:
1、Docker 要求 CentOS 系统的内核版本高于 3.10
通过 uname -r 命令查看你当前的内核版本
1uname -r
2、使用 root 权限登录 Centos。确保 yum 包更新到最新。
1yum ‐y update
3、卸载旧版本(如果安装过旧版本的话)
1sudo yum remove ‐y docker*
4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
1yum install ‐y yum‐utils
5、设置yum源,并更新 yum 的包索引
1yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1yum makecache fast
6、可以查看所有仓库中所有docker版本,并选择特定版本安装
1yum list docker‐ce ‐‐showduplicates | sort ‐r
(现在最好选择最新版)
7、安装docker
1yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
8、启动并加入开机启动
1systemctl start docker && systemctl enable docker
12345678910# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps 命令,如果不报错,则说明安装启动成功
docekr ps
9、验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
1 docker version

注意:一般需要配置docker镜像加速器 我们可以借助阿里云的镜像加速器,登录阿里云(https://cr.console.aliyun.com/#/accelerator) 可以看到镜像加速地址如下图:

1 cd /etc/docker
查看有没有 daemon.json。这是docker默认的配置文件。 如果没有新建,如果有,则修改。
1 vim daemon.json
为了确保我们可以正常获取到镜像(防止aliyun的镜像找不到我们所想要的)
我们多配置其他源
1234567891011121314{
"registry-mirrors":
[
## 下面是在网上找的其他的镜像加速器,以防止阿里云官方dockerhub找不到我们想要的镜像或版本
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
## 下面这个换成你在阿里云官方的镜像加速器,每个人的都不一样
"https://ali.mirror.aliyuncs.com"
]
}
如果没有新建
1234567891011121314151617sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":
[
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://ali.mirror.aliyuncs.com"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
随后我们在查看我们是否配置成功
123cd /etc/docker
ll
cat daemon.json

10、卸载docker
1234yum remove ‐y docker\*
rm ‐rf /etc/systemd/system/docker.service.d
rm ‐rf /var/lib/docker
rm ‐rf /var/run/docker
三、Docker常用命令
镜像相关命令
1、搜索镜像
可使用 docker search命令搜索存放在 Docker Hub中的镜像。执行该命令后, Docker就会在Docker Hub中搜索含有 java这个关键词的镜像仓库。
1 docker search java

以上列表包含五列,含义如下:
- NAME:镜像仓库名称。
- DESCRIPTION:镜像仓库描述。
- STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于 GitHub的 stars0
- OFFICAL:表示是否为官方仓库,该列标记为[0K]的镜像均由各软件的官方项目组创建和维护。
- AUTOMATED:表示是否是自动构建的镜像仓库。
2、下载镜像
使用命令docker pull命令即可从 Docker Registry上下载镜像,执行该命令后,Docker会从 Docker Hub中的 java仓库下载最新版本的 Java镜像。如果要下载指定版本则在java后面加冒号指定版本,例如:docker pull java:8
1docker pull openjdk:8
1docker pull nginx

3、列出镜像
1docker images

以上列表含义如下 - REPOSITORY:镜像所属仓库名称。 - TAG:镜像标签。默认是 latest,表示最新。 - IMAGE ID:镜像 ID,表示镜像唯一标识。 - CREATED:镜像创建时间。 - SIZE: 镜像大小。
4、删除本地镜像
使用 docker rmi命令即可删除指定镜像,强制删除加 -f
1docker rmi java
删除所有镜像
11 docker rmi $(docker images -q)
容器相关命令
1、新建并启动容器
使用以下docker run命令即可新建并启动一个容器,该命令是最常用的命令,它有很多选项,下面将列举一些常用的选项。
- -d选项:表示后台运行
- -P选项:随机端口映射
- -p选项:指定端口映射,有以下四种格式。
- — ip:hostPort:containerPort
- — ip::containerPort
- — hostPort:containerPort
- — containerPort
—net选项:指定网络模式,该选项有以下可选参数:
—net=bridge:默认选项,表示连接到默认的网桥。
—net=host:容器使用宿主机的网络。
—net=container:NAME-or-ID:告诉 Docker让新建的容器使用已有容器的网络配置。
—net=none:不配置该容器的网络,用户可自定义网络配置。
BASH1docker run --name nginx -d -p 91:80 nginx这样就能启动一个 Nginx容器。在本例中,为 docker run添加了两个参数,含义如下: -d 后台运行 -p 宿主机端口:容器端口 #开放容器端口到宿主机端口 访问 http://Docker宿主机IP:91/,将会看到nginx的主界面:

需要注意的是,使用 docker run命令创建容器时,会先检查本地是否存在指定镜像。如果本地不存在该名称的镜像, Docker就会自动从 Docker Hub下载镜像并启动一个 Docker容器。
如果在run的时候出现一下问题,那问题可能是 ’-’ ’-’ 的区别(中英文)

2、列出容器
用 docker ps命令即可列出运行中的容器
1docker ps

如需列出所有容器(包括已停止的容器),可使用-a参数。该列表包含了7列,含义如下
- CONTAINER_ID:表示容器 ID。
- IMAGE:表示镜像名称。
- COMMAND:表示启动容器时运行的命令。
- CREATED:表示容器的创建时间。
- STATUS:表示容器运行的状态。UP表示运行中, Exited表示已停止。
- PORTS:表示容器对外的端口号。
- NAMES:表示容器名称。该名称默认由 Docker自动生成,也可使用 docker run命令的—name选项自行指定。
3、停止容器
使用 docker stop命令,即可停止容器
1docker stop b7f5357d15f3
其中f0b1c8ab3633是容器 ID,当然也可使用 docker stop容器名称来停止指定容器
4、强制停止容器
可使用 docker kill命令发送 SIGKILL信号来强制停止容器
1docker kill b7f5357d15f3
5、启动已停止的容器
使用docker run命令,即可新建并启动一个容器。对于已停止的容器,可使用 docker start命令来启动
1docker start b7f5357d15f3
6、查看容器所有信息
1docker inspect b7f5357d15f3
7、查看容器日志
1docker container logs f0b1c8ab3633
8、查看容器里的进程
11 docker top b7f5357d15f3
9、容器与宿主机相互复制文件
- docker cp 容器id:要拷贝的文件在容器里面的路径 宿主机的相应路径
1docker cp b7f5357d15f3:/etc/nginx/nginx.conf /data/nginx
- 从宿主机拷文件到容器里面
1 docker cp 要拷贝的宿主机文件路径 容器id:要拷贝到容器里面对应的路径
10、进入容器
使用docker exec命令用于进入一个正在运行的docker容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了
12docker exec -it b7f5357d15f3 /bin/bash
# (有的容器需要把 /bin/bash 换成 sh)
11、容器内安装vim、ping、ifconfig等指令
123456apt-get update
apt-get install vim # 安装vim
apt-get install iputils-ping # 安装ping
apt-get install net-tools # 安装ifconfig
apt-get update && apt-get install -y vim iputils-ping net-tools
12、删除容器
使用 docker rm命令即可删除指定容器
1docker rm b7f5357d15f3
该命令只能删除已停止的容器,如需删除正在运行的容器,可使用-f参数 强制删除所有容器
1docker rm -f $(docker ps ‐a ‐q)
强制删除某一个容器
1docker rm -f b7f5357d15f3
13、Linux小技巧
当你不想 docker ps || docker images 每次都懒得输入这么多的时候,可以配置Linux的快捷键
1234567# 第一步
vi ~/.bashrc
# 进入后添加
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}"'
alias dis='docker images'
# 最后一步
source ~/.bashrc


14、清理docker缓存
有时 Docker 的缓存可能会导致问题,可以尝试清理未完成的下载和缓存:
1docker system prune -a
15、更改容器名称
1docker tag seataio/seata-server seata
四、Docker数据卷
- Docker 容器删除后,在容器中产生的数据也会随之销毁,类似删库跑路,不安全
- Docker 容器怎么和外部机器交换文件
- 容器之间怎么进行数据交互
- 解决:使用数据卷
数据卷是一个虚拟目录,他将宿主机目录映射到容器内目录,方便我们操作容器内文件,或者方便迁移容器产生的数据
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷 的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)。
Docker挂载实例(以mysql为例):
123456789docker run -d \
--name mysql \
--restart=always \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/local/mysql/data:/var/lib/mysql \
-v /data/local/mysql/conf:/etc/mysql/conf.d \
mysql:8.0.34
其中的**-v**就是挂载的目录
- -v /path/to/mysql:/etc/mysql/conf.d将主机的
mysql目录挂载到容器内的/etc/mysql/conf.d目录, - -v /path/to/mysql/data:/var/lib/mysql 将主机的
mysql/data目录挂载到容器内的/var/lib/mysql目录,
五、Docker网络
容器网络实质上是由 Dokcer 为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等等与网络相关的模块。
Docker 为实现容器网络,主要采用的架构由三部分组成:CNM、Libnetwork 和驱动。
1. CNM
Docker 网络架构采用的设计规范是 CNM(Container Network Model):CNM 中规定了 Docker 网络的基础组成要素:Sandbox、Endpoint、Network。如图所示,

- Sandbox,提供了容器的虚拟网络栈,也即端口套接字、IP 路由表、防火墙、DNS 配置等内容。主要用于隔离容器网络与宿主机网络,形成了完全独立的容器网络环境。
- Network,Docker 内部的虚拟子网,网络内的参与者相互可见并能够进行通讯。Docker 的虚拟网路和宿主机网络是存在隔离关系的,其目的主要是形成容器间的安全通讯环境。
- Endpoint,就是虚拟网络的接口,就像普通网络接口一样,Endpoint 的主要职责是负责创建连接。在 CNM 中,终端负责将沙盒连接到网络。个人理解:Endpoint 与常见的网络适配器类似,也就意味着 Endpoint 只能接入某一个网络。因此,如果容器需要接入到多个网络,就需要多个 Endpoint。
★如上图所示(我们将图中的三个容器从左到右依次标记为 1、2、3),那么容器 2 有两个 endpoint 并且分别接入 NetworkdA 和 NetworkB。那么容器 1 和容器 2 是可以实现通信的,因为都接入了 NetworkA。但是容器 3 和容器 1,以及容器 2 的两个 Endpoint 之间是不能通信的,除非有三层路由器的支持。 ”
1.1、Docker 提供三种 user-defined 网络驱动:bridge, overlay 和 macvlan
overlay 和 macvlan 用于创建跨主机的网络
1.2、Docker创建网络常用命令
不指定网络驱动时默认创建的bridge网络
1docker network create default_network
查看网络内部信息
1docker network inspect default_network
列所有列表的网络
1docker network ls
移除指定的网络
1docker network rm default_network
1.3、Docker自定义网络
1.查看所有的docker网络:
1docker network ls
网络模式
- bridge:桥接docker(默认,自己创建也使用bridge模式)
- none:不配置网络
- host:和宿主机共享网络
- container:容器网络连通(用的少,局限很大)
2.创建自定义网络命令:docker network create default_network
123456docker network create --driver bridge --subnet 192.168.1.0/16 --gateway 192.168.1.0 mynet
解析:
--driver bridge 表示使用桥接模式
--subnet 192.168.1.0/16 表示子网ip 可以分配 192.168.1.2 到 192.168.255.255
--gateway 192.168.1.0 表示网关
mynet 表示网络名
3.查看网络内部信息:docker network inspect default_network
4.移除指定的网络:docker network rm default_network
2. Libnetwork
Libnetwork 是 CNM 的标准实现。Libnetwork 是开源库,采用 Go 语言编写(跨平台的),也是 Docker 所使用的库,Docker 网络架构的核心代码都在这个库中。Libnetwork 实现了 CNM 中定义的全部三个组件,此外它还实现了本地服务发现、基于 Ingress 的容器负载均衡,以及网络控制层和管理层功能。
六、Docker-Compose
1、概述
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。Compose 用 YAML 文件配置应用程序的服务。使用单一命令,可以从 YAML 文件配置中创建并启动所有服务。适用于所有环境生产、开发、测试以及 CI/CD 工作流程。
Compose的使用三步:
使用 Dockerfile 自定义应用程序的环境,便于在任何地方复制它; 使用 docker-compose.yml 定义构成的应用程序的服务,便于隔离环境中一起运行; 运行 docker-compose up 命令启动并运行整个应用程序。
2、Docker Compose与Docker关系
Docker Compose(容器编排工具) 定义:Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。
功能:
多容器管理:允许用户在一个YAML文件中定义和管理多个容器 服务编排:配置容器间的网络和依赖关系 一键部署:使用docker-compose up命令启动、停止和重建服务 用途:简化多容器应用的配置和管理,适用于开发、测试和生产环境中的复杂应用。
两者关系: Docker 是 Docker Compose 的前提,Docker Compose 是为了简化使用 Docker 时多容器应用的管理和部署而设计的。 两者之间相辅相成,Docker 提供容器化的核心功能,Docker Compose 则管理这些容器的组合和交互。 两者面向不同用户,Docker 面向任何需要容器化应用的用户,Docker Compose 则面向需要同时管理多个容器的开发者和运维团队。
3.下载 Docker Compose 2.20
在 CentOS 上,使用以下命令来下载 Docker Compose 2.20:
1sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
赋予执行权限下载完成后,需要给 Docker Compose 文件添加执行权限:
1sudo chmod +x /usr/local/bin/docker-compose
验证安装,确认 Docker Compose 已经正确安装,并且版本为 2.20:
1234docker-compose --version
# 输出一下内容
Docker Compose version v2.20.0
4.docker-compose命令
1234# 运行
docker-compose up -d
# 停止
docker-compose down
5.注意事项
当使用docker-compose的相关命令的时候必须在含有docker-compose.yml文件的同一级目录下使用,否则会报错

6.docker-compose创建容器
123456789101112131415version: '3.8'
services:
minio:
image: minio/minio:latest
ports:
- "9000:9000" # MinIO Web 界面
volumes:
- /data/local/minio:/data # 持久化 MinIO 数据
networks:
- local-network
networks:
local-network: # 自定义网络名称
driver: bridge # 创建统一网络(桥接模式)
7.docker-compose搭建多容器(微服务专用环境)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
version: '3.8'
services:
mysql:
image: mysql:8.0.34
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: root # 使用官方默认密码
ports:
- "3306:3306"
networks:
- local-network
volumes:
- /data/local/mysql:/var/lib/mysql
command: --default-authentication-plugin=mysql_native_password
redis:
image: redis:latest
container_name: redis
ports:
- "6379:6379"
networks:
- local-network
command: ["redis-server", "--requirepass", "redis"] # 使用默认的 Redis 密码
volumes:
- /data/local/redis:/data
nacos:
image: nacos/nacos-server:v2.3.0
container_name: nacos
restart: always
ports:
- 8848:8848
- 9848:9848
environment:
- MODE=standalone
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=nacos
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=root # 使用官方默认密码
- MYSQL_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false
networks:
- local-network
volumes:
- /data/local/nacos:/home/nacos/data
sentinel:
image: bladex/sentinel-dashboard:latest
container_name: sentinel
ports:
- "8858:8858"
networks:
- local-network
volumes:
- /data/local/sentinel:/data
elasticsearch:
image: elasticsearch:7.7.1
container_name: elasticsearch
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
- "9300:9300"
networks:
- local-network
volumes:
- /data/local/elasticsearch/data:/usr/share/elasticsearch/data
kibana:
image: kibana:7.7.1
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
networks:
- local-network
depends_on:
- elasticsearch
rabbitmq:
image: rabbitmq:management
container_name: rabbitmq
ports:
- "5672:5672" # 默认端口
- "15672:15672" # 管理控制台端口
environment:
RABBITMQ_DEFAULT_USER: guest # 使用官方默认用户名
RABBITMQ_DEFAULT_PASS: guest # 使用官方默认密码
networks:
- local-network
volumes:
- /data/local/rabbitmq:/var/lib/rabbitmq
minio:
image: minio/minio:latest
container_name: minio
ports:
- "9000:9000"
- "9001:9001"
networks:
- local-network
volumes:
- /data/local/minio:/data
command: server /data --console-address ":9001"
zipkin:
image: openzipkin/zipkin:latest
container_name: zipkin
environment:
- STORAGE_TYPE=mysql
- MYSQL_HOST=mysql
- MYSQL_USER=root
- MYSQL_PASS=root # 使用官方默认密码
- MYSQL_DB=zipkin
ports:
- "9411:9411"
networks:
- local-network
volumes:
- /data/local/zipkin:/data
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
- "443:443"
networks:
- local-network
volumes:
- /data/local/nginx/nginx.conf:/etc/nginx/nginx.conf
- /data/local/nginx:/usr/share/nginx/html
mongo:
image: mongo:4.4
container_name: mongo
ports:
- "27017:27017"
networks:
- local-network
volumes:
- /data/local/mongo:/data/db
neo4j:
image: neo4j:latest
container_name: neo4j
ports:
- "7474:7474" # 浏览器访问端口
- "7687:7687" # Bolt 连接端口
networks:
- local-network
environment:
- NEO4J_AUTH=neo4j/neo4j123456 # 使用官方默认用户名和密码
volumes:
- /data/local/neo4j/data:/data
- /data/local/neo4j/logs:/logs
- /data/local/neo4j/import:/var/lib/neo4j/import
- /data/local/neo4j/conf:/etc/neo4j
networks:
local-network:
driver: bridge
访问服务:
- MySQL:
192.168.75.155:3306 - Redis:
192.168.75.155:6379 - Nacos:
192.168.75.155:8848(管理界面) - Sentinel:
192.168.75.155:8858 - Elasticsearch:
192.168.75.155:9200 - Kibana:
192.168.75.155:5601 - RabbitMQ:
192.168.75.155:15672(管理控制台) - MinIO:
192.168.75.155:9000(S3 存储)、192.168.75.155:9001(管理控制台) - Zipkin:
192.168.75.155:9411(追踪管理界面) - Nginx:
192.168.75.155:80(Nginx客户端) - MongoDb:
192.168.75.155:27017 - neo4j:
192.168.75.155:7474/browser/
1234567891011121314151617181920# 解决nacos Public Key Retrieval is not allowed
docker exec -it mysql bash
mysql -u root -p
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
# 用户名和密码根据你自定义啦填写
# 解决es权限不足
sudo chown -R 1000:1000 /data/local/elasticsearch/data
sudo chmod -R 775 /data/local/elasticsearch/data
# 解决MongoDB无法远程连接
docker exec -it mongo bash
vim /etc/mongod.conf.orig
# 将其中的bindIp: 127.0.0.1注释掉# bindIp: 127.0.0.1 或者改成bindIp: 0.0.0.0 即可开启远程连接
# 解决rabbitmq无法启动(权限不足)
echo "YOUR_SECRET_COOKIE" | sudo tee /data/local/rabbitmq/.erlang.cookie
sudo chmod 400 /data/local/rabbitmq/.erlang.cookie
sudo chown 1000:1000 /data/local/rabbitmq/.erlang.cookie
解决nginx找不到nginx.conf和index.html
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374vim /data/lcoal/nginx/nginx.conf
# 将以下内容粘贴(官方nginx.conf配置文件)
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name localhost;
# 根目录设置为默认的html路径
root /usr/share/nginx/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
vim /data/lcoal/nginx/index.html
# 将以下内容粘贴值index.html(官方index.html文件)
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
以下就完成了数据环境的配置啦(大约两个半小时)

七、Dockerfile使用
elasticsearch
1、下载镜像并解压
1tar -zxvf elasticsearch-7.7.1-linux-x86_64.tar.gz

2、创建Dockerfile
必须是Dockerfile这么写(文件名不可以改变,若要改变则必须声明改变后的名称)
12345678910111213FROM scratch
# 复制解压后的 Elasticsearch 文件到容器的指定目录
COPY elasticsearch-7.7.1 /usr/share/elasticsearch
# 设置工作目录
WORKDIR /usr/share/elasticsearch
# 暴露 Elasticsearch 默认端口
EXPOSE 9200 9300
# 设置 Elasticsearch 环境变量
ENV ES_JAVA_OPTS="-Xms512m -Xmx512m"
ENV discovery.type=single-node
ENV http.host=0.0.0.0
# 启动 Elasticsearch
CMD ["bin/elasticsearch"]
3、在当前目录下运行运行
/data/local/elasticsearch
1234# 在当前目录下构建镜像,并命名为 elasticsearch
cd /data/local/elasticsearch
docker build -t elasticsearch:7.7.1 .
# 不要忘记最后一个点 '.' 并且点之前有一个空格
运行docker容器
1docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:7.7.1
验证 Elasticsearch 是否运行
访问 访问 http://Docker宿主机 IP:9200/, 来验证 Elasticsearch 是否正在运行:
1234# 使用 curl 命令测试(可选)
curl http://localhost:9200
# 也可以直接在主机上访问
http://Docker宿主机 IP:9200/

kibana
12cd /data/local/kibana/
tar -zxvf kibana-7.7.1-linux-x86_64.tar.gz
12cd /data/local/kibana/
vi Dockerfile
123456FROM scratch
COPY kibana-7.7.1 /usr/share/kibana
WORKDIR /usr/share/kibana
EXPOSE 5601
ENV SERVER_HOST="0.0.0.0"
CMD ["bin/kibana"]
12cd /data/local/kibana
docker build -t kibana:7.7.1 .
1docker run -d --name kibana -p 5601:5601 kibana:7.7.1
