Docker命令及常用软件安装
0x00、前言
Linux容器化部署相关,涉及Nginx、Consul单例/集群、RabbitMQ、Redis主从复制、MySQL主从复制等。
服务器版本:CentOS-8.5.2111
0x01、Docker
一、Docker安装
// 官方安装命令
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
// 国内daocloud安装命令
curl -sSL https://get.daocloud.io/docker | sh
centos8默认使用podman代替docker,所以需要containerd.io.
dnf install https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.9-3.1.el8.x86_64.rpm
dnf install -y docker-ce
启动docker
systemctl start docker
开机自启
systemctl enable docker
重启docker服务
systemctl restart docker
停止docker服务
systemctl stop docker
二、配置国内镜像
1、修改/etc/docker/daemon.json配置文件
sudo vim /etc/docker/daemon.json
2、修改daemon.json文件的内容
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
[]里面的网址可以随便更换为国内镜像源的网址。
Docker中国官方:https://registry.docker-cn.com
网易:http://hub-mirror.c.163.com
中科大:https://docker.mirrors.ustc.edu.cn
3、保存文件之后重启一下docker即可完成配置
systemctl restart docker
三、Docker常用命令
1.1、使用Dockerfile创建镜像
docker build -t 镜像名称 .
- -t :指定镜像名称
- . :注意命令结尾处的".",表示build上下文为当前目录,默认情况下docker会使用在上下文的根目录下找到Dockerfile文件
1.2、查看镜像
docker images
1.3、删除镜像
docker rmi 镜像名称1 镜像名称2
1.4、批量删除镜像
docker images | grep "镜像名" | awk '{print $1}' | xargs docker rmi
2.1、启动容器
docker run --name 容器名 -d -p 外部映射端口:80 --restart=always 镜像名称
- -d :表示后台运行容器
- -p :外部端口与内部容器端口映射
- --name :指定容器的名称,可以不指定,默认会为我们创建
- -v :映射目录,-v 本机目录:容器内部路
- --restart=always:设置容器自动启动
2.2、显示所有容器
docker ps -a
不加-a为显示运行中的容器。
2.3、停止运行状态容器
docker stop 容器名
2.4、启动停止状态容器
docker start 容器名
2.5、重启容器
docker restart 容器名
2.6、删除容器
docker rm 容器名
2.7、批量停止/删除容器
docker stop $(docker ps -a | grep "容器名" | awk '{print $1}')
docker rm $(docker ps -a | grep "容器名" | awk '{print $1}')
容器名可以模糊查询,如查询abc可查出abc123。
2.8、停止并删除全部容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq)
四、docker-compose安装
主要实现对Docker容器集群的快速编排。
1、官网下载的镜像源是github的,这里采用国内的镜像源:
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose
2、赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
3、检测版本,测试是否安装成功
docker-compose --version
五、docker-compose常用命令
以下操作都需要在yml文件所在目录执行。
1、Docker-Compose命令格式
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
命令选项如下:
-f,–file FILE指定Compose模板文件,默认为docker-compose.yml,可以多次指定。
-p,–project-name NAME指定项目名称,默认将使用所在目录名称作为项目名。
-x-network-driver 使用Docker的可拔插网络后端特性(需要Docker 1.9+版本)
-x-network-driver DRIVER指定网络后端的驱动,默认为bridge(需要Docker 1.9+版本)
-verbose输出更多调试信息
-v,–version打印版本并退出
2、docker-compose up
启动所有服务
docker-compose up [options] [SERVICE...]
选项包括:
-d 在后台运行服务容器
–no-color 不使用颜色来区分不同的服务的控制输出
–no-deps 不启动服务所链接的容器
–force-recreate 强制重新创建容器,不能与–no-recreate同时使用
–no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
–no-build 不自动构建缺失的服务镜像
–build 在启动容器前构建服务镜像
–abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
–remove-orphans 删除服务中没有在compose文件中定义的容器
–scale SERVICE=NUM 设置服务运行容器的个数,将覆盖在compose中通过scale指定的参数
2.1 启动所有服务
docker-compose up
2.2 在后台所有启动服务
docker-compose up -d
2.3 -f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d
3、docker-compose ps
列出项目中目前的所有容器
docker-compose ps
4、docker-compose stop
通知项目中的容器
docker-compose stop [options]
选项包括:
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
4.1 停止正在运行的容器,可以通过docker-compose start 再次启动
docker-compose stop
5、docker-compose start
docker-compose start [SERVICE...]
5.1 启动已经存在的服务容器
docker-compose start
6、docker-compose restart
重启项目中的服务。
docker-compose restart [options][SERVICE...]
选项包括:
-t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)
6.1 重启项目中的服务
docker-compose restart
7、docker-compose down
停止和删除容器、网络、卷、镜像
docker-compose down [options]
选项包括:
–rmi type,删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像
-v, –volumes,删除已经在compose文件中定义的和匿名的附在容器上的数据卷
–remove-orphans,删除服务中没有在compose中定义的容器
7.1 停用移除所有容器以及网络相关
docker-compose down
8、docker-compose logs
查看服务容器的日志。
docker-compose logs [options][SERVICE...]
默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。
8.1 查看服务容器的输出
docker-compose logs
0x02、Nginx
1、下载镜像
docker pull nginx
2、本机创建挂载目
mkdir -p /mnt/nginx/{conf,html,logs}
conf:配置文件目录。
html:html目录,如50x.html、404.html、index.html,可自行配置对应页面。
logs:日志目录。
3、创建配置文件
此为基础配置文件,可根据业务再自行配置
vim /mnt/nginx/conf/nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include 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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; #获取客户端真实IP
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
4、运行
4.1 Linux
docker run -d -p 80:80 --name nginx-web -v /mnt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /mnt/nginx/logs:/var/log/nginx -v /mnt/nginx/html:/usr/share/nginx/html nginx
4.2 Windows
docker run -d -p 80:80 --name nginx-web -v E:\Software\Nginx\conf\nginx.conf:/etc/nginx/nginx.conf -v E:\Software\Nginx\logs:/var/log/nginx -v E:\Software\Nginx\www:/usr/share/nginx/html nginx
0x03、Consul
1、下载镜像
docker pull consul
2、启动
2.1 启动单实例
docker run -d --name consul -p 8500:8500 consul
2.2 集群部署
节点介绍:
CLIENT:表示客户端模式,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。
SERVER:表示server模式,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,遇到故障,信息是可以被保留的。
SERVER-LEADER:表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
集群要求要有三个Server,三个Server会选举一个Leader。
2.2.1 启动第一个Server
docker run --name consul8500 -d -p 8500:8500 consul agent -server -bootstrap-expect 3 -ui -bind=0.0.0.0 -client=0.0.0.0
2.2.2 查看第一个Server的IP
docker inspect --format '{{ .NetworkSettings.IPAddress }}' consul8500
以下的172.17.0.3均应改为查询出的IP。
2.2.3 启动其他Server节点
docker run --name consul8501 -d -p 8501:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.3
docker run --name consul8502 -d -p 8502:8500 consul agent -server -ui -bind=0.0.0.0 -client=0.0.0.0 -join 172.17.0.3
2.2.4 启动Client节点
docker run -d --name consul8503 -d -p 8503:8500 consul agent --server=false --client=0.0.0.0 --join 172.17.0.3
2.3 查看集群状态
进入任一容器
docker exec -it 容器名或ID sh
查看状态
consul members
0x04、RabbitMQ
1、下载镜像
docker pull rabbitmq
2、启动
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq
3、开启图形化界面
进入容器内部,启动管理插件
docker exec -it 容器名或ID /bin/bash
rabbitmq-plugins enable rabbitmq_management
默认用户名密码:guest
开启图形化界面后如果弹框提示:Stats in management UI are disabled on this node
原因是默认图像禁用 management_agent 插件中的指标收集器,开启即可。
1、进入容器内部
docker exec -it 容器名或ID /bin/bash
2、进入配置文件目录
cd /etc/rabbitmq/conf.d/
3、修改配置文件中的disable_metrics_collector = false
echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf
4、exit离开容器后,重启容器
docker restart 2c2b04fa94f8
4、清空持久化数据
注意,这是重置rabbitmq,也会清空添加的用户。
1、进入容器内部
docker exec -it 容器名或ID /bin/bash
2、进入bin目录
cd bin
3、停止rabbitmq服务
rabbitmqctl stop_app
4、重置
rabbitmqctl reset
5、重启
rabbitmqctl start_app
5、问题
RabbitMQ.Client.Exceptions.OperationInterruptedException:“The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=406, text='PRECONDITION_FAILED - inequivalent arg 'durable' for exchange 'topic-exchange' in vhost '/': received 'true' but current is 'false'', classId=40, methodId=10”
解决:
队列创建后将不能修改是否持久化,需要将队列删除后重新定义队列。
0x05、Redis
1、下载镜像
docker pull redis:latest
2、启动单实例
docker run -itd --name redis6379 -p 6379:6379 redis
3、主从搭建
3.1 启动三个节点
docker run -itd --name redis6379 -p 6379:6379 redis
docker run -itd --name redis6380 -p 6380:6379 redis
docker run -itd --name redis6381 -p 6381:6379 redis
此时三个节点都是master节点
3.2 查看需要设置主节点的容器IP
docker inspect --format '{{ .NetworkSettings.IPAddress }}' redis6379
3.3 设置从节点
1、进入从节点容器
docker exec -it redis6380 bash
2、打开redis-cli
redis-cli
3、修改从节点主机
SLAVEOF host port // SLAVEOF 172.17.0.2 6379
4、离开redis
exit
5、离开docker
exit
redis6381也同以上设置。
3.4 查看主从状态
1、进入主节点容器
docker exec -it redis6379 bash
2、打开redis-cli
redis-cli
3、查看复制信息
info replication
可以看到role:master,connected_slaves:2及从节点信息。
4、docker-compose方式建立主从节点
此部分可直接替代第三部分快速启动主从节点
4.1、新建docker-compose.yml
version: '3'
services:
master:
image: redis
container_name: redis-master
command: redis-server --requirepass redis_pwd --masterauth redis_pwd
ports:
- 6382:6379
slave1:
image: redis
container_name: redis-slave-1
ports:
- 6383:6379
command: redis-server --slaveof redis-master 6379 --requirepass redis_pwd --masterauth redis_pwd
slave2:
image: redis
container_name: redis-slave-2
ports:
- 6384:6379
command: redis-server --slaveof redis-master 6379 --requirepass redis_pwd --masterauth redis_pwd
其中redis_pwd为设置的密码,可自行替换。
4.2、docker-compose启动容器
1、将docker-compose.yml文件拷贝至服务器
2、在docker-compose.yml所在目录执行,即可启动容器
docker-compose up -d
4.3、查看主从状态
1、进入主节点容器
docker exec -it redis6379 bash
2、打开redis-cli,由于设置了密码,需要加认证
redis-cli -a redis_pwd
3、查看复制信息
info replication
可以看到role:master,connected_slaves:2及从节点信息。
0x06、MySQL
1、下载镜像
docker pull mysql:latest
或者
docker pull hub.c.163.com/library/mysql:latest
2、创建本地挂载目录
mkdir -p /mnt/mysql/{master,slave}/data
3、创建配置文件
注意:最后一行的server-id不能重复。
创建后将配置文件复制到master、slave目录。
# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# The MySQL Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin
server-id=2
4、创建容器
创建Mysql桥接网络,用于主从容器直接互联。
docker network create mysql
创建主库容器,端口3307
docker run -d --privileged=true -p 3307:3306 -v /mnt/mysql/master/my.cnf:/etc/mysql/my.cnf -v /mnt/mysql/master/data:/var/lib/mysql -v /mnt/mysql/master/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master --network mysql --network-alias mysql-master mysql
创建从库容器,端口3308
docker run -d --privileged=true -p 3308:3306 -v /mnt/mysql/slave/my.cnf:/etc/mysql/my.cnf -v /mnt/mysql/slave/data:/var/lib/mysql -v /mnt/mysql/slave/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave --network mysql --network-alias mysql-slave mysql
5、配置主服务
1、进入容器
docker exec -it mysql-master /bin/bash
2、连接 MySQL
mysql -u root -p123456
3、使用root用户进行主从复制, %为允许所有ip进行复制。
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';
4、刷新权限
flush privileges;
5、查看主服务器状态
show master status;
注意:需要记录其中的File, Position字段内容
mysql-bin.000003 544
6、开启主库远程访问权限
use mysql;
select host,user from user;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
7、退出
exit; # 退出mysql
exit; # 退出容器
6、配置从服务
1、进入容器
docker exec -it mysql-slave bash
2、登录
mysql -u root -p123456
3、执行以下内容
change master to master_host='mysql-master',master_user='root',master_password='123456',master_log_file='主库查出来的File内容',master_log_pos=主库查出来的Position内容,master_port=3306;
4、启动slave
start slave;
5、查看slave状态
show slave status\G;
当Slave_IO_Running和Slave SQL Ruing都是Yes时,说明配置成功了。这两个字段在第11行、12行。
7、测试主从复制
打开Navicat for MySQL,分别连接主库和从库,在主库中新增测试库、测试表和测试数据,从库会自动同步。
可自行测试。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步