CentOS7使用Docker-compose管理容器

发布时间 2023-11-20 21:13:19作者: CareCare

1.容器化的概念

容器化是将应用程序代码和依赖项捆绑到一个单一的虚拟包中。 容器化应用程序通常与其他应用程序并排放置,并通过计算机、服务器或云上的共享操作系统运行。

2.容器化使用的场景

1.简化不同环境配置差异
虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件, 系统), Docker在降低额外开销的情况下提供了同样的功能. 它能让你将运行环境和配置放在代码汇总然后部署, 同一个Docker的配置可以在不同的环境环境中使用, 这样就降低了硬件要求和应用环境之间耦合度。

2.代码流水线管理
代码从开发者的机器到最终在生产环境上的部署, 需要经过很多的中间环境,而每一个中间环境都有自己微小的差别, Docker给应用提供了一个从开发到上线均一致的环境, 让代码的流水线变得简单不少。

3.提升开发效率
不同环境中, 开发者的共同目标:(1)让开发环境尽量贴近生产环境.(2)快速搭建开发环境开发环境的机器通常内存比较小, 之前使用虚拟的时候, 我们经常需要为开发环境的机器加内存, 而现在Docker可以轻易的让几十个服务在Docker中跑起来。

4.隔离应用
开发时会在一个台机器上运行不同的应用.(1) 为了降低成本, 进行服务器整合(2)将一个整体式的应用拆分成低耦合的单个服务(微服务架构)

5.整合服务器
Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用, 以及能在多个实例之间共享没有使用的内存, Docker可以比虚拟机提供更好的服务器整合解决方案。

6.调试能力
Docker提供了很多的工具, 这些工具不一定只是针对容器, 但是却适用于容器. 他们提供了很多功能, 包括可以为容器设置检查点, 设置版本, 查看两个容器之间的差别, 这些特性可以帮助调试Bug.

7.多租户环境
多租户环境的应用中, 它可以避免关键应用的重写.我们一个特别的关于这个场景的例子是为loT(物联网)的应用开发一个快速, 易用的多租户环境. 这种多租户的基本代码非常复杂, 很难处理, 重新规划以应用不但消耗时间, 也浪费金钱.
使用Docker, 可以为每一个租户的应用层的多个实例创建隔离的环境, 这不仅简单而且成本低廉, 因为Docker环境启动的速度快, diff命令很高效.

8.快速部署
Docker为进程创建一个容器, 不需要启动一个操作系统, 时间缩短为秒级别.可以在数据中心创建销毁资源而无须担心重新启动带来的开销. 通常数据中心的资源利用率只有30% , 通过使用Docker并进行有效的资源分配可以提高资源的利用率。

9.环境标准化和版本控制
Docker容器可以在不同的开发与产品发布生命周期中确保一致性,进而标准化你的环境。除此之外,Docker容器还可以像git仓库一样,可以让你提交变更到Docker镜像中并通过不同的版本来管理它们。设想如果你因为完成了一个组件的升级而导致你整个环境都损坏了,Docker可以让你轻松地回滚到这个镜像的前一个版本。这整个过程可以在几分钟内完成,如果和虚拟机的备份或者镜像创建流程对比,那Docker算相当快的,它可以让你快速地进行复制和实现冗余。此外,启动Docker就和运行一个进程一样快。

3.容器化的优缺点

优点

  • 跨平台可移植性:按统一标准打包(镜像中),可传播。
  • 面向应用:优化部署应用(设计哲学)→API,接口及文档(体现)。
  • 版本控制:追踪、查询、记录版本信息(应用程序更改史)和回滚版本等
  • 组件复用:组件式搭建(基础镜像)→PYTHON(运行环境) | POSTGREASQL(基础镜像)。
  • DOCKER 的安装非常容易.目前,DOCKER支持所有的LINUX系列系统,(UBUNTU,RHEL,DEBIAN等).通过BOOT2DOCKER虚拟工具,在OS X 和 WINDOWS下也能够正常运行DOCKER

