Docker

Docker
虚拟化容器技术。Docker基于镜像,可以秒级启动各种容器。每一种容器都是一个完整的运行
环境,容器之间互相隔离。

卸载系统之前的Docker

Docker安装文档: https://docs.docker.com/install/linux/docker-ce/centos/

1、卸载系统之前的docker

1、卸载系统之前的docker|
sudo yum remove docker \
	docker-client \
	docker-client-latest \
	docker-common \
	docker-latest \
	docker-latest-logrotate \
	docker-logrotate \ 
	docker-engine

安装docker

2、安装docker 依赖的包

2、安装docker 依赖的包
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

3、使用以下命令建立稳定的存储库。

docker安装地址:https://download.docker.com/linux/centos/docker-ce.repo

3、使用以下命令建立稳定的存储库。
sudo yum-config-manager \
	--add-repo \
	https://download.docker.com/linux/centos/docker-ce.repo

4、安装docker

4、安装docker 安装的过程中所有选项都敲回车Enter
sudo yum install docker-ce docker-ce-cli containerd.io

5、启动docker

5、启动docker
sudo systemctl start docker
/*开机自启*/
sudo systemctl enable docker

6、通过运行hello-world映像验证Docker Engine-Community是否已正确安装。

sudo docker run hello-world

7、配置镜像加速

阿里云—控制台—左侧工具栏—容器镜像服务—配置镜像加速器—选择CentOS

//创建目录

sudo mkdir -p /etc/ docker

//配置加速器 每个人的加速器都不一样,需要自己去阿里云复制

sudo tee / etc/ docker/ daemon. json <<-’ E0F’
{
’ registry-mirrors": [“https: //xxx.mirror.aliyuncs.com”]
}
EOF

//重启docker的后台线程

sudo systemctl daemon-reload

//重启docker容器

sudo systemctl restart docker

docker基本命令

----------------------------------docker操作----------------------------
查看运行容器
docker ps

查看所有容器
docker ps -a

进入容器
其中字符串为容器ID:

docker exec -it d27bd3008ad9 /bin/bash

1.停用全部运行中的容器:
docker stop $(docker ps -q)

2.删除全部容器:
docker rm $(docker ps -aq)

3.一条命令实现停用并删除容器:
docker stop $(docker ps -q) & docker rm $(docker ps -aq)

删除所有镜像
docker rmi -f $(docker images -qa)

强制删除镜像:
docker image rm -f  id

查看镜像:
docker images

停止指定容器\镜像:
docker stop id

删除指定容器
docker rm id

删除指定镜像:
docker rmi id

拉取镜像-MySQL

1、拉取镜像时的权限不足问题

docker pull mysql:5.7
  • 1.1出现了权限不足
Got permission denied while trying to connect to the Docker daemon socket at unix:// / var/ run/ do
cker. sock: Post http:/ /%2Fvar%2Frun%2Fdouker. sock/vl. 40/ images/ create?fromImage=mysql&tag=5.7
dial unix /var/ run/ docker. sock: connect: permission denied
  • 1.2此时需要在命令前面加上 sudo
sudo docker pull mysql:5.7
  • 1.3也可以直接切换到root用户
su root

拉取镜像时,若果不指定镜像的版本,则默认拉取的是最新的版本

docker pull mysql

也可以拉取指定的版本的镜像

docker pull mysql:5.7

下面是权限不足时出现的问题

Got permission denied while trying to connect to the Docker daemon socket at unix:// / var/ run/ do
cker. sock: Post http:/ /%2Fvar%2Frun%2Fdouker. sock/vl. 40/ images/ create?fromImage=mysql&tag=5. 7
dial unix /var/ run/ docker. sock: connect: permission denied

权限不足时,需要加上sudo

sudo docker pull mysql:5.7

查看拉取的镜像

sudo docker images

创建实例

创建实例并启动

docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

参数说明

docker run 【启动docker容器】

-p 3306:3306 【端口映射,将容器的3306端口映射到主机的3306端口上】 -p:端口映射

–name mysql\【给当前容器起的名称】 --name:为容器起名

-v /mydata/mysql/log:/var/mysql\【将日志文件挂载到主机】 -v:挂载

-v /mydata/mysql/data:/var/lib/mysql\【将配置文件挂载到主机】 -v:挂载

-v /mydata/mysql/conf:/etc/mysql\【将配置文件挂载到主机】 -v:挂载

-e MYSQL_ROOT_PASSWORD=root\【初始化root用户的密码,root为密码,可自行设置】 -e:初始化参数

-d mysql:5.7【-d:以后台的方式运行,要运行的镜像:mysql:5.7】 -d:(创建守护线程)后台运行

查看正在运行的docker镜像

docker ps

修改配置文件my.cnf中的字符编码

vi /mydata/mysql/conf/my.cnf

