Centos stream 9 部署

Centos stream 9

1、查看版本

#系统内核信息
uname -r
#获取系统信息
cat /etc/os-release
#修改计算机名
hostname xx
#或
vi /etc/hostname

2、升级系统

dnf update

3、修改ssh默认端口号

vi /etc/ssh/sshd_config

找到 #Prot 这一行,按 i 编辑模式

然后把 # 号去掉,修改默认端口号 22

然后按Esc退出编辑模式,输入**:wq** 保存退出

 :w 保存,但不退出  
 :wq 保存并退出  
 :x 同:wq  
 :q 退出,如果当前文件没有保存,禁止退出  
 :q! 不保存退出

重启ssh服务

service sshd restart
#或者
systemctl restart sshd

出现重启报错,发现SELinux允许的ssh的端口号和ssh配置文件中设置的端口号不一致。

查看SElinux允许的ssh的端口号

semanage port -l | grep ssh

使用semanage工具添加ssh端口号,再重启ssh服务

semanage port -a -t ssh_port_t -p tcp 220

semanage使用详解

-a:添加 
-d:删除 
-m:修改 
-l:列举 
-n:不打印说明头 
-D:全部删除 
-t:类型 
-r:角色
-t:类型 

修改22端口

semanage port -m -t ssh_port_t -p tcp 22

删除22端口

semanage port -d -t ssh_port_t -p tcp 22

临时关闭selinux

setenforce 0

查看端口

netstat -ntlp

查看进程

ps aux

查看硬盘和分区

fdisk -l
#或
lsblk

查看当前机器的磁盘使用情况

df -h

新建待挂载目录(必须是空目录):

mkdir /newdir

对新磁盘进行分区

fdisk /dev/vdb
m
n
p
回车(默认值)
回车(默认值)
回车(默认值)
w

创建好分区后再次执行 fdisk -l 命令可以看到 /dev/vdh 已经新生成了一个分区:

格式化成ext4的文件系统

mkfs -t ext4 /dev/vdb

将逻辑卷挂载到之前创建的空目录:

mount /dev/vdb1 /newdir

查看磁盘信息,确认挂载新磁盘是否成功

df -h

设置开机自动挂载

vi /etc/fstab

在文件末尾添加以下内容:

/dev/vdb1               /newdir                ext4    defaults        0 0

立即进行挂载:

mount-a

使用UUID挂载,查看UUID的3种方式

blkid
#或
lsblk -f
#或
ll /dev/disk/by-uuid/

在vi /etc/fstab

UUID=4db9a558-6865-4145-a0c5-8771cefa1516 /newdir     ext4    defaults   0 0

立即进行挂载:

mount-a

卸载磁盘

# 临时卸载,重启机器之后又恢复到挂载状态
umount /dev/vdb1
#永久卸载
vim /etc/fstab
#把添加的磁盘信息删除即可。重启机器查看是否卸载

4、防火墙配置

1.查看防火墙状态

systemctl status firewalld

2.关闭、启动、取消自启动 防火墙

systemctl stop firewalld        #临时关闭防火墙
systemctl start firewalld       #启动防火墙
systemctl disable firewalld     #取消自启动
systemctl enable firewalld      #防火墙开机自启

注意启动后就生效了,可能导致你无法连接到服务器

3.添加放行端口,或移除端口

firewall-cmd --zone=public --add-port=220/tcp --permanent #添加220端口
firewall-cmd --reload #重载
firewall-cmd --zone=public --remove-port=220/tcp --permanent #移除220端口
firewall-cmd --reload #重载

firewall-cmd --zone=public --add-port=8000-8999/tcp --permanent #添加8000-8999端口范围
firewall-cmd --reload #重载

4.防火墙IP加黑名单

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="45.200.148.199" reject'

5.查看端口号是否已添加

firewall-cmd --list-all

6.最后我们重启防火墙

systemctl restart firewalld.service

7.参数解释

--add-service #添加的服务
--zone #作用域
--add-port=80/tcp #添加端口,格式为:端口/通讯协议
--remove-port=80/tcp #移除端口
--permanent #永久生效,没有此参数重启后失效

5、修改登录界面信息

vi /etc/motd

6、docker配置