缺点

  • 必须是64位机器上运行,目前仅支持 X86_64和AMD64,32系统不支持.
  • 系统的LINUX内核必须是3.8或者更高,内核支持DEVICE MAPPER,AUFS,VFS,BTRFS等存储格式.
  • 内核必须支持CGROUPS和命名空间.

4.CentOS下Docker-compose基础环境配置

1.关闭selinux服务

setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

2.关闭swap分区

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

3.调整系统内核参数

echo fs.inotify.max_user_instances=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
echo vm.overcommit_memory = 1 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
cat >> /etc/sysctl.d/system_kernel.conf  << EOF
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout= 30
net.ipv4.ip_forward=1
fs.file-max= 131072
fs.nr_open=1048576
vm.max_map_count=262144
EOF
sysctl -p /etc/sysctl.d/system_kernel.conf

5.离线安装Docker和Docker-compose

将所需的离线包上传至目录/data

# 安装Docker和Docker-compose
rpm -ivh /data/docker-rpm/*.rpm --force --nodeps
# 软连接docker-compose
ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/bin/docker-compose
# 创建配置文件
tee /etc/docker/daemon.json << EOF
 {
 "storage-driver": "overlay2",
 "exec-opts": ["native.cgroupdriver=systemd"],
 "log-driver": "json-file",
 "log-opts": {
 "max-size": "500m",
 "max-file": "4"
 },
 "data-root":"/data/docker"
 }
EOF
# 加载配置文件,启动docker以及设置开机自启
systemctl daemon-reload && systemctl start docker && systemctl enable docker
# 查看docker的运行状态
systemctl status docker
# 查看docker和docker-compose的版本
docker --version && docker-compose --version

6.使用docker-compose.yml统一管理容器

docker-compose编排工具依赖于docker-compose.yml文件,后续的命令都需要在此文件目录执行

单独导入镜像

docker load < /data/redis.tar

批量导入镜像命令

cd /data/
for file in *.tar;do
	docker load < "$file"
done

例如

# 使用docker单独创建命令
docker run --name redis -v /data/redis/conf:/etc/redis/redis.conf -v /data/redis/data:/data -p 6379:6379 -d --restart=always redis:latest redis-server --appendonly yes --requirepass "Asdf@123"
# 注 常用参数
-name 创建的容器名称
-v 目录映射
-p 端口映射
-d 后台运行
--restart=always 持久化运行,当docker重启之后自动重启容器
--network host # 指定主机网络

在docker-compose.yml中是这样写的

version: "3"  ## 版本号,无需修改
services:
##=======================redis部署=======================
  redis: # compose管理名称
    container_name:redis ## 容器名称
    image: redis:latest #本地或者远程的镜像名称
    restart: "always" # 容器持久化
    environment:
      TZ: 'Asia/Shanghai' #设置时区
      requirepass: "Asdf@123"
      appendonly: yes
    volumes: # 容器映射目录,一般数据和配置文件需要映射出来
      - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime
      - /data/redis/conf:/etc/redis/redis.conf
      - /data/redis/data:/data
    network_mode: host # 网络模式 host为主机模式,直接使用主机端口 无需映射
# 如果上面 network_host不设置,则需要设置端口映射,否则外部无法访问
ports:
      - 6379:6379

7.常用命令分享

# 停止其中的某一个容器
docker-compose stop redis
# 重新启动重启
docker-compose restart redis
# 删除某个容器(容器需要停止状态)
docker-compose rm -f redis
# 修改完配置文件直接更新某个容器
docker-compose up -d redis
# 查看启动日志
docker-compose logs redis
# 查看镜像列表
docker images
# 删除镜像
docker rmi 镜像名称/镜像ID
# 删除所有没有使用的镜像(需要输入y确认)
docker image prune -a
# 开放端口
firewall-cmd --permanent --zone=public --add-port=6379/tcp --permanent
# 重启防火墙
firewall-cmd --reload