MySQL配置

在配置文件中敲【i】键进行编辑

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8
[mysqlId]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

修改完后,按Esc然后输入:wq回车,即可保存退出

:wq

配置好之后重启mysql

docker restart mysql

查看配置

进入bash目录

docker exec -it mysql /bin/bash
cd /etc/mysql

进入mysql目录中,此目录有my.cnf配置文件,抓取配置文件中的信息

cat my.cnf

此时可以看到刚刚配置好的信息,输入exit;退出查看命令

exit

到此为止mysql已配置成功,mysql可以正常使用

自动启动

配置指定的容器开启自动启动

sudo update redis restart=always

application.properties

# mysql数据库连接源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://IP地址:3306/数据库名?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

拉取Redis

拉取redis镜像,不选择版本号,默认拉取最新版本的redis

docker pull redis

创建实例并启动

在执行挂载的命令前,需要先创建对应的文件夹,之后输入挂载命令(不创建目录 后期使用redis时容易出问题)

mkdir -p /mydata/redis/conf

touch /mydata/redis/conf/redis.conf

docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf

参数说明

mkdir -p /mydata/redis/conf【首先需要创建好指定的文件夹目录】

docker run 【运行docker容器】

-p 6379:6379【端口映射,将docker中的6379端口映射到主机的端口上】 -p:端口映射

–name redis【为容器起名】

-v /mydata/redis/data:/data \【-v:目录挂载,将容器内部的data 文件夹挂载到Linux的/mydata/redis/data目录里】

-V /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \【将/etc/redis/redis.conf挂载到Linux中指定目录下】

-d --restart=always [配置开机启动]

redis自描述文件

redis自描述文件:
https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf

查看运行的redis镜像

docker ps

进入到conf目录下,查看redis.conf配置文件的信息 并没有配置信息

cd /mydata/redis/conf

cat redis.conf

连接redis客户端

docker exec -it redis redis-cli

测试redis

set a b
get a
exit

参数说明

set a b 在redis中添加数据,set 名称 值

get a 获取a的值

exit 退出redis客户端

此时并未做持久化,重启redis后数据就会丢失

开启持久化

在redis.conf中 配置开启持久化

进入conf目录

cd /mydata/redis/conf
vi redis.conf

进入redis.conf文件中,按【i】键,进行输入,输入一下命令,开启持久化【开启的时AOF模式的持久化】

# 持久化
appendonly yes
# 允许外网访问  yes-不运许外网访问 no-允许
protected-mode no
# 允许后台运行 yes-运行后台运行  no-不运许
# daemonize yes
# 监听访问ip,指定的ip才能访问
# bind 127.0.0.1
# redis访问密码
requirepass moluroot

之后按Esc键wq 保存并退出

输入命令可以抓取查看redis.conf文件中的信息

cat redis.conf

部署Redis集群

该集群有3个节点

#部署Redis集群,该集群有3个节点
docker create --name redis-node01 --restart=always --net host -v redis-node01:/data redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-01.conf --port 6379

docker create --name redis-node02 --restart=always --net host -v redis-node02:/data redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-02.conf --port 6380

docker create --name redis-node03 --restart=always --net host -v redis-node03:/data redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-03.conf --port 6381

#启动容器
docker start redis-node01 redis-node02 redis-node03

#进入redis-node01容器进行操作  组件集群操作
docker exec -it redis-node01 /bin/bash

#组件集群		为0表示没有父节点
redis-cli --cluster create IP地址:6379 IP地址:6380 IP地址:6381 --cluster-replicas 0

#创建多副本集群--了解
#redis-cli --cluster create 192.168.31.81:6379 192.168.31.81:6380 192.168.31.81:6381 192.168.31.81:16379 192.168.31.81:16380 192.168.31.81:16381 --cluster-replicas 1

#进入redis客户端命令行   查看redis节点 
docker exec -it redis-node01 /bin/bash
redis-cli
 
#查询集群信息
127.0.0.1:6379> CLUSTER NODES
4f4fddc825e2387783fff9c972409b264e4df5d5 IP地址:6381@16381 master - 0 1563956537241 3 connected 10923-16383
0616e00533a16e931f8dfb2e8844c35ca5721dc8 IP地址:6380@16380 master - 0 1563956538243 2 connected 5461-10922
498b986e07731cead17ad1c62aa95dba6513c7b0 IP地址:6379@16379 myself,master - 0 1563956537000 1 connected 0-5460

#如果上述步骤出现错误,请重新部署
#重新创建redis容器,因为原有的容器中固定了ip地址的配置
docker stop redis-node01 redis-node02 redis-node03
docker rm redis-node01 redis-node02 redis-node03
#清理挂载数据
docker volume prune
如需远程连接redis,需配置redis端口6379在linux防火墙中开发

/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT

