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,分别连接主库和从库,在主库中新增测试库、测试表和测试数据,从库会自动同步。

可自行测试。

posted @ 2021-06-24 22:00  gaozejie  阅读(180)  评论(0编辑  收藏  举报