Docker

Docker容器

官方介绍文档 https://docs.docker.com/get-started/

预备

旧版本的 Docker 被称为dockerdocker-engine,需要清理掉

Docker引擎包现在称为docker-ce,/var/lib/docker/目录下的images, containers, volumes, and networks都被保留

# 卸载旧版本的docker
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安装

设置本地仓库

# 安装工具
$ yum install -y yum-utils
# 设置远端仓库
$ yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
$ yum install docker-ce docker-ce-cli containerd.io
# 启动docker
$ systemctl start docker
# 运行镜像验证是否安装成功
$ docker run hello-world

卸载

# 卸载 Docker 引擎、CLI 和 Containerd 软件包
$ yum remove docker-ce docker-ce-cli containerd.io
# 主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷:
$ rm -rf /var/lib/docker
$ rm -rf /var/lib/containerd

架构

https://docs.docker.com/engine/images/architecture.svg

组成

镜像

UnionFS
虚悬镜像

仓库和标签都为的镜像,直接删除

# 查看
docker image ls -f dangling=true
# 批量清理
docker image prune

容器

容器数据卷
# 运行一个代容器卷存储功能的容器实例
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器目录:rw 镜像名
:rw # 限制容器读写终止(默认)
:ro # 限制容器只读
--volumes-from 父容器 # 继承一个父类容器的容器卷
  • 挂载的宿主机目录和容器目录之间数据双向互通
  • 彼此之间修改实时同步
  • 容器stop;start仍然数据一致

仓库

registry私有库搭建

docker默认https安全传输,为了支持http传输,需要vi /etc/docker/daemon.json

{
"insecure-registries": [
"http://192.168.50.177:5000"
]
}

# 搭建docker私服库并新建镜像推送到私服库上
docker pull registry # 
docker run -d -p 5000:5000 -v /opt/myregistry/:/tmp/registry --privileged=true registry # 启动私有库
docker tag awuubuntu:1.1 192.168.50.177:5000/awuubuntu:1.1 #将新镜像awuubuntu:1.1修改为符合私服规范的Tag
docker push 192.168.50.177:5000/awuubuntu:1.1 # 推送
curl -XGET http://192.168.50.177:5000/v2/_catalog # 查看到私有库中已推送成功
docker pull 192.168.50.177:5000/awuubuntu:1.1 # 重新拉取

Dockerfile

FROM centos:7
MAINTAINER AUW<XXX@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

# 安装vim编辑器
RUN yum -y install vim
# 安装ifconfig命令
RUM yum -y install ifconfig
# 安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
# ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java
#配置环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_1717
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

# 端口
EXPOSE 80

CMD echo $MYPATH
CMD echo "success.............ok"
CMD /bin/bash
# 注意后面有个. 表示当前目录
docker build -t 新镜像名称:TAG .

NetWork

网络模式

  • bridge
  • host 仅主机
  • none (禁用网络功能)
  • container(新建的容器和一个已经存在的容器共享一个网络ip配置)
  • 自定义网络 (容器之间通过ip可以相互访问(ping ip),但不能通过容器名访问(ping containerName))
# 创建一个新的容器与指定id/name的容器共用网络(如果指定容器stop,新建的容器网络会受影响)
docker run -d -p 8080:8080 --network --container:id/name --name tomcatName image

# 指定网络,相互之间可以通过containerName访问
docker run -d -p 8080:8080 --network netWorkName --name tomcatName image 

Compose

容器编排工具 docker-compose.yml

指令

systemctl enable docker # 开机启动
systemctl start docker # 启动
systemctl status docker # 查看运行状态
systemctl stop docker # 停止
systemctl restart docker # 重启 

镜像命令

官方命令API

docker images # 列出本地所有镜像
docker search imgName  # 查找镜像  
docker pull imgName # 拉取镜像
docker systerm df # 查看docker系统状态
docker rmi imgName # 删除镜像
docker run imgName# 创建该镜像的一个容器
        --name=容器新名称 # 指定容器名称
        -i # 以交互模式运行容器,通常与-t一起使用
        -t # 为容器重新分配一个伪输入终端
        -P # 随机端口映射 
        -p # 指定端口(-p 8080:80)
        -d # 后台守护式启动