1.卸载旧版本的

dnf -y remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker

2.添加Docker存储库的GPG密

rpm --import https://download.docker.com/linux/centos/gpg

3.设置镜像的仓库

#默认是从国外下载的
dnf config-manager \
--add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo   

推荐使用阿里国内源安装docker

#推荐使用阿里云的
dnf config-manager \
--add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo   

4.更新dnf软件包索引

dnf clean all && dnf makecache

5.安装docker

dnf install -y docker-ce docker-ce-cli containerd.io

但安装完成之后的默认是未启动的,需要进行启动操作。

6.启动Docker

systemctl start docker

查看Docker状态

systemctl status docker

开机自启

#开机自启
systemctl enable docker

#关闭自启
systemctl disable docker

除了启动Docker,一些其他启动相关的命令:

#守护进程重启:
systemctl daemon-reload
#重启Docker服务:
systemctl restart docker / service docker restart
#关闭Docker服务:
docker service docker stop / docker systemctl stop docker

7.shell脚本安装一键安装

新建docker_install_dnf.sh文件

#!/bin/bash
echo "准备dnf完善docker环境安装!"
sleep 1
echo "准备倒计时 3!"
sleep 1
echo "准备倒计时 2!"
sleep 1
echo "准备倒计时 1!"
echo "更新系统"
dnf update
echo "添加Docker存储库的GPG密钥"
rpm --import https://download.docker.com/linux/centos/gpg
echo "更换阿里云镜像仓库!"
dnf config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
echo "更新dnf软件包索引"
dnf clean all && dnf makecache
echo "安装docker"
dnf install -y docker-ce docker-ce-cli containerd.io
echo "启动Docker"
systemctl start docker
echo "开机自启"
systemctl enable docker
echo "守护进程重启"
systemctl daemon-reload
echo "重启Docker服务"
systemctl restart docker
echo "查看Docker状态"
systemctl status docker
exit

8.安装常备软件

进入docker的Hub搜索镜像,建议按版本下载

https://hub.docker.com/open in new window

https://hub-stage.docker.com/open in new window

1.容器网络配置

docker默认采用”bridge”连接,启动容器的时候会按照顺序来获取ip。

这就导致启动时候ip不固定的问题

当前网络

#查看所有网络
docker network ls
#创建新网络xx_network
docker network create xx_network
#删除网络xx_network
docker network rm xx_network
#查看网络详细配置
docker network inspect bridge

1.创建自定义网络,指定网段172.17.0.0/16

docker network create --subnet=172.19.0.0/16 xo

2.创建容器

#php举例
docker run -itd --name php7  --net xo --ip 172.19.0.3 php:latest
#mysql举例
docker run -itd --name mysql  --net xo --ip 172.19.0.2 mysql:latest 
#nginx举例
docker run -itd --name nginx  --net xo --ip 172.19.0.4 nginx:latest 

3.查看容器IP

docker inspect php7 | grep IPAddress
docker inspect mysql | grep IPAddress
docker inspect nginx | grep IPAddress

2.Mysql镜像安装

docker pull mysql:8.0.32

宿主机先把文件夹目录建好

mkdir /home/mysql
mkdir /home/mysql/conf

创建my.cnf文件

touch /home/mysql/conf/my.cnf
#my.cnf写入配置
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
secure_file_priv=/var/lib/mysql

创建并运行容器

docker run -p 3888:3306 \
--net xo --ip 172.19.0.2 \
-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 \
--name mysql \
--restart=always \
-d mysql:8.0.32

重新加载mysql

docker restart mysql

如果不能访问主机就进入设置为所有主机可访问

#进入主机
docker exec -it mysql bash

设置MySQL

mysql -u root -p
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

如果文件夹无法删除,用-rf强制删除

rm -rf 文件夹名称

查找镜像中my.cnf文件地址

find / -name my.cnf

3.php镜像安装

docker pull php:8.2.5-fpm

查找确定php.ini位置

php -r "phpinfo();" | grep 'php.ini'

创建php配置目录和本地挂载路径

mkdir /home/php
mkdir /home/www

创建临时php容器从容器中复制出要挂载的文件

docker run --name php -p 9000:9000 -d php:8.2.5-fpm

