目录
1、检查Linux版本
#必须CentOS7以上版本
cat /etc/redhat-release
2、卸载旧版本
yum docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3、安装gcc相关
yum -y install gcc
yum -y install gcc-c++
4、安装需要的软件包
yum -y install yum-utils
5、设置镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
6、更新yum软件包索引
yum makecache fast
7、安装docker-ce
yum install docker-ce docker-ce-cli containerd.io
8、启动docker
systemctl start docker
9、测试
docker version
10、配置阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://pbme6kow.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
11、卸载docker
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
12、docker常用命令
#启动docker相关命令
systemctl start docker
systemctl stop docker
systemctl status docker
systemctl restart docker
systemctl enable docker
#查看概要信息
docker info
#查看帮助文档
docker --help
#查看本地镜像
docker images
#查找镜像
docker search xx
#拉取镜像
docker pull xx:1.0
#查看镜像/容器占用空间
docker system df
#删除镜像
docker rmi -f xx:版本/id
#运行容器
docker run xx --name demo1
#查看正在运行的容器
docker ps
#退出容器
exit #容器停止
ctrl+p+q容器不停止
#进入容器
docker exec -it xxid /bin/bash
#启动停止删除
docker start xx
docker stop xx
docker restart xx
docker kill xx
docker rm id
#容器添加命令
#进入容器,更新包管理工具
apt-get update
#安装需要的命令
apt-get install xx
#保存为新镜像
docker commit -m="add ..." -a="fly" xxid newname:1.0
#拷贝容器文件到本地
docker cp 容器id:文件路径 本地路径
#导入导出容器,用于容器备份
docker export 容器id > /abc.tar
cat /abc.tar | docker import - abc:1.0
13、搭建本地私有镜像仓库
#拉取registry镜像
docker pull registry
#运行registry容器,为了防止容器被删除后,导致数据丢失,使用-v进行主机和容器的数据卷映射
docker run -d -p 5000:5000 -v /myregistry/:/tmp/registry --privileged=true registry
#修改配置文件以支持http
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://pbme6kow.mirror.aliyuncs.com"],
"insecure-registries":["192.168.100.10:5000"]
}
#创建TAG,模板:docker tag 镜像名称:版本 创建后的名称:版本
docker tag hello-world:1.0 192.168.100.10:5000/hello-world:1.0
#push到本地仓库
docker push 192.168.100.10:5000/hello-world:1.0
#查看本地镜像仓库的镜像
curl -XGET http://192.168.100.10:5000/v2/_catalog
#拉取本地仓库镜像
docker pull 192.168.100.10:5000/hello-world:1.0
14、阿里云远程镜像仓库
# 登录阿里云Docker Registry
docker login --username=Fly9499 registry.cn-hangzhou.aliyuncs.com
#从Registry中拉取镜像,fly-demo1为命名空间,nginx1.0为仓库名称
docker pull registry.cn-hangzhou.aliyuncs.com/fly-demo1/nginx1.0:[镜像版本号]
#将镜像推送到Registry
docker login --username=Fly9499 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/fly-demo1/nginx1.0:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/fly-demo1/nginx1.0:[镜像版本号]
15、容器卷的映射和继承
#容器卷映射
docker run -d -p 80:80 --name=n1 --privileged=true -v /test:/tmp/test nginx
#n2继承n1
docker run -d -p 81:81 --name=n2 --privileged=true --volumes-from n1 nginx
#此时的本机目录/test和n1、n2的/tmp/test目录是共享的。无论n1、n2哪一个挂掉后,都不影响另一个容器的数据卷映射;当挂掉的容器恢复后,映射数据卷也会恢复同步。
16、拉取MySQL镜像创建MySQL容器
docker search mysql
docker pull mysql:5.7.36
#简易版启动
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.36
#安全版启动
docker run -d -p 3306:3306 --privileged=true \
-v /home/mysql/log:/var/log/mysql \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.36
#解决编码问题
cd /home/mysql/conf
vi my.cnf
#添加下面内容
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
docker exec -it id /bin/bash
mysql -uroot -p123456
17、拉取redis镜像并创建容器
docker pull redis:6.0.8
#创建映射数据卷目录
mkdir /home/redis/
#拷贝一个redis配置文件到这个目录
cp /usr/local/software/redis/redis.conf /home/redis/
#修改redis.conf
1.注释掉bind 127.0.0.1
2.daemonize yes --> daemonize no
#启动
docker run -d -p 6379:6379 --privileged=true \
-v /home/redis/redis.conf:/etc/redis/redis.conf \
-v /home/redis/data:/data
redis:6.0.8 redis-server /etc/redis/redis.conf
18、docker高级篇之mysql主从复制
#1.启动mysql-master容器
docker run -d -p 3307:3306 --privileged=true --name=mysql-master \
-v /home/mysql-master/log:/var/log/mysql \
-v /home/mysql-master/data:/var/lib/mysql \
-v /home/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.36
#2.编辑my.cnf文件
vi /home/mysql-master/conf/my.cnf
[mysqld]
#―设置server_id ,同一局域网中需要唯一
server_id=101
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能
log-bin=mysql-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#二进制日志过期清理时间。默认为0,表示不自动清理
expire_logs_days=7
#跳过主从复制中遇到的所有错误或者指定类型的错误,避免slave端复制中断
#如:1062错误表示主键重复;1032表示主从数据库数据不一致
slave_skip_errors=1602
#3.重启容器
docker restart mysql-master
#4.进入mysql容器,创建用户并授权
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
flush privileges;
#5.查看position的值
show master status;
#6.启动mysql-slave容器
docker run -d -p 3308:3306 --privileged=true --name=mysql-slave \
-v /home/mysql-slave/log:/var/log/mysql \
-v /home/mysql-slave/data:/var/lib/mysql \
-v /home/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.36
#7.编辑my.cnf文件
vi /home/mysql-slave/conf/my.cnf
[mysqld]
# 设置server_id,同一局域网中需要唯一
server_id=102
# 指定不需要同步的数据库名称
binlog-ignore-db=mysql
# 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mysql-slave-bin
# 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
# 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
# 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# relay_log配置中继日志
relay_log=mall-mysql-relay-bin
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
# slave设置为只读(具有super权限的用户除外)
read_only=1
#8.重启容器
docker restart mysql-slave
#9.进入mysql-slave容器并登录mysql,执行主从复制配置命令
change master to master_host='192.168.100.10', master_user='slave', master_password='123456', master_port=3307, master_log_file='mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
#参数解释
#master_host:主数据库的IP地址
#master_port:主数据库的运行端口
#master_user:主数据库中用于同步数据的用户账号
#master_password:主数据库中用于同步数据的用户密码
#master_log_file:指定从数据库要复制的日志文件,在主数据库查看状态获取file参数
#master_log_pos:指定从数据库从哪个位置开始复制数据,在主数据库查看状态获取file参数
#master_connect_retry:链接失败重试的时间间隔,单位为秒
#10.在slave查看主从同步状态
show slave status;
#或者show slave status \G;
#Slave_IO_Running和Slave_SQL_Running的值为YES表示已经同步
#11.在slave开启主从同步
start slave;
show slave status \G;
19、docker高级篇之redis3主3从集群配置
#创建6个Redis容器实例
docker run -d --name=redis-1 --net host --privileged=true -v /home/redis-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name=redis-2 --net host --privileged=true -v /home/redis-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name=redis-3 --net host --privileged=true -v /home/redis-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name=redis-4 --net host --privileged=true -v /home/redis-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name=redis-5 --net host --privileged=true -v /home/redis-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name=redis-6 --net host --privileged=true -v /home/redis-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
#--cluster-enabled是否开启集群
#--appendonly是否持久化
#进入任意一个容器
redis-cli --cluster create 192.168.100.10:6381 192.168.100.10:6382 192.168.100.10:6383 192.168.100.10:6384 192.168.100.10:6385 192.168.100.10:6386 --cluster-replicas 1
#--cluster-replicas 1 表示主从一对一
redis-cli -p 6381
#查看状态
cluster info
cluster nodes
#参数c防止路由失效
redis-cli -c -p 6381
#主从扩容
docker run -d --name=redis-7 --net host --privileged=true -v /home/redis-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name=redis-8 --net host --privileged=true -v /home/redis-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
#进入redis-7
redis-cli --cluster add-node 192.168.100.10:6387 192.168.100.10:6381
#重新分配槽号,槽号并不是按顺序重新分配,而是原有每个master分出前面一段槽号,组合成新的master槽号
redis-cli --cluster reshard 192.168.100.10:6381
#将redis-8添加为redis-7的从节点
redis-cli --cluster add-node 192.168.100.10:6388 192.168.100.10:6387 --cluster-slave --cluster-master-id [redis-8的编号]
#主从缩容
redis-cli --cluster del-node 192.168.100.10:6388 [redis-8的编号]
redis-cli --cliuster check 192.168.100.10:6382
redis-cli --cluster reshard 192.168.100.10:6381
redis-cli --cluster del-node 192.168.100.10:6387 [redis-7的编号]
redis-cli --cliuster check 192.168.100.10:6382
20、Dockerfile构建
FROM | 基础镜像 |
MAINTAINER | 镜像维护者姓名和邮箱 |
RUN | 构建容器时执行(docker build) |
EXPOSE | 容器对对外暴露的端口 |
WORKDIR | 进入容器后的默认工作目录 |
USER | 以哪个用户执行,默认root |
ENV | 设置环境变量 |
ADD | 将主机的文件拷贝到镜像并解压到对应目录 |
COPY | 将主机的文件拷贝到镜像对应目录 |
VOLUME | 数据容器卷,用于数据保存和持久化工作 |
CMD | 容器启动时执行的命令 |
ENTRYPOINT | 容器启动时执行的命令 |
实例:
1.准备一个jar包到当前目录
2.vi Dockerfile新建并编辑Dockerfile文件
FROM java:8
MAINTAINER fly <123456@123.com>
ADD demo-1.0.jar app.jar
CMD java -jar app.jar
EXPOSE 8080
3.docker build -f ./Dockerfile -t java-app:1.0 .
21、Network
docker network ls
docker inspect
docker network inspect bridge
#自定义网络,容器之间可以使用容器名进行访问
docker network create xx_network
docker network rm xx_network
22、docker-compose
#下载安装
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
#卸载
rm -rf /usr/local/bin/docker-compose
#常用命令
#启动所有docker-compose服务
docker-compose up
#启动所有docker-compose服务并后台运行
docker-compose up -d
#停止并删除容器、网络、卷、镜像
docker-compose down
#进入容器实例内部
docker-compose exec yml文件的服务id /bin/bash
#查看docker-compose运行的容器
docker-compose ps
#查看docker-compose容器进程
docker-compose top
#查看容器日志
docker-compose logs yml文件的服务id
#检查配置
docker-compose config
#检查配置,有问题才有输出
docker-compose config -q
#启动停止重启
docker-compose start
docker-compose stop
docker-compose restart
docker-compose.yml文件
version: "3"
services:
microService:
image: app:1.0
container_name: app
ports:
- "8080:8080"
volumes:
- /app/microService:/data
networks:
- app_network
depends_on:
- mysql
- redis
redis:
image: redis:6.0.8
container_name: redis
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
network:
- app_network
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7.36
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'app'
MYSQL_USER: 'fly'
MYSQL_PASSWORD: '123456'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- app_network
command: --default-authentication-plugin=mysql_native_password
networks:
app_network
23、安装Portainer可视化工具
docker run -d -p 9000:9000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
24、容器监控工具
docker-compose.yml
version: '3.1'
volumes:
grafana_data:{}
services:
influxdb:
image: influxdb:0.9
restart: always
environment:
-PRE_CREATE_DB=cadvisor
ports:
-"8083:8083"
-"8086:8086"
vloumes:
-./data/influxdb:/data
cadvisor:
image: cadvisor
links:
-influxdb: influxsrv
command: -storage_driver=fluxdb-storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
restart: always
ports:
-"8080:8080"
vloumes:
-/:/rootfs:ro
-/var/run:/var/run:rw
-/sys:/sys:ro
-/var/lib/docker/:/var/lib/docker:ro
frafana:
user: "104"
image: grafana
user: "104"
restart: always
links:
-influxdb:influxsrv
ports:
-"3000:3000"
vloumes:
-grafana_data:/var/lib/grafana
environment:
-HTTP_USER=admin
-HTTP_PASS=admin
-INFLUXDB_HOST=influxsrv
-INFLUXDB_PORT=8086
25、遇到的问题处理方法
遇到下列问题可以重新设置网桥网卡解决:
1.启动容器,访问不到相应的端口
2.mysql主从复制时,Slave_IO_Running为Connecting的情况
#关闭docker服务
systemctl stop docker
#设置docker0
ip link set dev docker0 down
#删除docker0网桥
brctl delbr docker0
#添加docker0网桥
brctl addbr docker0
#添加网卡
ip addr add 172.16.10.0/24 dev docker0
#重启网卡
ip link set dev docker0 up
#重启docker服务
systemctl restart docker;
3.使用自定义网络运行容器时,宿主机无法访问容器服务
使用上面的办法依旧无法解决,更新Linux内核成功解决