返回列表 发帖

CentOS8_在Docker的容器内自动启动服务

笺注:Docker的安装可参考 CentOS8_在Docker中使用Nginx的反向代理


查看Docker的版本信息:
[root@centos8 ~]# docker -v
Docker version 20.10.21, build baeda1f
[root@centos8 ~]#


已经设置开机自动启动Docker:
[root@centos8 ~]# systemctl is-enabled docker
enabled
[root@centos8 ~]#


从公网下载镜像:( 以下是下载Ubuntu 20.04的镜像 )
[root@centos8 ~]# docker pull ubuntu:20.04
20.04: Pulling from library/ubuntu
06d39c85623a: Pull complete
Digest: sha256:24a0df437301598d1a4b62ddf59fa0ed2969150d70d748c84225e6501e9c36b9
Status: Downloaded newer image for ubuntu:20.04
docker.io/library/ubuntu:20.04
[root@centos8 ~]#


查看宿主机的所有镜像:
[root@centos8 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
ubuntu       20.04     1c5c8d0b973a   8 days ago      72.8MB
[root@centos8 ~]#


使用镜像“ubuntu:20.04”创建并启动容器“Vsftpd_1”:
[root@centos8 ~]# docker run -itd --name Vsftpd_1 -p 21:21 -v /opt/share:/usr/share/html ubuntu:20.04
5144089bae4fa6160845b89c66f17463c38cb15a9cae4e9698855e99c5ea9d1b
[root@centos8 ~]#

注释:
-itd : 以交互模式情况下后台运行。
--name : 指定容器名称。
-p 端口映射 : 第一个21是宿主机的端口,暴露给外部直接访问;第二个21是容器的端口。
-v 挂载目录 : 这里是把宿主机的目录/opt/share挂载到容器的目录/usr/share/html;假如目录不存在,就会自动创建。
ubuntu:20.04 : 镜像名称:版本号


在宿主机查看正在运行的容器:
[root@centos8 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS                               NAMES
5144089bae4f   ubuntu:20.04   "/bin/bash"   57 seconds ago   Up 56 seconds   0.0.0.0:21->21/tcp, :::21->21/tcp   Vsftpd_1
[root@centos8 ~]#

注释:宿主机的TCP 21端口,映射到容器“Vsftpd_1”的TCP 21端口。



###

进入容器“Vsftpd_1”:
[root@centos8 ~]# docker exec -it Vsftpd_1 /bin/bash
root@5144089bae4f:/#


查看容器“Vsftpd_1”的系统版本信息:
root@5144089bae4f:/# cat /etc/issue
Ubuntu 20.04.5 LTS \n \l

root@5144089bae4f:/# uname -a
Linux 5144089bae4f 4.18.0-193.el8.x86_64 #1 SMP Fri May 8 10:59:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
root@5144089bae4f:/#



在容器“Vsftpd_1”中安装vsftpd:
root@5144089bae4f:/# whoami
root
root@5144089bae4f:/# apt-get update

root@5144089bae4f:/# apt-get -y install vsftpd


查看vsftpd的版本:
root@5144089bae4f:/# vsftpd -v
vsftpd: version 3.0.3
root@5144089bae4f:/#



建立FTP用户:(使用vsftpd用户验证)
root@5144089bae4f:/# groupadd ftp_01
root@5144089bae4f:/#

root@5144089bae4f:/#  useradd -g ftp_01 -d /usr/share/html -s /bin/bash happy
root@5144089bae4f:/# passwd happy
New password:
Retype new password:
passwd: password updated successfully
root@5144089bae4f:/#


root@5144089bae4f:/# useradd -g ftp_01 -d /usr/share/html -s /bin/bash ftp_user_1
root@5144089bae4f:/# passwd ftp_user_1
New password:
Retype new password:
passwd: password updated successfully
root@5144089bae4f:/#



设置FTP目录的权限:(属主有读写的权限;组员只可以读,不可以写;其他人不可以读写)
root@5144089bae4f:/# chown -R happy:ftp_01 /usr/share/html
root@5144089bae4f:/#
root@5144089bae4f:/# chmod -R 750 /usr/share/html                     
root@5144089bae4f:/#
root@5144089bae4f:/# ls -ld /usr/share/html               
drwxr-x---. 3 happy ftp_01 93 Mar 14 03:09 /usr/share/html
root@5144089bae4f:/#



###

在宿主机上修改容器“Vsftpd_1”的vsftpd的主配置文件:
[root@centos8 ~]# docker cp Vsftpd_1:/etc/vsftpd.conf /root
[root@centos8 ~]# vi vsftpd.conf
追加:
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/allowed_users
seccomp_sandbox=NO
local_enable=YES
pasv_promiscuous=YES
write_enable=YES


在宿主机上,往容器“Vsftpd_1”上传修改好的文件:
[root@centos8 ~]# docker cp /root/vsftpd.conf Vsftpd_1:/etc/vsftpd.conf
[root@centos8 ~]#



再往容器“Vsftpd_1”上传以下文件:(允许登录FTP的系统用户)
[root@centos8 ~]# cat allowed_users
happy
ftp_user_1
[root@centos8 ~]#

[root@centos8 ~]# docker cp /root/allowed_users Vsftpd_1:/etc/
[root@centos8 ~]#



Docker宿主机的防火墙其实可以不用打开TCP 21端口:
[root@centos8 ~]# firewall-cmd --zone=public --list-ports

[root@centos8 ~]#



###

在容器“Vsftpd_1”里重启vsftpd服务:(vsftpd服务不会自动启动)
root@5144089bae4f:/# /etc/init.d/vsftpd restart
[ OK ]pping FTP server vsftpd        
[ OK ]rting FTP server vsftpd
      
root@5144089bae4f:/#

查看vsftpd服务的状态:
root@5144089bae4f:/# service vsftpd status
* FTP server is running
root@5144089bae4f:/#



创建任务计划:
root@5144089bae4f:/# apt-get -y install vim

root@5144089bae4f:/# crontab -e -u root
追加:
*/1 * * * * chown -R happy:ftp_01 /usr/share/html
*/1 * * * * chmod -R 750 /usr/share/html



要手动启动任务计划服务:(cron服务不会自动启动)
root@5144089bae4f:/# service cron status
* cron is not running
root@5144089bae4f:/# service cron start  
[ OK ]rting periodic command scheduler cron        
root@5144089bae4f:/# service cron status
* cron is running
root@5144089bae4f:/#



###

Ubuntu18.04桌面版的客户端访问容器“Vsftpd_1”的FTP:(使用vsftpd用户验证)

telnet 192.168.168.154 21
图片1.png
2023-3-18 20:57

注释:容器“Vsftpd_1”要打开TCP 21端口。


打开Linux文件管理器,在左侧窗格中点击“其他位置”》“连接到服务器”:
ftp://192.168.168.154
图片2.png
2023-3-18 20:57


图片3.png
2023-3-18 20:58


图片4.png
2023-3-18 20:58


要手动切换到目录/usr/share/html
图片5.png
2023-3-18 20:58


实验至此,对于容器“Vsftpd_1”的FTP目录里面的所有内容,happy可以下载、上传、修改、删除;ftp_user_1只可以下载。(支持中文)














######
######

在Docker的容器内自动启动vsftpd服务、cron服务:

进入容器“Vsftpd_1”:
[root@centos8 ~]# docker exec -it Vsftpd_1 /bin/bash
root@5144089bae4f:/#

root@5144089bae4f:/# cd /etc/init.d
root@5144089bae4f:/etc/init.d#
root@5144089bae4f:/etc/init.d# ls
cron  hwclock.sh  procps  vsftpd
root@5144089bae4f:/etc/init.d#


在容器“Vsftpd_1”里创建一个脚本:
root@5144089bae4f:/# cat /etc/auto_service.sh
#!/bin/bash       
/etc/init.d/vsftpd start
/etc/init.d/cron start

/bin/bash


root@5144089bae4f:/# chmod 777 /etc/auto_service.sh
root@5144089bae4f:/#
root@5144089bae4f:/# ll /etc/auto_service.sh      
-rwxrwxrwx. 1 root root 70 Mar 17 15:01 /etc/auto_service.sh*
root@5144089bae4f:/#



在宿主机把容器“Vsftpd_1”创建成一个新镜像:
[root@centos8 ~]# docker commit Vsftpd_1 vsftpd_1:3.88
sha256:800cdc08eceee28ec90068c9640337ff37726c5014c59ad8e9f2e3376b4cc8d0
[root@centos8 ~]#

笺注:
vsftpd_1:3.88 : 新镜像名称:版本号



再次,查看宿主机的所有镜像:
[root@centos8 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
vsftpd_1     3.88      800cdc08ecee   52 seconds ago   184MB
ubuntu       20.04     1c5c8d0b973a   9 days ago       72.8MB
[root@centos8 ~]#



在宿主机创建Dockerfile文件:
[root@centos8 ~]# vi Dockerfile
写入:
FROM vsftpd_1:3.88
CMD ["/bin/bash","/etc/auto_service.sh"]

笺注:
vsftpd_1:3.88 : 源镜像名称:版本号



根据Dockerfile文件创建成一个新镜像:
[root@centos8 ~]# docker build -f ./Dockerfile -t vsftpd_1:3.99 .
Sending build context to Docker daemon  22.53kB
Step 1/2 : FROM vsftpd_1:3.88
---> 800cdc08ecee
Step 2/2 : CMD ["/bin/bash","/etc/auto_service.sh"]
---> Running in b5448a21e9c0
Removing intermediate container b5448a21e9c0
---> 393e32f39ed6
Successfully built 393e32f39ed6
Successfully tagged vsftpd_1:3.99

[root@centos8 ~]#

笺注:
vsftpd_1:3.99 : 新镜像名称:版本号


再次,查看宿主机的所有镜像:
[root@centos8 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
vsftpd_1     3.99      393e32f39ed6   2 minutes ago    184MB
vsftpd_1     3.88      800cdc08ecee   20 minutes ago   184MB
ubuntu       20.04     1c5c8d0b973a   9 days ago       72.8MB
[root@centos8 ~]#



使用镜像“vsftpd_1:3.99”创建并启动容器“Vsftpd_2”:
[root@centos8 ~]# docker run -itd --name Vsftpd_2 -p 2121:21 -v /opt/share:/usr/share/html vsftpd_1:3.99
c885f5a502f6636ee2eb5e3a8bd433a9b40e4db4b380587dc903c4b16085bd27
[root@centos8 ~]#

注释:
-itd : 以交互模式情况下后台运行。
--name : 指定容器名称。
-p 端口映射 : 2121是宿主机的端口,暴露给外部直接访问;21是容器的端口。
-v 挂载目录 : 这里是把宿主机的目录/opt/share挂载到容器的目录/usr/share/html;假如目录不存在,就会自动创建。
vsftpd_1:3.99 : 镜像名称:版本号



在宿主机查看所有的容器:(无论是否正在运行)
[root@centos8 ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS          PORTS                                   NAMES
c885f5a502f6   vsftpd_1:3.99   "/bin/bash /etc/auto…"   3 minutes ago   Up 3 minutes    0.0.0.0:2121->21/tcp, :::2121->21/tcp   Vsftpd_2
5144089bae4f   ubuntu:20.04    "/bin/bash"              28 hours ago    Up 49 minutes   0.0.0.0:21->21/tcp, :::21->21/tcp       Vsftpd_1
[root@centos8 ~]#

注释:宿主机的TCP 2121端口,映射到容器“Vsftpd_2”的TCP 21端口。



###

进入容器“Vsftpd_2”:
[root@centos8 ~]# docker exec -it Vsftpd_2 /bin/bash
root@c885f5a502f6:/#

查看vsftpd服务的状态:
root@c885f5a502f6:/# service vsftpd status
* FTP server is running
root@c885f5a502f6:/#

查看cron服务的状态:
root@c885f5a502f6:/# service cron status
* cron is running
root@c885f5a502f6:/#

笺注:实验至此,容器“Vsftpd_2”的vsftpd服务、cron服务会随宿容器的启动而启动。



在宿主机让容器“Vsftpd_2”随宿主机的启动而启动:
[root@centos8 ~]# docker update --restart=always Vsftpd_2
Vsftpd_2
[root@centos8 ~]#

笺注:实验至此,容器“Vsftpd_2”的vsftpd服务、cron服务会随宿主机的启动而启动。



###

Ubuntu18.04桌面版的客户端访问容器“Vsftpd_2”的FTP:(使用vsftpd用户验证)

telnet 192.168.168.154 2121
图片6.png
2023-3-18 21:03

注释:容器“Vsftpd_2”要打开TCP 21端口。


打开Linux文件管理器,在左侧窗格中点击“其他位置”》“连接到服务器”:
ftp://192.168.168.154:2121
图片7.png
2023-3-18 21:03


图片8.png
2023-3-18 21:03


图片9.png
2023-3-18 21:04


要手动切换到目录/usr/share/html
图片11.png
2023-3-18 21:04


实验至此,对于容器“Vsftpd_2”的FTP目录里面的所有内容,happy可以下载、上传、修改、删除;ftp_user_1只可以下载。(支持中文)





相关文章:
CentOS8_在Docker中安装vsftpd
CentOS8_在Docker中安装Flask

CentOS8_在Docker中安装PureFTPd
CentOS8_在Docker中限制容器可用的CPU个数和内存量

返回列表