从容器中复制文件到宿主机

docker cp php:/usr/local/etc/php /home

停止、删除容器

docker stop php
docker rm php

得到php.ini

#生产环境
php.ini-production
#开发环境
php.ini-development

复制配置文件内容到php.ini

创建php容器

docker run -p 127.0.0.1:9000:9000 \
--net xo --ip 172.19.0.3 \
-v /home/php:/usr/local/etc/php \
-v /home/www:/www \
--name php8 \
--restart=always \
-d php:8.2.5-fpm

注意了:不要暴露9000端口,Docker的-p端口映射会绕过ufw直接对外开放,linux系统内的防火墙是拦不住的,本来PHP-FPM的FastCGI协议应该仅在内网使用,暴露在外网是致命的,导致被挖矿等病毒感染,Docker暴露的端口绕过了ufw的限制,导致可以从外部任意访问,进而被下载病毒感染。本人经历一次PHP的Docker容器感染kdevtmpfsi挖矿病毒,深有体会。 后面docker设置暴露端口时仅监听本机:-p 127.0.0.1:9000:9000

重启php

docker restart php8

安装pod_mysql扩展

#在php.ini把下面参数冒号去掉
extension=pdo_mysql
#exec进入容器
docker exec -it php8 bash
#安装pdo扩展支持
docker-php-ext-install pdo pdo_mysql
#查找pdo_mysql
php -m | grep pdo_mysql
#重启php容器
docker restart php8

PHP 8.2: 动态属性被弃用

添加#[AllowDynamicProperties] 豁免模式隐藏报错

#[AllowDynamicProperties]

 class User {
      private int $uid;
  }

  $user = new User();
  $user->name = 'Foo';

4.nginx镜像安装

docker pull nginx:1.23.4

创建临时nginx容器从容器中复制出要挂载的文件

docker run --name nginx -p 80:80 -d nginx:1.23.4

宿主机先把文件夹目录建好

mkdir /home/nginx

从容器中复制文件到宿主机

docker cp nginx:/etc/nginx/nginx.conf /home/nginx/
docker cp nginx:/etc/nginx/conf.d/ /home/nginx/conf.d/
docker cp nginx:/usr/share/nginx/html/ /home/nginx/html/
docker cp nginx:/var/log/nginx/ /home/nginx/logs/

停止、删除容器

docker stop nginx
docker rm nginx

重新创建并运行容器

多端口再加 -p 333:333

注意:link根据php容器的name输入

docker run \
-p 80:80 \
-p 8080:8080 \
--net xo --ip 172.19.0.4 \
-v /home/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/logs:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-v /home/nginx/conf.d:/etc/nginx/conf.d \
-v /home/www:/www \
-v /etc/localtime:/etc/localtime \
--name nginx \
--restart=always \
--link php8:php \
-d nginx:1.23.4

conf.d目录下的配置文件

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
   
    location / {
        root   /www/cxxx;
        index index.php index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

#以下是php配置文件
    location ~ \.php$ {
        root           /www/cxxx;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }


}


在宿主机上修改nginx.conf和conf目录下的配置文件后,需要重启容器重新加载配置。

docker restart nginx

查docker容器内网地址

docker inspect mysql | grep IPAddress
docker inspect php8 | grep IPAddress
docker inspect nginx | grep IPAddress

5.Dockerfile

1、php:7.4-fpm(另命名:Php7.Dockerfile)

# 指定基础镜像
FROM php:7.4-fpm
#安装pdo扩展支持
RUN docker-php-ext-install pdo pdo_mysql

执行命令构建镜像

docker build -t php_pdo_mysql:7.4-fpm . -f Php7.Dockerfile

2、node(另命名:Node.Dockerfile)

# 指定基础镜像
FROM node:20.8.0
# 维护者信息
MAINTAINER "xo"
#安装pnpm
RUN npm i -g npm && npm i -g pnpm
#目录
WORKDIR /home/vuepress
# 暴露端口
EXPOSE 8080
# 设置启动命令
CMD ["pnpm", "-v"]

执行命令构建镜像

docker build -t node_pnpm:20.8.0 . -f Node.Dockerfile

6.compose编排

1、安装compose

下载docker-compose

