Bill - Docker
type: channel
link: https://www.webpro.ltd/index.php/tag/Docker/
items: 基于Docker容器的Linux C/C++编译环境
items: Docker Overlay2 磁盘空间占用过大清理
items: Docker集群部署MySQL、Redis集群实例
items: Docker学习笔记

基于Docker容器的Linux C/C++编译环境
type: item
date: 2024-02-04T17:28:00+08:00
description: C/C++编译时经常需要配置环境，有的时候不想安装在本机上，环境太多容易混乱，安装步骤麻烦，出错也不好撤销修改。我最近在学习Linux C/C++，但是我的电脑是win10系统，正好可以结合vscode+VMware+Docker+SSH做出一套Linux下面的C/C++编译环境，配置方便快捷安装软件及功能列表gccg++gdbmakemanpsmisc(killall命令)openssh-servervsftpd(FTP服务)编写Dockerfile文件进入到~目录，创建cpp_env文件夹，创建Dockerfile文件cd ~ mkdir cpp_dev cd cpp_dev vi Dockerfile粘贴以下内容脚本中的developer为账号脚本中的password为密码# 使用最新的Ubuntu镜像作为基础镜像 FROM ubuntu:22.04 # 禁用SELinux ENV container SELINUX=disabled # 更换为阿里云的Ubuntu存储库镜像，以加速更新 RUN sed -i 's/http:\/\/archive.ubuntu.com/http:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list # 创建SSH目录并更新apt包列表 RUN mkdir /run/sshd && \ apt-get update && \ apt-get install -y gcc g++ gdb make man psmisc openssh-server vsftpd && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # 创建一个新用户（这里使用了用户名为bill，您可以更改为您喜欢的用户名） RUN useradd -m -s /bin/bash bill && \ echo 'bill:bill' | chpasswd && \ usermod -aG sudo bill # 允许SSH远程连接 RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config && \ sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config # 配置vsftpd RUN echo "local_enable=YES" >> /etc/vsftpd.conf && \ echo "write_enable=YES" >> /etc/vsftpd.conf && \ echo "local_umask=022" >> /etc/vsftpd.conf && \ echo "chroot_local_user=YES" >> /etc/vsftpd.conf && \ echo "pasv_enable=YES" >> /etc/vsftpd.conf && \ echo "pasv_min_port=30000" >> /etc/vsftpd.conf && \ echo "pasv_max_port=30009" >> /etc/vsftpd.conf && \ echo "allow_writeable_chroot=YES" >> /etc/vsftpd.conf && \ echo "local_root=/home/bill/ftp" >> /etc/vsftpd.conf # 创建FTP所需目录并设置权限 RUN mkdir -p /var/run/vsftpd/empty && \ chmod 555 /var/run/vsftpd/empty # 允许外部连接 EXPOSE 22 21 30000-30009 # 启动SSH和FTP服务器 CMD ["/bin/bash", "-c", "/usr/sbin/sshd && /usr/sbin/vsftpd /etc/vsftpd.conf"]打包成Docker镜像sudo docker build -t my_cpp_env .运行容器所有容器的端口号均设置2200的偏移量，例如SSH端口号为2222，避免与宿主机冲突设置启动参数--restart always，容器总是随着主机启动而启动-v /home/bill:/home/bill 将本地主机的 /home/bill 文件夹映射到容器内的 /home/bill 文件夹容器的22端口（SSH端口）映射到主机的22端口，将20和21端口（FTP端口）映射到主机的20和…