/etc/rc.d/init.d/iptables save

修改安装目录下的redis.conf文件

vim redis.conf

修改以下配置:

#bind 127.0.0.1 # 将这行代码注释,监听所有的ip地址,外网可以访问
protected-mode no # 把yes改成no,允许外网访问
daemonize yes # 把no改成yes,后台运行

Redis集群的连接配置

application.properties

# Redis相关配置
spring.redis.jedis.pool.max-wait = 5000ms
spring.redis.jedis.pool.max-Idle = 100
spring.redis.jedis.pool.min-Idle = 10
spring.redis.timeout = 50s
spring.redis.cluster.nodes=IP地址:6379,IP地址:6380,IP地址:6381

spring.redis.cluster.max-redirects=5

拉取Oracle

搜索查看镜像

docker search oracle

拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

查看镜像

docker images

启动并创建容器

docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

启动容器

docker start oracle11g

清除挂载

如果空间不足可以清理数据:
删除所有dangling数据卷(即无用的Volume):挂载

docker volume rm $(docker volume ls -qf dangling=true)

进入镜像进行配置

docker exec -it oracle11g bash

切换用户

su root
密码:helowin

编辑profile文件

配置ORACLE环境变量

vi /etc/profile

在文件的最后添加以下信息,按【i】添加信息,添加完成后—按【Esc】并输入【:wq】回车保存退出

export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:$PATH

创建软连接

ln -s $ORACLE_HOME/bin/sqlplus /usr/bin

切换用户 – 一定要写中间的内条 - 必须要,否则软连接无效

su - oracle
密码:root

登录sqlplus–修改sys、system用户密码–创建用户

sqlplus /nolog

修改密码 —一条一条的执行

连接
conn /as sysdba
修改密码:
alter user system identified by system; 

alter user sys identified by sys; 

alter user scott identified by scott;

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

创建用户
create user test identified by test; 
并给用户赋予权限
grant connect, resource, dba to test;

完成创建,退出–测试连接

exit

用户名和密码都是system 和 sys

设置总是启动

sudo update oracle restart=always

Navicat连接Oracle

连接名:Oracle11g

连接类型(默认):Basic

主机:主机ip

端口:拉取镜像时配置的映射端口(1521)

服务名:helowinXDB 默认服务名

用户名:system

密码:system

创建新用户首先要进入bash并切换用户

docker exec -it oracle11g bash

su - oracle
密码:root

sqlplus /nolog

连接并创建用户

-- 开始创建用户
conn /as sysdba
-- create 用户名 test identified by 密码; 
create user orcldb identified by orcldb; 
-- 并给用户赋予权限
grant connect, resource, dba to orcldb;

部署MongoDB

通过docker安装MongoDB

#拉取镜像
docker pull mongo:4.0.3

创建容器

#创建容器
docker create --name mongodb --restart=always -p 27017:27017 -v mongodb:/data/db mongo:4.0.3

启动容器

#启动容器
docker start mongodb

进入容器

#进入容器
docker exec -it mongodb /bin/bash

使用MongoDB客户端进行操作

#使用MongoDB客户端进行操作
mongo

查询所有的数据库

#查询所有的数据库
show dbs

show dbs #查询所有的数据库
admin 0.000GB
config 0.000GB
local 0.000GB

MongoDB的连接配置

application.properties

# 应用的工程名
spring.application.name = molu-mongodb	
# 数据库连接的参数
spring.data.mongodb.uri=mongodb://IP地址:27017/数据库名

Mongo坐标依赖

springboot整合MongoDB

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
</dependency>

部署RocketMQ

【注意ip地址一定是自己虚拟机上的IP地址】

拉取镜像

#部署RocketMQ
#拉取镜像
docker pull foxiswho/rocketmq:server-4.3.2
docker pull foxiswho/rocketmq:broker-4.3.2

创建nameserver容器

#创建nameserver容器
docker create -p 9876:9876 --name rmqserver --restart=always \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-e "JAVA_OPTS=-Duser.home=/opt" \
-v rmqserver-logs:/opt/logs \
-v rmqserver-store:/opt/store \
foxiswho/rocketmq:server-4.3.2

创建broker.conf文件

#创建broker.conf文件
mkdir -p /mqdata/rmq/rmqbroker/conf/
vim /rmqdata/rmq/rmqbroker/conf/broker.conf
brokerIP1=IP地址
namesrvAddr=IP地址:9876
brokerName=broker_rmq

创建broker容器

#创建broker容器
docker create -p 10911:10911 -p 10909:10909 --name rmqbroker --restart=always \
-e "JAVA_OPTS=-Duser.home=/opt" \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-v /rmqdata/rmq/rmqbroker/conf/broker.conf:/etc/rocketmq/broker.conf \
-v rmqbroker-logs:/opt/logs \
-v rmqbroker-store:/opt/store \
foxiswho/rocketmq:broker-4.3.2

