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搜索镜像,建议按版本下载
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/releases
并改名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 容器名字