Docker Overlay2 磁盘空间占用过大清理
type: item
date: 2023-10-13T21:29:00+08:00
description: 我使用的服务器集群架构是三节点Docker Swarm，一主二从。基于Percona XtraDB Cluster（PXC），以及haproxy+keepalived配置了MySQL高可用架构，当然也是三节点的MySQL。今天我通过Haproxy面板，看到第三台服务器的MySQL离线了（pxc03），于是登录到服务器上查看容器的运行日志，别的英文没细看，一眼就看到了no space left，无存储空间了，df -h查看目录占用百分比100%，显然是/目录的磁盘空间满了，下一步就是排查是哪些程序占用了大部分磁盘。linux怎么查看文件夹多大1、利用ls命令查看，该命令可将结果以KB、MB等为单位进行显示，语法为ls -ll或ls-lh；2、利用du -h –max-depth=1 *命令，该命令可查看当前目录下的各个文件和文件夹的大小；3、利用du -sh命令，可查看当前文件夹的总大小；4、利用du -h –max-depth=0 *命令，可查看直接子目录文件及文件夹大小。通过查看是/var/lib/docker占用空间过大，通过进一步查看是/var/lib/docker/overlay2目录占用空间大，高达12GB。我之前在另外一台服务器上遇到了这种情况，当时我的解决方案是把安装在根目录的docker迁移到home下，因为home挂在的磁盘容量较大，但是这种做法是错误的，治标不治本，即使是迁移了docker安装目录，但是也没有把占用空间大的问题解决，我们需要寻找问题的根本原因，从根本解决这个问题。第一种情况：是因为docker中部署的系统中日志内容的不断扩大。这种情况下，我们可手动，或定时任务清理。对于/var/lib/docker/overlay2 空间占用，存在很多误导的方法是去迁移路径等。。其实磁盘空间的占用和overlay没关系，它的使用和真实的disk使用相同，overlay只是一个docker的虚拟文件系统，真实的文件系统是前者/dev/vda1,可以看到路径所指为根目录。所以，通过该目录去查找哪里占用资源过大。通常情况下与overlay2的同级目录下会有如下的目录：占用大量空间的日志文件位于containers下，该目录下存在如下目录：在该目录下，会存在以目录名为前缀，以“-json.log”为后缀的目录文件。例如：使用如下命令会看到该文件的大小：ll -h然后，使用> *-json.log，将该文件进行清理清理完成可不重启服务，重启更好清理完后，可通过df -h查看磁盘占用情况第二种情况：可通过执行docker system prune命令可用于清理磁盘，删除关闭的容器、无用的数据卷和网络，以及dangling镜像（即无tag的镜像），我的情况就是这种情况，docker中存在大量废弃的镜像docker system pruneDocker中查询磁盘占用情况：这个图片是清理后的截图，清理之前多出来10G+，忘记截图了docker system prune -a【慎用】命令清理更干净、彻底，可以将没有容器使用的Docker镜像都删掉。也可以使用Docker的图形化管理工具——Portainer进行查看清理参考资料Docker篇之Overlay2磁盘空间占用过大清理

Docker集群部署MySQL、Redis集群实例
type: item
date: 2022-11-11T11:31:00+08:00
description: Docker集群部署MySQL、Redis集群实例简介需要具备的基础MySQL数据库开发能力了解Redis，会简单操作了解Linux指令，能在Linux上安装卸载软件哪里需要集群？前后端分离部署图项目Demorenrenfast开源前后端项目Linux基础强化firewalld防火墙centos7默认安装了firewalld防火墙通过防火墙允许或限制数据的通过管理防火墙查看状态firewall-cmd --state启动、关闭、重启防火墙service firewall start service firewall stop service firewall restart端口管理# 开放 firewall-cmd --permanent --add-port=8080-8085/tcp # 重新加载防火墙配置 firewall-cmd --reload # 关闭端口，要与之前写的add时开放的端口范围相同，不能开放多个端口，只关闭一个端口 firewall-cmd --permanent --remove-port=8080-8085/tcp查看开启的端口firewall-cmd --permanent --list-ports查看使用网络的服务firewall-cmd --permanent --list-services云计算中的DockerDocker容器管理命令Docker镜像导入导出docker save java > /home/java.tar.gz docker load java < /home/java.tar.gzDocker暂停 停止容器docker pause container-name docker unpause container-name docker stop container-name docker start -i container-nameMySQL集群搭建常见MySQL集群方案选用PXC集群方式。PXC原理PXC（Percona XtraDB Cluster）任何一个节点都可读可写建议PXC使用Percona Server（MySQL改进版，性能提升很大）PXC与Replication方案对比PXC的数据强一致性PXC同步复制，事务在所有集群节点要么同时提交，要么不提交Replication采用异步复制，无法保证数据一致性PXC集群安装最新的PXC版本是PXC8.0，即对应MySQL8.0。本实验使用PXC5.7，即对应MySQL5.7，主要是因为大部分项目都采用的MySQL5.7 实验版本最新版本PXC5.78.0XtraBackup2.48.0 节点分配物理机IP: 10.248.192.137Docker内部网段子网掩码：172.18.0.0/24节点docker内部IP映射物理机端口MySQL-node1172.17.0.23306MySQL-node2172.17.0.33307MySQL-node3172.17.0.43308MySQL-node4172.17.0.53309MySQL-node4172.17.0.63310Haproxy172.17.0.74001 WEB看板端口 4002 MySQL负载均衡入口拉取Docker镜像docker pull percona/percona-xtradb-cluster docker image ls由于镜像的名字太长，不便于使用，我们可以在本地对镜像名称进行修改docker tag percona/percona-xtradb-cluster pxc docker image ls此时可以把原来的镜像删除掉docker iamge rm percona/percona-xtradb-cluster pxc创建内部网络出于安全考虑，需要给PXC集群实例创建Docker内部网络# 创建网段 docker network create net1 # 查看网段信息 docker network inspect net1 # 删除网段 docker network rm net1docker默认的网段是172.17.0.x创建网络的时候不指定网段，会默认从dokcer默认网段向下排，例如下一个网段是172.18.0.x创建指定网段docker network create --subnet=172.18.0.0/24 net1 docker inspect net1 # 如果删除 docker network rm net1子网掩码172.18.0.0/24中的/24的意思是172.17.0前三位固定，最后一位动，即子网掩码为255.255.255.0，用二进制表示前面就是24位1如果子网掩码是172.18.0.0/16，那…

