基于docker部署web站点

基于docker部署web站点

镜像的概念

镜像可以理解为应用程序的集装箱,而docker用来装卸集装箱。

docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动容器。

docker镜像采用分层构建机制,最底层为bootfs,其上为rootfs

  • bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源
  • rootfs:位于bootfs之上,表现为docker容器的根文件系统
    • 传统模式中,系统启动之时,内核挂载rootfs会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式
    • docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层

docker镜像的制作

多数情况下,我们做镜像是基于别人已存在的某个基础镜像来实现的,我们把它称为base image。比如一个纯净版的最小化的centos、ubuntu或debian。

那么这个最小化的centos镜像从何而来呢?其实这个基础镜像一般是由Docker Hub的相关维护人员,也就是Docker官方手动制作的。这个基础镜像的制作对于Docker官方的专业人员来说是非常容易的,但对于终端用户来说就不是那么容易制作的了。

基于容器制作镜像

//下载新的 CentOS-Base.repo 到 /etc/yum.repos.d///查看是否有centos镜像
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
web/httpd    v0.1      d950d0ef139d   47 hours ago    778MB
busybox      latest    beae173ccac6   7 months ago    1.24MB
httpd        latest    dabbfbe0c57b   7 months ago    144MB
centos       latest    5d0da3dc9764   10 months ago   231MB

//进入容器
[root@localhost ~]# docker run -it centos
[root@8b4eea633e2c /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@8b4eea633e2c /]# cd /etc/yum.repos.d/
[root@8b4eea633e2c yum.repos.d]# ls
CentOS-Linux-AppStream.repo
CentOS-Linux-BaseOS.repo
CentOS-Linux-ContinuousRelease.repo
CentOS-Linux-Debuginfo.repo
CentOS-Linux-Devel.repo
CentOS-Linux-Extras.repo
CentOS-Linux-FastTrack.repo
CentOS-Linux-HighAvailability.repo
CentOS-Linux-Media.repo
CentOS-Linux-Plus.repo
CentOS-Linux-PowerTools.repo
CentOS-Linux-Sources.repo
[root@8b4eea633e2c yum.repos.d]# rm -f *