https://github.com/docker/compose/releasesopen in new window

并改名docker-compose 然后上传到/usr/local/bin目录下

执行提权命令

chmod +x /usr/local/bin/docker-compose

查看版本是否安装成功

docker-compose version
#或
docker-compose -v

2、创建编排文件 docker-compose.yml

version: "3"
services:
  mysql:
    image: mysql:8.1.0
    restart: always
    ports:
      - 3683:3306
    volumes:
      - /home/mysql/log:/var/log/mysql
      - /home/mysql/data:/var/lib/mysql
      - /home/mysql/conf:/etc/mysql/conf.d
    environment:
      - MYSQL_ROOT_PASSWORD=xxxx
      - MYSQL_USER=yytt
      - MYSQL_PASS=xxxyy
    labels:
      com.docker.compose.service: mysql
    networks:
      xo:
        ipv4_address: 172.19.0.12          
    container_name: mysql
    
  php:
    build:
      context: .
      dockerfile: Php.Dockerfile
    restart: always
    ports:
      - 8123:9000
    volumes:
      - /home/php:/usr/local/etc/php
      - /home/www:/home/www
    labels:
      com.docker.compose.service: php
    image: x-php:7.4-fpm
    networks:
      xo:
        ipv4_address: 172.19.0.13
    container_name: php8
    
  nginx:
    image: nginx:1.25.2
    restart: always
    links:
      - php
    depends_on:
      - php
    ports:
      - 89:80
      - 9162:9162
    volumes:
      - /home/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /home/nginx/logs:/var/log/nginx
      - /home/nginx/html:/usr/share/nginx/html
      - /home/nginx/conf.d:/etc/nginx/conf.d
      - /home/www:/home/www
      - /etc/localtime:/etc/localtime
    labels:
      com.docker.compose.service: nginx
    networks:
      xo:
        ipv4_address: 172.19.0.14
    container_name: nginx
    
  node:
    build:
      context: .
      dockerfile: Node.Dockerfile
    stdin_open: true
    tty: true
    restart: always
    ports:
      - 9161:9161
    volumes:
      - /home/vuepress:/home/vuepress
      - /home/www:/home/www
    labels:
      com.docker.compose.service: node
    image: x-node:20.8.0
    networks:
      xo:
        ipv4_address: 172.19.0.15
    container_name: node_vuepress
  
networks:
  xo:
  	name: xo
    driver: bridge
    ipam:
      config:
        - subnet: 172.19.0.0/16
          gateway: 172.19.0.1

运行

docker-compose up -d

清除

docker-compose down

7.其他

Docker参数说明:

参数说明:
--name 容器名称。 
-d 后台运行容器的镜像名。 
-i 以交互模式运行,通常与-t同时使用
-t 为容器重新分配一个伪输入终端,通常与-i同时使用
-P 随机端口映射,大写P
-p 指定端口映射,小写p
-v 挂载文件
-e TZ=Asia/Shanghai  设置时区
--privileged=true 让容器中的root用户拥有真正的root权限
--restart=always docker启动时自动启动容器

Docker操作命令:

#搜索仓库镜像:
docker search 镜像名
#拉取镜像:
docker pull 镜像名
#查看正在运行的容器:
docker ps
#查看所有容器:
docker ps -a
#删除容器:
docker rm container_id
#查看镜像:
docker images
#删除镜像:
docker rmi image_id
#启动(停止的)容器:
docker start 容器ID
#停止容器:
docker stop  容器ID
#重启容器:
docker restart 容器ID
#启动(新)容器:
docker run -it ubuntu /bin/bash
#进入容器:
docker attach 容器ID
#或
docker exec -it 容器ID /bin/bash,推荐使用后者

#更多的命令可以通过docker help命令来查看。

打包镜像为离线文件为tar

#镜像保存
docker save -o mysql8.1.0.tar mysql:8.1.0
#容器打包
docker export 4af97210304c(容器id)  node20.8.0.tar

导入离线镜像tar

#镜像导入
docker load -i mysql8.1.0.tar
#容器导入
docker import mysql8.1.0.tar mysql:8.1.0

docker容器少了--restart=always参数,修改容器

docker container update --restart=always 容器名字