Docker学习笔记
type: item
date: 2022-09-01T00:00:00+08:00
description: Docker第一章 Docker的安装和介绍容器技术的介绍容器引领基础架构90年代 PC00年代 虚拟化10年代 cloud11年代 container容器是一种快速打包技术标准化轻量级易移植Linux container容器技术的诞生（2008年）解决了IT世界里“集装箱运输”的问题。Linux container（LXC）是一种内核轻量级的操作系统层虚拟化技术。LXC主要由namespace与Cgroup两大机制来保证实现。namespace资源隔离Cgroup资源管理，如CPU/MEM的限制容器的快速发展与普及2020年，全球>50%公司在生产环境中使用container——Analysis By Gartner容器的标准化docker != container2015年，Google、Docker、Redhat等厂商联合发起OCI（（Open Container Initiative）组织，致力于容器的标准化。容器关乎速度软件开发编译构建测试部署更新故障恢复Linux上安装Dockerhttps://get.docker.com上有安装脚本执行curl -fsSL get.docker.com -o get-docker.sh即可安装完成后sudo systemctl start docker sudo docker version出现client、server的信息即为安装成功。第二章 容器快速上手认识docker命令行非root账户下需要在docker命令前加sudodocker version docker info docker container ps docker container ps -a docker image ls docker image rm nginxdocker的基本操作新旧格式命令均兼容建议学习新格式命令新格式命令旧格式命令docker container run nginxdocker run nginxdocker container stop nginxdocker stop 1a6fcdocker container lsdocker psdocker container ls -adocker ps -adocker container rm 1a6fcdocker rm 1a6fc命令小技巧之批量操作例如存在多个container时：docker container af 87 c2 4c当要操作的容器变多时，上面的命令不再方便，可以如下操作：docker container ps -aq# 批量停止 docker container stop $(docker container ps -aq) # 批量删除 docker container rm $(docker container ps -aq)不能删除一个正在运行的containercontainer的attached和detached模式attached模式（前台运行模式）docker container run -p 80:80 nginx执行的结果直接输出到命令行里，按ctrl+c即可中断。Windows系统上的attached模式并非完整attached模式。detached模式（后台运行模式）docker run --detached ...简写为docker run -d ...docker run -d -p 80:80 nginxdetach进入attach模式docker attach b2容器的交互模式docker container run -d -p 80:80 nginx docker container ps # 查看log docker container logs d02 # 动态查看log docker container -f logs d02交互式运行模式（-it）docker container run -it ubuntu shdetached模式容器进入交互式模式# 执行shell docker exec -it dc3 sh使用busybox镜像熟悉交互模式docker container run -it busybox shWindows是如何运行docker engine的hyper-v manageWindows系统使用基于hyper-v的虚拟机WSL2 based engine也可以使用WSL2替代hyper-v在Windows10中安装WSL2（Ubuntu），在WSL2安装docker容器和虚拟机的区别docker container run -it创建一个容器并进入交互式模式docker container run -it busybox shdocker…