//下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/
[root@8b4eea633e2c yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --100  2495  100  2495    0     0  30802      0 --:--:-- --:--:-- --:--:-- 30802
[root@8b4eea633e2c yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

//下载新repo 到/etc/yum.repos.d/
[root@8b4eea633e2c yum.repos.d]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
Failed to set locale, defaulting to C.UTF-8
CentOS-8.5.2111 - Base - mirrors. 225 kB/s | 4.6 MB     00:20    
CentOS-8.5.2111 - Extras - mirror  41 kB/s |  10 kB     00:00    
CentOS-8.5.2111 - AppStream - mir 147 kB/s | 8.4 MB     00:58    
epel-release-latest-8.noarch.rpm   80 kB/s |  24 kB     00:00    
Dependencies resolved.
==================================================================
 Package          Arch       Version       Repository        Size
==================================================================
Installing:
 epel-release     noarch     8-16.el8      @commandline      24 k

Transaction Summary
==================================================================
Install  1 Package

Total size: 24 k
Installed size: 34 k
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                          1/1 
  Installing       : epel-release-8-16.el8.noarch             1/1 
  Running scriptlet: epel-release-8-16.el8.noarch             1/1 
Many EPEL packages require the CodeReady Builder (CRB) repository.
It is recommended that you run /usr/bin/crb enable to enable the CRB repository.

  Verifying        : epel-release-8-16.el8.noarch             1/1 

Installed:
  epel-release-8-16.el8.noarch                                    

Complete!

//将 repo 配置中的地址替换为阿里云镜像站地址  
[root@8b4eea633e2c yum.repos.d]# sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@8b4eea633e2c yum.repos.d]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
[root@8b4eea633e2c yum.repos.d]# cd

//清理缓存
[root@8b4eea633e2c ~]# dnf clean all
Failed to set locale, defaulting to C.UTF-8
18 files removed
[root@8b4eea633e2c ~]# dnf makecache
Failed to set locale, defaulting to C.UTF-8
CentOS-8.5.2111 - Base - mirrors. 229 kB/s | 4.6 MB     00:20    
CentOS-8.5.2111 - Extras - mirror  61 kB/s |  10 kB     00:00    
CentOS-8.5.2111 - AppStream - mir 153 kB/s | 8.4 MB     00:56    
Extra Packages for Enterprise Lin 128 kB/s | 465 kB     00:03    
Extra Packages for Enterprise Lin 155 kB/s |  13 MB     01:23    
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Metadata cache created.

//安装开发工具包
[root@8b4eea633e2c ~]# yum groups mark install 'Development Tools'
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:03:03 ago on Thu Aug 11 00:38:28 2022.
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Dependencies resolved.
==================================================================
 Package        Architecture  Version        Repository      Size
==================================================================
Installing Groups:
 Development Tools
                                                                 

Transaction Summary
==================================================================

Is this ok [y/N]: y
Complete!

//创建apache服务的用户和组
[root@8b4eea633e2c ~]# useradd -r -M -s /sbin/nologin apache

//安装依赖包
[root@8b4eea633e2c ~]# dnf -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ make vim wget
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:08:52 ago on Thu Aug 11 00:38:28 2022.
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
..................................
  publicsuffix-list-dafsa-20180723-1.el8.noarch                   
  vim-common-2:8.0.1763-16.el8.x86_64                             
  vim-enhanced-2:8.0.1763-16.el8.x86_64                           
  vim-filesystem-2:8.0.1763-16.el8.noarch                         
  wget-1.19.5-10.el8.x86_64                                       
  which-2.21-16.el8.x86_64                                        
  zlib-devel-1.2.11-17.el8.x86_64                                 

Complete!

//下载和安装apr以及apr-util
[root@8b4eea633e2c ~]# wget https://downloads.apache.org/apr/apr-1.7.0.tar.gz https://downloads.apache.org/apr/apr-util-1.6.1.tar.gz
--2022-08-11 00:53:59--  https://downloads.apache.org/apr/apr-1.7.0.tar.gz
Resolving downloads.apache.org (downloads.apache.org)... 135.181.214.104, 88.99.95.219, 2a01:4f8:10a:201a::2, ...
Connecting to downloads.apache.org (downloads.apache.org)|135.181.214.104|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1093896 (1.0M) [application/x-gzip]
Saving to: ‘apr-1.7.0.tar.gz’

apr-1.7.0.tar.gz 100%[========>]   1.04M   453KB/s    in 2.4s    

2022-08-11 00:54:03 (453 KB/s) - ‘apr-1.7.0.tar.gz’ saved [1093896/1093896]

--2022-08-11 00:54:03--  https://downloads.apache.org/apr/apr-util-1.6.1.tar.gz
Reusing existing connection to downloads.apache.org:443.
HTTP request sent, awaiting response... 200 OK
Length: 554301 (541K) [application/x-gzip]
Saving to: ‘apr-util-1.6.1.tar.gz’

apr-util-1.6.1.t 100%[========>] 541.31K  1.59MB/s    in 0.3s    

2022-08-11 00:54:04 (1.59 MB/s) - ‘apr-util-1.6.1.tar.gz’ saved [554301/554301]

FINISHED --2022-08-11 00:54:04--
Total wall clock time: 4.4s
Downloaded: 2 files, 1.6M in 2.7s (598 KB/s)

[root@8b4eea633e2c ~]# ls
anaconda-ks.cfg    apr-1.7.0.tar.gz       original-ks.cfg
anaconda-post.log  apr-util-1.6.1.tar.gz
[root@8b4eea633e2c ~]# tar xf apr-1.7.0.tar.gz 
[root@8b4eea633e2c ~]# tar xf apr-util-1.6.1.tar.gz
[root@8b4eea633e2c ~]# ls
anaconda-ks.cfg    apr-1.7.0.tar.gz       original-ks.cfg
anaconda-post.log  apr-util-1.6.1
apr-1.7.0          apr-util-1.6.1.tar.gz
[root@8b4eea633e2c ~]# cd apr-1.7.0
[root@8b4eea633e2c apr-1.7.0]# ls
apr-config.in     CMakeLists.txt  libapr.mak     poll
apr.dep           config.layout   libapr.rc      random
apr.dsp           configure       LICENSE        README
apr.dsw           configure.in    locks          README.cmake
apr.mak           docs            Makefile.in    shmem
apr.pc.in         dso             Makefile.win   strings
apr.spec          emacs-mode      memory         support
atomic            encoding        misc           tables
build             file_io         mmap           test
build.conf        helpers         network_io     threadproc
buildconf         include         NOTICE         time
build-outputs.mk  libapr.dep      NWGNUmakefile  tools
CHANGES           libapr.dsp      passwd         user
[root@8b4eea633e2c apr-1.7.0]# vim configure
    cfgfile=${ofile}T
    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
#    $RM "$cfgfile"    //注释此行

[root@8b4eea633e2c apr-1.7.0]# ./configure --prefix=/usr/local/apr
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
Configuring APR library
Platform: x86_64-pc-linux-gnu
checking for working mkdir -p... yes
APR Version: 1.7.0
checking for chosen layout... apr
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
................................................
 
[root@8b4eea633e2c apr-1.7.0]# make && make install
make[1]: Entering directory '/root/apr-1.7.0'
/bin/sh /root/apr-1.7.0/libtool --silent --mode=compile gcc -g -O2 -pthread   -DHAVE_CONFIG_H  -DLINUX -D_REENTRANT -D_GNU_SOURCE   -I./include -I/root/apr-1.7.0/include/arch/unix -I./include/arch/unix -I/root/apr-1.7.0/include/arch/unix -I/root/apr-1.7.0/include -I/root/apr-1.7.0/include/private -I/root/apr-1.7.0/include/private  -o encoding/apr_encode.lo -c encoding/apr_encode.c && touch encoding/apr_encode.lo
/root/apr-1.7.0/build/mkdir.sh tools
/bin/sh /root/apr-1.7.0/libtool --silent --mode=compile gcc -g -O2 -pthread   -DHAVE_CONFIG_H  -DLINUX -D_REENTRANT -D_GNU_SOURCE   -I./include -I/root/apr-1.7.0/include/arch/unix -I./include/arch/unix -I/root/apr-1.7.0/include/arch/unix -I/root/apr-1.7.0/include -I/root/apr-1.7.0/include/private -I/root/apr-1.7.0/include/private  -o tools/gen_test_char.lo -c tools/gen_test_char.c && touch tools/gen_test_char.lo
............................................

[root@8b4eea633e2c apr-1.7.0]# cd ../apr-util-1.6.1
[root@8b4eea633e2c apr-util-1.6.1]# ls
aprutil.dep       configure.in       Makefile.win
aprutil.dsp       crypto             memcache
aprutil.dsw       dbd                misc
aprutil.mak       dbm                NOTICE
apr-util.pc.in    docs               NWGNUmakefile
apr-util.spec     encoding           README
apu-config.in     export_vars.sh.in  README.cmake
buckets           hooks              README.FREETDS
build             include            redis
build.conf        ldap               renames_pending
buildconf         libaprutil.dep     strmatch
build-outputs.mk  libaprutil.dsp     test
CHANGES           libaprutil.mak     uri
CMakeLists.txt    libaprutil.rc      xlate
config.layout     LICENSE            xml
configure         Makefile.in
[root@8b4eea633e2c apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking for working mkdir -p... yes
APR-util Version: 1.6.1
checking for chosen layout... apr-util
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
......................................
include/private/apu_select_dbm.h
config.status: creating include/apr_ldap.h
config.status: creating include/apu.h
config.status: creating include/apu_want.h
config.status: creating test/Makefile
config.status: creating include/private/apu_config.h
config.status: executing default commands

[root@8b4eea633e2c apr-util-1.6.1]# make && make install
make[1]: Entering directory '/root/apr-util-1.6.1'
/bin/sh /usr/local/apr/build-1/libtool --silent --mode=compile gcc -g -O2 -pthread   -DHAVE_CONFIG_H  -DLINUX -D_REENTRANT -D_GNU_SOURCE   -I/root/apr-util-1.6.1/include -I/root/apr-util-1.6.1/include/private  -I/usr/local/apr/include/apr-1    -o buckets/apr_brigade.lo -c buckets/apr_brigade.c && touch buckets/apr_brigade.lo
/bin/sh /usr/local/apr/build-1/libtool --silent --mode=compile gcc -g -O2 -pthread   -DHAVE_CONFIG_H  -DLINUX -D_REENTRANT -D_GNU_SOURCE   -I/root/apr-util-1.6.1/include -I/root/apr-util-1.6.1/include/private  -I/usr/local/apr/include/apr-1    -o buckets/apr_buckets.lo -c buckets/apr_buckets.c && touch buckets/apr_buckets.lo
/bin/sh /usr/local/apr/build-1/libtool --silent --mode=compile gcc -g -O2 -pthread   -DHAVE_CONFIG_H  -DLINUX -D_REENTRANT -D_GNU_SOURCE   -I/root/apr-util-1.6.1/include -I/root/apr-util-1.6.1/include/private  -I/usr/local/apr/include/apr-1    -o buckets/apr_buckets_alloc.lo -c buckets/apr_buckets_alloc.c && touch buckets/apr_buckets_alloc.lo

//编译安装httpd
[root@8b4eea633e2c ~]# wget https://downloads.apache.org/httpd/httpd-2.4.54.tar.gz
--2022-08-11 01:00:00--  https://downloads.apache.org/httpd/httpd-2.4.54.tar.gz
Resolving downloads.apache.org (downloads.apache.org)... 135.181.214.104, 88.99.95.219, 2a01:4f8:10a:201a::2, ...
Connecting to downloads.apache.org (downloads.apache.org)|135.181.214.104|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9743277 (9.3M) [application/x-gzip]
Saving to: ‘httpd-2.4.54.tar.gz’

httpd-2.4.54.tar 100%[========>]   9.29M  87.7KB/s    in 39s     

2022-08-11 01:00:40 (247 KB/s) - ‘httpd-2.4.54.tar.gz’ saved [9743277/9743277]

[root@8b4eea633e2c ~]# ls
anaconda-ks.cfg    apr-1.7.0.tar.gz       httpd-2.4.54.tar.gz
anaconda-post.log  apr-util-1.6.1         original-ks.cfg
apr-1.7.0          apr-util-1.6.1.tar.gz
[root@8b4eea633e2c ~]# tar xf httpd-2.4.54.tar.gz 
[root@8b4eea633e2c ~]# cd httpd-2.4.54
[root@8b4eea633e2c httpd-2.4.54]# ./configure --prefix=/usr/local/apache \
> --enable-so \
> --enable-ssl \
> --enable-cgi \
> --enable-rewrite \
> --with-zlib \
> --with-pcre \
> --with-apr=/usr/local/apr \
> --with-apr-util=/usr/local/apr-util/ \
> --enable-modules=most \
> --enable-mpms-shared=all \
> --with-mpm=prefork 
............................................

[root@8b4eea633e2c httpd-2.4.54]# make && make install
.................................
 mkdir /usr/local/apache/cgi-bin
Installing header files
mkdir /usr/local/apache/include
Installing build system files
mkdir /usr/local/apache/build
Installing man pages and online manual
mkdir /usr/local/apache/man
mkdir /usr/local/apache/man/man1
mkdir /usr/local/apache/man/man8
mkdir /usr/local/apache/manual
make[1]: Leaving directory '/root/httpd-2.4.54'

//安装后配置
[root@8b4eea633e2c ~]# echo 'export PATH=/usr/local/apache/bin:$PATH' > /etc/profile.d/apache.sh
[root@8b4eea633e2c ~]# source /etc/profile.d/apache.sh
[root@8b4eea633e2c ~]# which httpd
/usr/local/apache/bin/httpd
[root@8b4eea633e2c ~]# ln -s /usr/local/apache/include/ /usr/include/apache
[root@8b4eea633e2c ~]# vim /usr/local/apache/conf/httpd.conf 
ServerName www.example.com:80   //取消注释

//启动
[root@8b4eea633e2c ~]# httpd
[root@8b4eea633e2c ~]# ss -antl
State  Recv-Q Send-Q Local Address:Port Peer Address:Port Process 
LISTEN 0      128          0.0.0.0:80        0.0.0.0:* 

制作镜像

[root@localhost ~]# docker commit -p -c 'CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]' 8b4eea633e2c yyds/httpd:v0.2
sha256:96344edfe395417c35d133a6f9b57433f89bb6e5d18b5c764095f7fd62b76a17
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
yyds/httpd   v0.2      96344edfe395   29 seconds ago   778MB
web/httpd    v0.1      d950d0ef139d   2 days ago       778MB
busybox      latest    beae173ccac6   7 months ago     1.24MB
httpd        latest    dabbfbe0c57b   7 months ago     144MB
centos       latest    5d0da3dc9764   10 months ago    231MB

启动容器

[root@localhost ~]# docker run -d --name web -p 80:80 -v /root/html/:/usr/local/apache/htdocs yyds/httpd:v0.2
bf257dce4c310163cd3dbdbd0a593fcd3d04c7e19947adec76335f80200c8df0
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                               NAMES
bf257dce4c31   yyds/httpd:v0.2   "/usr/local/apache/b…"   6 seconds ago   Up 4 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web
8b4eea633e2c   centos            "/bin/bash"              2 hours ago     Up 2 hours                                         cranky_dhawan
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# echo "test" > html/index.html
[root@localhost ~]# curl 127.0.0.1
test

导入的文件

[root@localhost ~]# ls html/
 assets
 index.html
''$'\346\234\215\345\212\241\345\231\250\344\271\213\345\256\266''.url'
''$'\347\262\276\345\223\201\345\205\215\350\264\271\345\225\206\344\270\232\346\272\220\347\240\201\344\270\213\350\275\275''.url'

访问网站

请添加图片描述

上传镜像

[root@localhost ~]# docker push 1919756426/httpd:v0.1
The push refers to repository [docker.io/1919756426/httpd]
e085823d1173: Pushed 
74ddd0ec08fa: Pushed 
v0.1: digest: sha256:99dcd21bdb071b9ae067328a0bd17c8be2fe9ab14679a334b6b231b43c81ff62 size: 742

查看上传的镜像

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值