Docker生存手册:安装到服务一本通
文章目录
- 一. Docker 容器介绍
- 1.1 什么是Docker容器?
- 1.2 为什么需要Docker容器?
- 1.3 Docker架构
- 1.4 Docker 相关概念
- 1.5 Docker特点
- 二. Docker 安装
- 2.1 查看Linux内核版本
- 2.2 卸载老版本docker,避免产生影响
- 2.3 升级yum 和配置源
- 2.4 安装Docker
- 2.5 启动Docker
- 2.6 验证Docker
- 2.7 设置Docker开机自启
- 2.8 配置镜像加速器
- 2.9 验证镜像加速是否生效
- 2.10 卸载Docker
- 三. Docker 命令
- 3.1 镜像命令
- 3.2 容器命令
- 3.3 数据卷命令
- 3.4 其他命令
- 3.5 参考
- 四、Docker安装常用服务指南
- 4.1 ◆ Docker安装Nginx
- 4.1.1 普通安装方式
- 4.1.2 挂载配置方案
- 方案一:Volume数据卷挂载
- 方案二:目录挂载(生产推荐)
- 4.2 ◆ Docker安装MySQL
- 4.2.1 基础安装步骤
- 4.2.2 数据持久化方案
- 数据卷挂载模式
- 目录挂载模式(推荐)
- 4.3 ◆ Docker安装Nacos集群
- 4.3.1 单节点部署
- 4.3.2 集群部署方案
- 4.4 ◆ Docker安装Redis
- 4.4.1 基础安装
- 4.4.2 持久化配置
- 配置文件挂载
- 4.5 ◆ Docker安装ElasticSearch
- 4.5.1 ElasticSearch部署
- 4.5.2 Kibana可视化
- 4.6 服务验证清单
一. Docker 容器介绍
1.1 什么是Docker容器?
Docker 是一种开源的容器化平台,允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中。通过 Docker,应用程序可以在任何环境中快速部署和运行,确保开发、测试和生产环境的一致性。
1.2 为什么需要Docker容器?
项目部署的困扰:
-
环境一致性:开发、测试、生产环境应当保持一致,但由于各种原因,往往会出现环境差异,导致部署出现问题。
-
版本管理:不同开发人员在开发过程中,可能会使用不同的开发工具、编程语言、框架,导致版本管理混乱。
-
依赖管理:不同项目依赖不同的库,如果没有统一的依赖管理,部署会出现问题。
Docker如何解决这些问题? -
Docker 容器化:Docker 容器化解决了环境一致性问题,将开发环境、测试环境、生产环境打包成一个容器,确保开发、测试、生产环境的一致性。
-
Docker 镜像:Docker 镜像解决了版本管理问题,将开发环境、测试环境、生产环境的依赖打包成镜像,确保开发人员使用统一的开发工具、编程语言、框架。
-
Docker 仓库:Docker 仓库解决了依赖管理问题,将镜像上传到仓库,其他开发人员可以下载使用。
1.3 Docker架构
- 服务端(server): Docker守护进程,负责处理Docker指令,管理镜像、容器等
- 客户端(client): 通过命令或RestAP向Docker服务端发送指令。可以在本地或远程向服务端发送指令
- 远程仓库(registry): 远程仓库是Docker用来保存镜像的地方,可以理解为代码仓库。
1.4 Docker 相关概念
- 镜像(Image): Docker镜像是一个只读的模板,包含了运行容器所需的一切。
- 容器(Container): 容器是一个运行中的镜像实例,可以启动、停止、删除、暂停等。
- 仓库(Repository): Docker仓库是一个集中存放镜像文件的地方,每个镜像都有唯一的ID,并可以被推送到多个仓库。
- 标签(Tag): 标签是镜像的版本,可以用来区分同一个镜像的不同版本。
- Dockerfile: Dockerfile是用来构建Docker镜像的文本文件,包含了一条条的指令来构建镜像。
- 卷(Volume): 卷是一个可供一个或多个容器使用的目录,它可以绕过联合文件系统,直接存取底层文件系统。
1.5 Docker特点
- 轻量级:Docker 容器的大小仅几十MB,相比虚拟机镜像大小只有几百MB。
- 便携:Docker 可以在任何 Linux 机器上运行,并不需要安装Docker软件,只需要安装Docker引擎。
- 隔离:Docker 使用容器技术,容器之间互相隔离,互不影响,更安全。文件隔离、系统隔离、资源隔离、网络隔离、日志隔离等。每个容器都完全独立运行在一个沙盒中,所有数据、资源都是隔离的,比如,CPU、内存等等,网络上会为每个容器虚拟一个ip地址,docker为每个容器都提供自己的日志,互不影响。
二. Docker 安装
2.1 查看Linux内核版本
uname -r
要求3.0版本以上
2.2 卸载老版本docker,避免产生影响
如果服务器安装过docker,没有卸载再次安装会导致安装失败,首先要卸载老版本(咱们没安装过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.3 升级yum 和配置源
yum工具可以安装软件,安装docker时需要更多工具,操作系统自带不够,所以要升级。
yum install -y yum-utils
配置本地镜像源
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
2.4 安装Docker
yum install -y docker-ce
docker-ce是社区版,docker-ee是企业版,这里安装的是社区版。社区版是免费的,企业版收费。
2.5 启动Docker
systemctl start docker
2.6 验证Docker
docker version
2.7 设置Docker开机自启
systemctl enable docker
2.8 配置镜像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hub-mirror.c.163.com"]
}
EOF
systemctl restart docker
或者阿里云加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://wm7fopru.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
或者修改/etc/docker/daemon.json文件
{
"registry-mirrors": ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"]
}
然后重启Docker
systemctl daemon-reload
systemctl restart docker
2.9 验证镜像加速是否生效
docker info
其中Registry Mirrors就是镜像加速器的地址。
2.10 卸载Docker
yum remove docker-ce
三. Docker 命令
3.1 镜像命令
- 镜像名称一般分两部分组成[tag]。
- 在没有指定tag时,默认是latest,代表最新版本的镜像
docker images:查看本地镜像列表
docker pull:拉取镜像
docker rmi:删除镜像
docker tag:给镜像打标签
docker save:保存镜像
docker load:加载镜像
docker build:构建镜像
案例:拉取nginx镜像
docker pull nginx
如果不指定镜像名称,则默认拉取latest版本的镜像(最新版本)。
案例:删除镜像
docker rmi nginx
如果有版本号,则删除指定版本的镜像。 如果镜像正在运行,则无法删除。
案例:给镜像打标签
docker tag nginx:latest my-nginx:v1.0
案例:保存镜像
docker save -o nginx.tar nginx:latest
案例:加载镜像
docker load -i nginx.tar
案例:构建镜像
docker build -t my-nginx:v1.0 .
docker build
命令的-t
参数指定镜像的名称和标签,.
表示当前目录。docker build
命令的.
表示Dockerfile文件所在目录。docker build
命令的-t
参数可以指定多个镜像名称和标签,多个镜像之间用空格隔开。
3.2 容器命令
- 容器名称一般分两部分组成[id]。
- 在没有指定name时,默认是随机生成的。
docker run:运行容器
docker ps:查看容器列表
docker start:启动容器
docker stop:停止容器
docker restart:重启容器
docker rm:删除容器
docker logs:查看容器日志
docker exec:进入容器
案例:运行nginx容器
docker run -d -p 80:80 --name my-nginx nginx
docker run 命令参数说明:
docker run
命令的-d
参数表示后台运行容器。docker run
命令的-p
参数表示将容器的80端口映射到主机的80端口。如:如:-p 81:80
表示将容器的80端口映射到主机的81端口。docker run
命令的--name
参数表示给容器指定名称。如果不指定名称,则默认随机生成名称。docker run
命令的nginx
参数表示启动的镜像名称。必须指定镜像名称,否则会报错。docker run
命令的-v
参数表示将主机的目录挂载到容器的目录。如:-v /data/my-data:/usr/share/nginx/html
表示将主机的/data/my-data
目录挂载到容器的/usr/share/nginx/html
目录。docker run
命令的-e
参数表示设置环境变量。docker run
命令的-it
参数表示进入交互模式。docker run
命令的--network
参数表示指定容器的网络模式。如--network=host
表示容器使用宿主机的网络。docker run
命令的--restart
参数表示设置容器的重启策略。如--restart=always
表示容器总是重启。
案例:查看容器列表
docker ps
docker ps 命令参数说明
docker ps
命令 默认只显示运行中的容器。docker ps
命令的-a
参数表示显示所有容器,包括停止的容器。docker ps
命令的-q
参数表示只显示容器的ID。docker ps
命令的-f
参数表示根据条件过滤容器。
案例:启动容器
docker start my-nginx
案例:停止容器
docker stop my-nginx
案例:重启容器
docker restart my-nginx
案例:删除容器
docker rm my-nginx
docker rm命令的参数说明:
docker rm
命令的-f
参数表示强制删除容器。
案例:查看容器日志
docker logs my-nginx
案例:进入容器
docker exec -it my-nginx /bin/bash
docker exec
命令的-it
参数表示进入交互模式。docker exec
命令的my-nginx
参数表示容器名称。docker exec
命令的/bin/bash
参数表示进入容器的bash命令行。
3.3 数据卷命令
数据卷可以让容器之间共享数据,容器之间的数据修改会立即同步到所有容器。
- docker volume create:创建数据卷
- docker volume ls:查看数据卷列表
- docker volume inspect:查看数据卷详情
- docker volume rm:删除数据卷
- docker run:使用数据卷
案例:创建数据卷
docker volume create my-data
案例:查看数据卷列表
docker volume ls
案例:查看数据卷详情
docker volume inspect my-data
案例:删除数据卷
docker volume rm my-data
案例:使用数据卷
docker run -d -p 80:80 --name my-nginx -v my-data:/usr/share/nginx/html nginx
docker run
命令的-v
参数表示将主机的my-data
目录挂载到容器的/usr/share/nginx/html
目录。- 这样,主机的
my-data
目录中的内容会同步到容器的/usr/share/nginx/html
目录,容器的/usr/share/nginx/html
目录中的内容会同步到主机的my-data
目录。
3.4 其他命令
- 复制内容到主机
docker cp my-nginx:/usr/share/nginx/html/ /data/my-data/
- 导入/导出镜像
docker save -o my-nginx.tar my-nginx:v1.0
docker load -i my-nginx.tar
- 导入/导出容器
docker export -o my-nginx.tar my-nginx
docker import my-nginx.tar my-nginx:v1.0
3.5 参考
Docker命令大全
Docker官方文档
Docker中文文档
Docker入门教程
Docker从入门到实践
四、Docker安装常用服务指南
4.1 ◆ Docker安装Nginx
4.1.1 普通安装方式
操作流程:
- 拉取镜像
docker pull nginx
# 或加载本地镜像
docker load -i nginx.tar
- 运行容器
docker run -d -p 80:80 --name nginx-test nginx
参数说明:
-d
:后台运行-p 80:80
:端口映射(主机:容器)--name
:容器命名
4.1.2 挂载配置方案
方案一:Volume数据卷挂载
# 创建数据卷
docker volume create nginx-{html,conf}-volume
# 启动容器
docker run -d -p 80:80 --name nginx-test \
-v nginx-html-volume:/usr/share/nginx/html \
-v nginx-conf-volume:/etc/nginx \
nginx
方案二:目录挂载(生产推荐)
# 创建本地目录
mkdir -p /opt/mount/nginx/{html,conf.d}
# 复制默认配置
docker cp nginx-test:/usr/share/nginx/html /opt/mount/nginx/
docker cp nginx-test:/etc/nginx/conf.d /opt/mount/nginx/
# 重新挂载启动
docker run -d -p 80:80 --name nginx-prod \
-v /opt/mount/nginx/html:/usr/share/nginx/html \
-v /opt/mount/nginx/conf.d:/etc/nginx/conf.d \
nginx
注意事项:
- 访问验证:
curl http://localhost
- 配置文件修改后需重启容器生效
- 生产环境建议绑定80+443端口
4.2 ◆ Docker安装MySQL
4.2.1 基础安装步骤
- 拉取镜像
docker pull mysql:8.0
- 启动容器
docker run -d -p 3306:3306 --name mysql-test \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
4.2.2 数据持久化方案
数据卷挂载模式
docker volume create mysql-{data,conf}-volume
docker run -d -p 3306:3306 --name mysql-prod \
-v mysql-data-volume:/var/lib/mysql \
-v mysql-conf-volume:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
目录挂载模式(推荐)
mkdir -p /opt/mount/mysql/{data,conf.d}
docker run -d -p 3306:3306 --name mysql-prod \
-v /opt/mount/mysql/data:/var/lib/mysql \
-v /opt/mount/mysql/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
关键配置说明:
# my.cnf 配置文件示例
[mysqld]
character-set-server=utf8mb4
default_authentication_plugin=mysql_native_password
4.3 ◆ Docker安装Nacos集群
4.3.1 单节点部署
docker run -d \
--name nacos-standalone \
-p 8848:8848 -p 9848:9848 -p 9849:9849 \
-e MODE=standalone \
-e JVM_XMS=512m -e JVM_XMX=512m \
nacos/nacos-server:v2.3.0
4.3.2 集群部署方案
- 准备3台服务器(node1/node2/node3)
- 每台执行:
mkdir -p /opt/nacos/{logs,conf,data}
docker run -d \
--name nacos-cluster \
--network=host \
-v /opt/nacos/logs:/home/nacos/logs \
-v /opt/nacos/conf:/home/nacos/conf \
-v /opt/nacos/data:/home/nacos/data \
-e MODE=cluster \
-e NACOS_SERVERS="node1:8848,node2:8848,node3:8848" \
-e JVM_XMS=2g -e JVM_XMX=2g \
nacos/nacos-server:v2.3.0
MySQL集成配置:
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.1.100 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=nacos \
-e MYSQL_SERVICE_PASSWORD=Nacos@1234
4.4 ◆ Docker安装Redis
4.4.1 基础安装
docker run -d \
--name redis-test \
-p 6379:6379 \
redis:7.0
4.4.2 持久化配置
配置文件挂载
mkdir -p /opt/mount/redis/{conf,data}
# redis.conf 核心配置
echo '
bind 0.0.0.0
protected-mode no
requirepass 123456
appendonly yes
' > /opt/mount/redis/conf/redis.conf
docker run -d \
--name redis-prod \
-p 6379:6379 \
-v /opt/mount/redis/conf:/usr/local/etc/redis \
-v /opt/mount/redis/data:/data \
redis:7.0 redis-server /usr/local/etc/redis/redis.conf
性能调优参数:
maxmemory 2gb
maxmemory-policy allkeys-lru
4.5 ◆ Docker安装ElasticSearch
4.5.1 ElasticSearch部署
# 创建专用网络
docker network create es-net
# 单节点运行
docker run -d \
--name es-node \
--network es-net \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms4g -Xmx4g" \
-v es-data:/usr/share/elasticsearch/data \
elasticsearch:8.6.0
4.5.2 Kibana可视化
docker run -d \
--name kibana \
--network es-net \
-p 5601:5601 \
-e ELASTICSEARCH_HOSTS=http://es-node:9200 \
kibana:8.6.0
安全配置建议:
# elasticsearch.yml
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
4.6 服务验证清单
服务 | 验证方式 | 预期结果 |
---|---|---|
Nginx | curl -I http://localhost | HTTP/1.1 200 OK |
MySQL | mysql -h 127.0.0.1 -P 3306 -u root -p | 成功登录 |
Redis | redis-cli -h 127.0.0.1 -a 123456 ping | PONG |
ElasticSearch | curl http://localhost:9200 | JSON格式节点信息 |
Kibana | 浏览器访问 http://IP:5601 | Kibana欢迎界面 |