容器命令
docker ps # 列出当前所有正在运行的容器
		-a # 列出所有容器,包括已停止的
docker stop ctID|ctName # 停止容器(可start恢复)
docker kill ctID|ctName # 强制停止容器(可start恢复)
docker start ctID|ctName # 启动已停止运行的容器
docker rm ctID|ctName # 删除已停止运行的容器
	docker rm $(docker ps -qf status=exited)  # 删除所有已停止的容器
docker top ctID|ctName # 查看容器系统
docker inspect ctID|ctName # 查看容器系统详情
docker exec -it ctID|ctName /bin/bash # 重新进入容器交互式命令行(在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器停止)
docker attach ctID|ctName # 同上(直接进入容器命令终端,不会启动新的进程,exit退出会导致容器停止)
docker cp ctId:容器路径 主机路径 # 拷贝文件(容器 -> 主机)
docker export ctId > 文件名.tar # 导出整个容器到主机中
cat 文件名.tar | docker import - 镜像用户/镜像名:Tag # 将tar包导入成镜像
docker commit -m="commit msg" -a="author" ctId 镜像用户/镜像名:Tag # 提交容器实例成镜像
容器交互式终端命令
# 以docker容器方式启动ubuntu系统并进入
[root@localhost ~]# docker run -it ubuntu /bin/bash
# 从ubuntu系统中退出,系统终止
root@788350367adbb:/# exit
# 从ubuntu系统中退出,系统仍在运行
root@788350367adbb:/# ctl+p+q

FROM 基础镜像,当前新镜像是基于哪个镜像

MAINTAINER 镜像维护者的姓名和邮箱

RUN

EXPOSE 当前容器对外暴露的端口

WORKDIR

USER

ENV

ADD

COPY

VOLUME

CMD

ENTRY

web环境搭建

安装tomcat

 # 注意tomcat10需要将webapps.dist目录改为webapps
 docker run -d -p 8080:8080 --name t1 tomcat

安装mysql

# 创建mysql容器
docker run -d -p 3306:3306 --privileged=true -v /app/mysql/log:/var/log/mysql -v /app/mysql/data:/var/lib/mysql -v /app/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql5.7 mysql:5.7
# 进入mysql
docker exec -it 75654997d282 /bin/bash 
# 连接
mysql -uroot -p 
	mysql> show database;
	mysql> create database db01;
	mysql> use db01;
	mysql> create table t_user(id int, name varchar(20));
	mysql> insert into t_user values(123456, 'myname');
	mysql> select * from t_user;
mysql主从复制

主机配置

  • /app/mysql-master/conf/my.cnf配置文件设置
[mysqld]
## 设置server_id 同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间,默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是应为主从数据库不一致
slave_skip_errors=1062
  • 主服务器内创建数据同步用户

    create user 'slave'@'%' identified by '123456';

    grant replication slave, replication client on *.* to 'slave'@'%';

从机配置

  • /app/mysql-master/conf/my.cnf配置文件设置
[mysqld]
server_id=102
binlog-ignore-db=mysql
log-bin=mall-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
## 配置中继日志
relay_log=mall-mysql-relay-bin
## 表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
change master to master_host='宿主机ip',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=617,master_connect_retry=30;

show master status;
// 主机中执行

+-----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000001 | 154 | | mysql | |
+-----------------------+----------+--------------+------------------+-------------------+

show slave status \G; // 从机中执行

start slave; // 开启

-- 执行show slave status \G; 后都显示Yes表示开启主从复制成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

安装redis

# 创建
docker run -d -p 6379:6379 --name redis \
		--privileged=true \
		-v /app/redis/redis.conf:/etc/redis/redis.conf \
		-v /app/redis/data:/data 0e403e3816e8 \
		redis-server \
		/etc/redis/redis.conf
# 进入交互界面
docker exec -it redis /bin/bash
	# redis控制台
	redis-cli -p 6379
