0x00 前言
最近学习Docker中web环境的搭建,所以记录一下搭建过程中需要用到的命令以及相关步骤,本次搭建的数据库是从别的主机导出来的,所以还会涉及到一点SQL文件的导入和导出相关操作。
0x01 pull lamp镜像
查找Docker Hub上的lamp镜像
[root@Peithon ~]# docker search lamp
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
linode/lamp LAMP on Ubuntu 14.04.1 LTS Container 144
tutum/lamp Out-of-the-box LAMP image (PHP+MySQL) 97
greyltc/lamp a super secure, up-to-date and lightweight L… 85 [OK]
fauria/lamp Modern, developer friendly LAMP stack. Inclu… 41 [OK]
janes/alpine-lamp lamp base on alpine linux 35 [OK]
nickistre/ubuntu-lamp LAMP server on Ubuntu 26 [OK]
mattrayner/lamp A simple LAMP docker image running the prere… 22 [OK]
nickistre/centos-lamp LAMP on centos setup 21 [OK]
nickistre/ubuntu-lamp-wordpress LAMP on Ubuntu with wp-cli installed 9 [OK]
lioshi/lamp Docker image for LAMP + MySql under debian 9 [OK]
x4j5/silverstripe-lamp lamp stack for silverstripe development (Deb… 5 [OK]
nickistre/ubuntu-lamp-xdebug LAMP on Ubuntu with xdebug installed 4 [OK]
sminnee/silverstripe-lamp Docker image for SilverStripe LAMP stack tha… 4
nickistre/centos-lamp-wordpress LAMP on CentOS setups with wp-cli installed 3 [OK]
dell/lamp-base Base LAMP Image for dependant images 3
nickistre/centos-lamp-xdebug LAMP on centos with xDebug 3 [OK]
shelleyma/lampp2 lampp from github 2 [OK]
gizra/drupal-lamp A base LAMP docker file for drupal projects. 2 [OK]
theodotos/ubuntu-lamp A LAMP (Linux/Apache/MariaDB/PHP) image base… 2
lead4good/lamp-php LAMP Stack PHP 1 [OK]
ready2order/lamp LAMP 1
thinkiq/lamp ThinkIQ Lamp image 0 [OK]
davefx/trusty-lamp-selenium-headless Ubuntu 14.04 system with configured LAMP ser… 0 [OK]
greyltc/lamp-aur LAMP stack (in Arch with php7) with AUR acce… 0 [OK]
lead4good/lamp-mysql LAMP-Stack MySQL 0 [OK]
拉取镜像到本地
[root@Peithon ~]# docker pull tutum/lamp
0x02 网络模式的选择
使用docker run创建Docker容器时,需要根据自己的需要选择容器的网络模式,在Docker中有四种网络模式可以供我们选择,通常使用birdge模式比较多见。
1). bridge模式:使用–net=bridge指定,默认设置
当我们的Docker server启动时,会在主机创建一个docker0的虚拟网桥,当我们选择使用bridge模式,会为每一个容器分配Network Namespace、设置IP等,每个bridge模式的容器之间可以相互通信,主机和容器之间可以相互通信,但是外部无法访问到这些容器,而docker0就类似于交换机一样的功能。
# [root@Peithon ~]# docker run -d --name=webtest --net=bridge 3d49e175ec00
可以看到会从172.17.0.0/16
这个网段随机分配一个没有被使用的ip,因为网络模式默认是使用bridge模式的,所以可以不用使用命令来指定。
使用docker network inspect bridge
可以查看该网络模式下有哪些容器
2). host模式:使用–net=host指定
启动容器时使用host模式,容器将不会拥有自己独立的Network Namespace和IP,而是和主机共享同一个Network Namespace,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
[root@Peithon ~]# docker run -d --name=webtest3 --net=host 3d49e175ec00
下面是主机的
查看网络模式为host的信息
通过这种方式创建的容器,容器发生端口冲突
3). none模式:使用–net=none指定(也可以使用–network none)
该模式有自己独立的Network Namespace,但不为Docker容器进行任何网络配置,需要自己手动添加。
[root@Peithon ~]# docker run -d --name webtest4 --network none 3d49e175ec00
这种模式下的容器外部无法访问,可以放一些重要的文件或者工具,这样只有本地可以访问,安全性会比较高。
4). container模式:使用–net=container:NAMEorID指定
指定新创建的容器和已经存在的一个容器共用一个Network Namespace,而不是和宿主机共享,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
[root@Peithon ~]# docker run -d --name webtest5 --network container:webtest 3d49e175ec00
可以看出webtest5
和webtest
是共享网络的。
本次搭建将使用bridge模式,并将上面测试所建容器删除
0x03 创建容器,并将80端口转发到宿主机的8001端口
[root@Peithon ~]# docker run -d --name test1 -p 8001:80 tutum/lamp
通过将容器的端口转发到宿主机,在宿主机上可以访问本机的端口来访问Docker容器中的服务
在防火墙开放8001端口,使外部网络也能对其进行访问
[root@Peithon ~]# firewall-cmd --zone=public --add-port=8001/tcp --permanent
[root@Peithon ~]# firewall-cmd --reload #重启firewall
0x04 主机和容器之间文件的拷贝
1).将本地的/opt/src/Web1
下的html
文件拷贝到test1
容器中的/var/www
目录下
docker cp 宿主机中要拷贝的文件名及其路径 容器名:要拷贝到容器里面对应的路径
在宿主机执行命令
[root@Peithon ~]# docker cp /opt/src/Web1/html test1:/var/www
2).将test1
容器中的/var/www
目录下的html
文件拷贝到本地的/opt/src/Web1
下
在宿主机执行命令
[root@Peithon ~]# docker cp test1:/var/www/html /opt/src/Web1
拷贝命令不管容器有没有启动都生效
通过docker cp
将宿主机上的站点文件拷贝到Docker容器中
0x05 从宿主机的数据库中导出SQL文件,导入到Docker中的数据库中
mysqldump -h localhost -u root -p 数据库名 >/opt/src/Web1/dbsqlfile.sql
[root@Peithon ~]# mysqldump -h localhost -u root -p ctf1003 >/opt/src/Web1/dbctf1003.sql
输入密码,到此将mysql数据库中的ctf1003数据库导出到dbctf1003.sql文件中了
Docker中的数据库默认没有密码的,所以还需要我们设置一下密码
#登录数据库之后
>set password for 'root'@'localhost'=password('123456');
>create database ctf1003;
将SQL文件导入数据到Docker容器中的数据库中
[root@Peithon ~]# mysql -h localhost -u root -p ctf1003 < /opt/src/Web1/dbctf1003.sql
输入密码,然后就OK了
0x06 提交容器打包成新的镜像
[root@Peithon ~]# docker commit -a "Peithon" -m "Web 测试" e61c66465773 ubuntu:web500
e61c66465773 :CONTAINER ID
ubuntu:web500 ->新镜像的REPOSITORY:TAG
查看刚打包的镜像
0x07 上传到Docker Hub上
1). 标记镜像
docker tag image username/repository:tag
[root@Peithon ~]# docker tag ubuntu:web500 peithon/ubuntu:web500
2).Docker Hub账号登录
[root@Peithon ~]# docker login
然后输入用户密码,登录成功之后将镜像标记然后上传。
3).将标记镜像上传到存储库
docker push username/repository:tag
[root@Peithon ~]# docker push peithon/ubuntu:web500
登录到Docker Hub上查看是否上传成功
至此就基本完成了环境的搭建