小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
6. 制作本地局域网 yum 源
6.1 安装 vsftpd 软件
yum install -y vsftpd
6.2 启动 ftp
systemctl enable vsftpd
systemctl start vsftpd
6.3 上传系统镜像到虚拟机
6.4 配置 yum 仓库
mkdir -p /var/ftp/centos6.9
mkdir -p /var/ftp/centos7.5
cat > /etc/yum.repos.d/ftp_6.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://82.156.85.205/centos6.9
enabled=1
gpgcheck=0
EOF
cat > /etc/yum.repos.d/ftp_7.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://82.156.85.205/centos7.5
enabled=1
gpgcheck=0
EOF
在 镜像地址 下载 centos 镜像:
wget https://mirrors.aliyun.com/centos-vault/6.9/isos/x86_64/CentOS-6.9-x86_64-bin-DVD2.iso
wget https://mirrors.aliyun.com/centos-vault/6.9/isos/x86_64/CentOS-6.9-x86_64-bin-DVD1.iso
然后将镜像挂载到目录上:
mount -o loop CentOS-6.9-x86_64-bin-DVD1.iso /var/ftp/centos6.9/
mount -o loop CentOS-7-x86_64-DVD-1804.iso /var/ftp/centos7.5/
在浏览器上访问一下:
ftp://82.156.85.205/centos6.9
发现可以正常访问。
7. 镜像制作
7.1 基于容器的镜像制作
7.1.1 启动基础镜像容器
- 运行 centos6.9 容器
docker container run -it --name='wys_centos6.9' 2199b8eb8390
7.1.2 安装所需要的软件包,并且启动测试
- 让这个 centos 容器具备最基本的 SSH 功能。首先检查一下有没有 SSH,发现没有
rpm -qa | grep openssh
- 为了安装快一些,我们要修改一下 yum 源。首先我们要看一下原有的 yum 源。
[root@5581faf8be1a /]# cd /etc/yum.repos.d/
[root@5581faf8be1a yum.repos.d]# ll
total 24
-rw-r--r-- 1 root root 1991 Mar 28 2017 CentOS-Base.repo
-rw-r--r-- 1 root root 647 Mar 28 2017 CentOS-Debuginfo.repo
-rw-r--r-- 1 root root 630 Mar 28 2017 CentOS-Media.repo
-rw-r--r-- 1 root root 7989 Mar 28 2017 CentOS-Vault.repo
-rw-r--r-- 1 root root 289 Mar 28 2017 CentOS-fasttrack.repo
- 将这些 yum 源移走
mv * /tmp/
- 配置 yum 源
cat > /etc/yum.repos.d/ftp_6.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://172.17.0.1/centos6.9
enabled=1
gpgcheck=0
EOF
- 做缓存索引
yum clean all
yum makecache
- 安装 SSH server
yum install -y openssh-server
- 启动 SSH。在 SSH 第一次启动时会生成秘钥对
/etc/init.d/sshd start
Generating SSH2 RSA host key: [ OK ]
Generating SSH1 RSA host key: [ OK ]
Generating SSH2 DSA host key: [ OK ]
Starting sshd: [ OK ]
/etc/init.d/sshd stop
/etc/init.d/sshd restart
- SSH 设置密码。在容器中
passwd
- 在宿主机上测试登录
ssh 172.17.0.2
- 查看容器启动的服务
docker container top c8f4ee1940cf
UID PID PPID C STIME TTY TIME CMD
root 15213 15200 0 14:24 pts/1 00:00:00 /bin/bash
root 15938 15213 0 14:27 ? 00:00:00 /sbin/udevd -d
root 16188 15213 0 14:28 ? 00:00:00 /usr/sbin/sshd
root 17191 16188 0 14:33 ? 00:00:00 sshd: root@pts/0
root 17244 17191 0 14:33 pts/0 00:00:00 -bash
7.1.3 镜像的制作
- 制作镜像(包含 centos + ssh)
docker commit wys_centos6.9 wys/centos6.9_sshd:v1
- 查看镜像
[root@VM-0-3-centos ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
wys/centos6.9_sshd v1 fc8067454379 35 seconds ago 340 MB
nginx latest 35c43ace9216 12 days ago 133 MB
centos 6.9 2199b8eb8390 23 months ago 195 MB
centos 7.5.1804 cf49811e3cdb 23 months ago 200 MB
7.1.4 基于新镜像启动容器实现 centos6.9 + sshd 功能
- 使用刚制作的镜像(进去之后,可以发现,没有启动 sshd,需要手工启动)
docker container run -it --name='sshd' fc8067454379
/etc/init.d/sshd start
- 我们想要在启动容器的时候,就启动 SSH 服务(但是启动之后我们就会发现,docker 只是运行了一下这个命令,然后就 exited 了)
[root@VM-0-3-centos ~]# docker container run -d --name='ssh_1' fc8067454379 /etc/init.d/sshd start
c524e1f08e21a332cfe0f360499f964565d2c119262f3a05963ff2085938e457
[root@VM-0-3-centos ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c524e1f08e21 fc8067454379 "/etc/init.d/sshd ..." 15 seconds ago Exited (0) 14 seconds ago ssh_1
- 我们想换一种方式,让 SSH 一直运行在前台,hang 住。我们可以使用
/usr/sbin/sshd -D命令
[root@VM-0-3-centos ~]# docker container run -d --name='ssh_1' fc8067454379 /usr/sbin/sshd -D
e386e94b9b47f2315e332fe6c57f3c7469be9ea09f1b790846e45ad68c73cd19
[root@VM-0-3-centos ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e386e94b9b47 fc8067454379 "/usr/sbin/sshd -D" 7 seconds ago Up 6 seconds ssh_1
- 测试连接(发现可以正常连接)
ssh 172.17.0.2
- 进行端口映射
docker container run -d --name='ssh_2222' -p 2222:22 fc8067454379 /usr/sbin/sshd -D
7.2 构建企业镜像(Centos6.9_SSHD_LAMP_BBS)
7.2.1 启动基础镜像
- 删除所有容器
docker container rm -f `docker container ls -q`
- 宿主机创建挂载目录
mkdir -p /opt/vol/mysql /opt/vol/html
- 启动镜像(使用挂载文件)
docker container run -it --name='wys_centos_bbs' -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html centos:6.9
- 测试文件挂载是否成功
-- 宿主机
cd /opt/vol/mysql/
touch a
-- 容器
ll
rm a
7.2.2 优化 yum 源并安装软件
- 安装 yum 源
cd /etc/yum.repos.d/
mv * /tmp/
cat > /etc/yum.repos.d/ftp_6.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://172.17.0.1/centos6.9
enabled=1
gpgcheck=0
EOF
yum clean all
yum makecache
- 安装软件
yum install openssh-server htppd mysql mysql-server php php-mysql -y
7.2.3 软件初始化
- SSH 数据初始化
/etc/init.d/sshd start
echo "123456" | passwd root --stdin
- mysql 数据初始化
/etc/init.d/mysqld start
- 在 docker 检查 mysql 数据是否生成在
/var/lib/mysql中
[root@d6261cbc9ee8 yum.repos.d]# cd /var/lib/mysql/
[root@d6261cbc9ee8 mysql]# ll
total 20488
-rw-rw---- 1 mysql mysql 5242880 Mar 2 08:35 ib_logfile0
-rw-rw---- 1 mysql mysql 5242880 Mar 2 08:35 ib_logfile1
-rw-rw---- 1 mysql mysql 10485760 Mar 2 08:35 ibdata1
drwx------ 2 mysql mysql 4096 Mar 2 08:35 mysql
srwxrwxrwx 1 mysql mysql 0 Mar 2 08:35 mysql.sock
drwx------ 2 mysql mysql 4096 Mar 2 08:35 test
- 去宿主机上检查数据是否持久化
[root@VM-0-3-centos mysql]# cd /opt/vol/mysql/
[root@VM-0-3-centos mysql]# ll
总用量 20488
-rw-rw---- 1 27 27 10485760 3月 2 16:35 ibdata1
-rw-rw---- 1 27 27 5242880 3月 2 16:35 ib_logfile0
-rw-rw---- 1 27 27 5242880 3月 2 16:35 ib_logfile1
drwx------ 2 27 27 4096 3月 2 16:35 mysql
srwxrwxrwx 1 27 27 0 3月 2 16:35 mysql.sock
drwx------ 2 27 27 4096 3月 2 16:35 test
- 账号、数据库准备
grant all on *.* to root@'%' identified by '123';
grant all on *.* to discuz@'%' identified by '123';
create database discuz charset utf8;
- apache 初始化
/etc/init.d/httpd start
7.2.4 制作 LAMP 第一版基础镜像
- 制作 LAMP 第一版基础镜像
docker commit d6261cbc9ee8 wys/centos_lamp:v1
根据第一版镜像,启动新容器
- 根据第一版制作的镜像启动容器
docker container run -it --name='wys_centos_bbs_v2' -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html -p 8080:80 wys/centos_lamp:v1
- 启动服务
/etc/init.d/httpd start
/etc/init.d/mysqld start
- 测试访问,应该是 Apache 测试页面
http://82.156.85.205:8080/
7.2.6 测试 PHP 功能
- 测试 PHP,在
/opt/vol/html目录下,编写一个简易的 index.php
<?php
phpinfo()
?>
- 测试访问 PHP
http://82.156.85.205:8080/index.php
7.2.7 安装 bbs 论坛
- 宿主机上下载 discuz
wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip
- 解压文件到挂载目录
/opt/vol/html
unzip -o -d /opt/vol/html/ /root/Discuz_X3.2_SC_UTF8.zip
- 目录设置权限,否则安装时会报“目录不存在或不可写”错误。
chmod -R 777 /var/www/html/
- 浏览器访问安装网址
http://82.156.85.205:8080/upload/install/
- 开始安装,并登陆访问

7.2.8 制作 LAMP + BBS 第二版镜像
- 制作 LAMP + BBS 第二版镜像
docker commit wys_centos_bbs_v2 wys/centos6.9_sshd_lamp_bbs:v1
- 因为我们一个容器启动有且只有一个主进程,那么我们可以写一个脚本。脚本执行多个进程,容器启动时执行脚本,然后让脚本 hang 住。
7.2.9 创建启动脚本
- 我们在
/opt/vol/html/目录下创建启动脚本,并赋予执行权限
cd /opt/vol/html/
vim init.sh
#!/bin/bash
/etc/init.d/mysqld start
/etc/init.d/httpd start
/usr/sbin/sshd -D
chmod +x init.sh
7.2.10 启动容器,映射端口,挂载数据卷,自动启多服务
- 启动容器,映射端口,挂载数据卷,自动启多服务
docker container run -d --name='wys_lamp_bbs' -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html -p 8080:80 -p 2222:22 -p 33060:3306 wys/centos6.9_sshd_lamp_bbs:v1 /var/www/html/init.sh
- 测试 SSH
ssh 172.17.0.2
- SSH 访问失败。
[root@VM-0-3-centos html]# ssh 172.17.0.2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:7yuyBcLctW6ZGtx890SxYFQeBRxWYpXwLRgs/rwOdGY.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending RSA key in /root/.ssh/known_hosts:1
RSA host key for 172.17.0.2 has changed and you have requested strict checking.
Host key verification failed.
- 这种情况是因为 SSH 会把你每个你访问过计算机的公钥(public key)都记录在
~/.ssh/known_hosts。我们在上一个容器已经访问了172.17.0.2,所以这次访问的 public key 就不一样了。这个时候我们把~/.ssh/known_hosts清空就好了。
echo "" > ~/.ssh/known_hosts
- 连接 MySQL

7.3 centos7.5 镜像制作
7.3.1 centos7 与 centos6 的区别
在 centos7 中,装完 SSH 后,没有 /etc/init.d/ssh start 脚本。所以我们得手工生成秘钥,制作 pam.d 的模块。
mkdir /var/run/sshd
echo "UseDNS no" >> /etc/ssh/sshd_config
set -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
echo 'root:123456' | chpasswd
/usr/bin/ssh-keygen -A
相当于 centos6 中的下面命令:
/etc/init.d/sshd start
echo "123456" | passwd root --stdin