Redis集群配置案例
  • 3主3从redis集群搭建

    # 创建6个redis容器
    $ docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis --cluster-enabled yes --appendonly yes --port 6381
    $ docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis --cluster-enabled yes --appendonly yes --port 6382
    $ docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis --cluster-enabled yes --appendonly yes --port 6383
    $ docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis --cluster-enabled yes --appendonly yes --port 6384
    $ docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis --cluster-enabled yes --appendonly yes --port 6385
    $ docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis --cluster-enabled yes --appendonly yes --port 6386
    
    # 命令解释
    --net host :使用宿主机的ip和端口,默认
    --privileged=true :获取宿主机root用户权限
    --cluster-enabled yes :开启redis集群
    --appendonly yes :开启持久化
    --port 6381 :redis端口号
    
    # 进入一台redis机器中建立主从关系-3M3S
    docker exec -it redis-node-1 /bin/bash
    redis -cli --cluster create 192.168.50.177:6381 192.168.50.177:6382 192.168.50.177:6383 192.168.50.177:6384 192.168.50.177:6385 192.168.50.177:6386 --cluster-replicas 1
    
    # 以6381作为切入点查看集群
    redis-cli -p 6381
    > cluster info  # 显示集群状态
    > cluster nodes # 节点信息,可以查看主从关系
    > set k1 v2 # (error) MOVED 12706 192.168.50.177:6383
    
  • 插入,检查

    redis-cli --cluster check 192.168.50.177:6381  # 检查集群信息
    redis-cli -p 6381 -c	# 以集群方式操作
    > set k1 v1  # Redirected to slot [12706] located at 192.168.50.177:6383 OK
    
  • node-1宕机,node-4上位;node-1恢复后(node-1为slave,node-4为master);若要node-1仍为master,重启node-4

  • 扩容,4主4从

    # 新建6387,6388两个节点,启动
    docker run -d --name redis-node-7 --net host --privileged=true -v /app/redis/share/redis-node-7:/app redis --cluster-enabled yes --appendonly yes --port 6387
    docker run -d --name redis-node-8 --net host --privileged=true -v /app/redis/share/redis-node-8:/app redis --cluster-enabled yes --appendonly yes --port 6388
    
    # 将新增的6387作为master节点加入集群
    redis-cli --cluster add-node 192.168.50.177:6387 192.168.50.177:6381
    # 检查 OK 4台M(但新节点还未有slots)
    redis-cli --cluster check 192.168.50.177:6387
    # 重新分配slots且重新均分(原3个master节点各分配一部分slots给新增的节点)
    redis-cli --cluster reshard 192.168.50.177:6381
    How many slots do you want to move (from 1 to 16384)? 4096
    What is the receiving node ID? ff2f94c560ad9d431def1d1555ba622d00215179
    Please enter all the source node IDs.
      Type 'all' to use all the nodes as source nodes for the hash slots.
      Type 'done' once you entered all the source nodes IDs.
    Source node #1: all
    # 添加新增节点的从节点
    redis-cli --cluster add-node 192.168.50.177:6388 192.168.50.177:6387 --cluster-slave --cluster-master-id ff2f94c560ad9d431def1d1555ba622d00215179
    
  • 缩容

    # 1. 先清除6388从节点
    redis-cli --cluster del-node 192.168.50.177:6388 1e9a01c1b68747ccdb7939a3ec54354f59ab6797
    

    # 清除6387主节点的槽号,重新分配
    redis-cli --cluster reshard 192.168.50.177:6381
    # 移除多少个槽位
    How many slots do you want to move (from 1 to 16384)? 4096
    # 输入槽位接收者的节点ID
    What is the receiving node ID? 4a2548af3fdd40a746c5c8f498edf4563cd15e25
    # 输入要移除槽位节点ID,此处是6387节点
    Please enter all the source node IDs.
      Type 'all' to use all the nodes as source nodes for the hash slots.
      Type 'done' once you entered all the source nodes IDs.
    Source node #1: ff2f94c560ad9d431def1d1555ba622d00215179
    Source node #2: done
    

    ​ 重新分配slot后查看当前节点情况:

# 删除6387主节点
redis-cli --cluster del-node 192.168.50.177:6387ff2f94c560ad9d431def1d1555ba622d00215179
posted @ 2022-08-30 15:29  不文不问  阅读(30)  评论(0编辑  收藏  举报