Linux安装Docker学习笔记

目录

1、检查Linux版本 

2、卸载旧版本

3、安装gcc相关

4、安装需要的软件包

5、设置镜像仓库

6、更新yum软件包索引

7、安装docker-ce

8、启动docker

9、测试

10、配置阿里云镜像加速器

11、卸载docker

12、docker常用命令

13、搭建本地私有镜像仓库

14、阿里云远程镜像仓库

15、容器卷的映射和继承

16、拉取MySQL镜像创建MySQL容器

17、拉取redis镜像并创建容器

18、docker高级篇之mysql主从复制

19、docker高级篇之redis3主3从集群配置

20、Dockerfile构建

21、Network

22、docker-compose

23、安装Portainer可视化工具

24、容器监控工具 

25、遇到的问题处理方法


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内核成功解决

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值