启动容器

#启动容器
docker start rmqserver rmqbroker

# .Error response from daemon: driver failed programming external connectivity on endpoint rmqbroker (117f5908dbfe80f6a574d3516e972fbb45079bd68000b106c2e97eaf6f427d52):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 10911 -j DNAT --to-destination 172.18.0.2:10911 ! -i docker0: iptables: No chain/target/match by that name
#

启动失败时 重启docker

#启动失败时  重启docker
systemctl restart docker

#停止删除容器
docker stop rmqbroker rmqserver
docker rm rmqbroker rmqserver

部署RocketMQ的管理工具

#部署RocketMQ的管理工具
docker pull styletang/rocketmq-console-ng:1.0.0

创建并启动容器

#创建并启动容器
docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=IP地址:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8082:8080 -t --restart=always styletang/rocketmq-console-ng:1.0.0

【修改虚拟机的IP地址】如果ip地址错误,修改ip

$ vim /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="e44bd448-bfa7-4495-a479-f321bc5c10bc"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="IP地址"  #根据实际情况进行修改
PREFIX="24"
GATEWAY="IP地址"  #根据实际情况进行修改
DNS1="114.114.114.114"
IPV6_PRIVACY="no"

如果上述步骤出现错误,请重新部署

rockermq修改修改配置文件中的内容以及重新创建rocketmq-console-ng容器

RocketMQ的连接配置

application.properties

# RocketMQ相关配置
rocketmq.name-server=IP地址:9876
rocketmq.producer.group=组名

Zookeeper部署

拉取zk镜像

########### ZK的部署安装 #################

#拉取zk镜像
docker pull zookeeper:3.5

创建容器

#创建容器
docker create --name zk -p 2181:2181 zookeeper:3.5

启动容器

#启动容器
docker start zk

在服务实现模块中配置:application.properties

# Spring boot application
spring.application.name = my_tanhua_dubbo_service

dubbo.scan.basePackages = com.tanhua.dubbo.server 
dubbo.application.name = dubbo-provider-tanhua

# dubbo服务
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880

# zookeeper注册中心的地址
dubbo.registry.address = zookeeper://IP地址:2181
dubbo.registry.client = zkclient

# mongodb 数据库的地址和库名 库名
spring.data.mongodb.uri=mongodb://IP地址:27017/库名

部署安装nginx

安装包在资料中:nginx-1.17.3.zip

安装在任意目录,通过命令:start nginx.exe 启动:

启动

start nginx.exe

重启加载

重启加载配置文件命令:nginx.exe -s reload

nginx.exe -s reload

修改配置

修改conf目录下的nginx.conf文件:

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        #error_page  404              /404.html;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location /user {
            proxy_pass   http://127.0.0.1:18080;
        }

        location / {
            proxy_pass   http://127.0.0.1:18081;
        }

    }

FastDFS环境部署

docker容器和宿主机使用同一个网络,这样就无需做端口映射

–network=host docker容器和宿主机使用同一个网络

拉取镜像

#拉取镜像
docker pull delron/fastdfs

创建tracker容器

#创建tracker容器
docker create --network=host  --name tracker --restart=always -v fdfs-tracker:/var/fdfs delron/fastdfs tracker
#启动容器
docker start tracker

创建storage容器

#创建storage容器
docker create --network=host  --name storage --restart=always -e TRACKER_SERVER=IP地址:22122 -v fdfs-storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage

#启动容器
docker start storage

进入storage容器

#进入storage容器,到storage的配置文件中配置http访问的端口,配置文件在/etc/fdfs目录下的storage.conf。
docker exec -it storage /bin/bash

#默认的http端口为8888,可以修改也可以配置
# the port of the web server on this storage server
http.server_port=8888

配置nginx

#配置nginx,在/usr/local/nginx目录下,修改nginx.conf文件
#默认配置如下:

    server {
        listen       8888;
        server_name  localhost;
        location ~/group[0-9]/ {
            ngx_fastdfs_module;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root html;
        }
    }

#默认的存储路径为/var/fdfs/data

FastDFS连接的配置

application.properties

# ===================================================================
# 分布式文件系统FDFS配置
# ===================================================================
fdfs.so-timeout = 1501
fdfs.connect-timeout = 601
#缩略图生成参数
fdfs.thumb-image.width= 150
fdfs.thumb-image.height= 150
#文件的大小限制
spring.servlet.multipart.max-file-size=30MB
spring.servlet.multipart.max-request-size=30MB
#TrackerList参数,支持多个
fdfs.tracker-list=IP地址:22122
#访问路径
fdfs.web-server-url=http://IP地址:8888/

导入依赖

<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.26.7</version>
    <exclusions>
        <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </exclusion>
    </exclusions>
</dependency>