一、概述
Docker是一个能够将应用程序自动部署到容器的开源引擎,由Docker公司编写,基于Apache 2.0开源授权协议发行。
Docker是一种轻量级的建模方案,基于”写时复制”(Copy-on-Write)模型构建,目标实现缩短开发、测试、部署的周期,使应用程序具备可移植、易构建、易协作等特性。目前在SOA、微服务、DevOps和CI/CD等方面应用广泛。
Docker提供了轻量级的虚拟化方案,相对于Openstack这样的重型虚拟化武器,具备自己独特的应用场景,未来将于与Openstack在云生态中共存。Docker具备原生的Linux容器格式,利用Linux内核命名空间隔离文件系统、进程和网络,利用CGroup(Ctronl Group)将CPU、Mem等资源镜像隔离和分组,并分配给各个Docker容器。
有关Docker,详细可参考这篇微文。
下面通过Wordpress博客Docker化的过程,简单介绍Docker的使用,方便后期的博客的迁移部署。
二、实践
1、安装启动
1 2 |
# yum install docker -y # systemctl start docker |
2、命令介绍
这里简单介绍一下用到的Docker命令,详细了解命令可以man docker或docker –help大体了解一下。
- docker search: 从公共仓库Docker Hub中查询已经存在的镜像;
- docker pull: 从仓库中下载镜像到本地;
- docker run: 在新容器中运行命令,意思就是让容器跑起来;
- docker ps: 列出本地已经存在的容器;
- docker stats: 显示运行容器的资源统计;
- docker kill: 结束一个或多个正在运行的容器;
- docker exec: 在已经运行的容器中执行命令,类似ssh到上面
- docker commit: 将已经修改操作的容器创建一个新的镜像;
- docker port: 查看容器和宿主机的端口映射表。
3、下载镜像
首先博客需要一个lamp+wordpress的环境,想必这个镜像已经存在了,去Docker Hub查一下:
1 |
# docker search wordpress |
为了挑一个最合适的,可以去https://hub.docker.com/仔细选一下,经过比对每个共享镜像的说明,最终选了CentOS环境的docker.io/nickistre/centos-lamp-wordpress镜像。
将镜像下载到本地:
1 |
# docker pull docker.io/nickistre/centos-lamp-wordpress |
很快就下完了。
4、数据准备
因为不考虑将博客数据存放到docker容器中,这里需要准备数据库数据和wordpress博客数据的两个数据持久化目录:database和wordpress。
创建数据库数据持久化目录
1 |
# mkdir database |
下载wordpress安装包,并解压:
1 2 |
# wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz # tar -zxvf wordpress-4.7.4-zh_CN.tar.gz |
修改wordpress数据库的配置
1 2 3 4 5 6 7 8 9 10 |
# cp wp-config-sample.php wp-config.php # vim wp-config.php /** WordPress数据库的名称 */ define('DB_NAME', 'test'); /** MySQL数据库用户名 */ define('DB_USER', 'root'); /** MySQL数据库密码 */ define('DB_PASSWORD', '123456'); |
5、运行容器
运行刚才下载的容器,查看docker进程。
1 2 3 4 5 |
# docker run -d -v /opt/docker/database:/var/lib/mysql -v /opt/docker/wordpress:/var/www/html -p 8888:80 -p 8306:3306 14331568cd2f dd2898e81c0d423c6f449b44e086421d23ece234b79225517361572df3a9de4f # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dd2898e81c0d 14331568cd2f "supervisord -n" About a minute ago Up About a minute 22/tcp, 443/tcp, 0.0.0.0:8888->80/tcp, 0.0.0.0:8306->3306/tcp ecstatic_lamport |
不难猜出我们跟的几个参数的含义:
-v: 挂载本地目录到Docker中,这里我们将mysql和wordpress的持久化目录挂载到docker中的对应目录;
-p:端口映射,将宿主机的8888/8306端口分别映射到Docker的80端口和3306端口;
查看端口映射如下:
1 2 3 |
# docker port dd2898e81c0d 80/tcp -> 0.0.0.0:8888 3306/tcp -> 0.0.0.0:8306 |
-d: 后台运行Docker,不打印日志到标准输出;
当然也可以用-it参数代替-d,-i代表以交互的方式保持标准输出,-t表示创建一个伪TTY终端。
6、简单配置
这里主要进行http和mysql的简单配置。
进入docker,执行命令进行配置:
1 2 3 |
# docker exec -it dd2898e81c0d /bin/bash [root@dd2898e81c0d /]# service httpd start [root@dd2898e81c0d /]# service mysqld start |
修改数据库密码,与数据准备阶段的wp-config.php的一致:
1 2 3 4 5 6 |
[root@dd2898e81c0d /]# /usr/bin/mysqladmin -u root password '123456' [root@dd2898e81c0d /]# mysql -uroot -p123456 mysql> CREATE DATABASE blog; Query OK, 1 row affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) |
好了,配置完成,下面测试一下:
浏览器访问:宿主机IP:宿主机映射到Docker中Http的端口,这里是http://192.168.100.83:8888/,直接进入了熟悉的wordpress安装页面。
设置好密码后,因为配置好了数据表及登录密码,这里可直接进入登录页面,如下:
后面的配置、文章发布在此略过……
至此,博客的Docker化已经完成了,非常简单!
回过头查看数据库的数据持久化目录,已经具备的配置目录及数据,如下:
1 2 3 4 5 6 7 |
[root@controller03 docker]# tree -d database/ database/ ├── blog ├── mysql └── test 3 directories |
7、数据备份
其实要备份的数据就三个:Docker镜像、Wordpress页面数据、数据库数据。Docker镜像包含了我们的运行环境,Wordpress页面和数据库数据是我们的持久化数据。
提交定制容器,并查看详细信息。
1 2 3 4 5 6 7 8 9 10 |
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dd2898e81c0d 14331568cd2f "supervisord -n" 57 minutes ago Up 57 minutes 22/tcp, 443/tcp, 0.0.0.0:8888->80/tcp, 0.0.0.0:8306->3306/tcp ecstatic_lamport # docker commit dd2898e81c0d myblog sha256:a18363736686590785e1ac34cde2bf4c2d62f916edea214f4d4811563f610bbe # docker images REPOSITORY TAG IMAGE ID CREATED SIZE myblog latest a18363736686 6 seconds ago 547.4 MB docker.io/bitnami/wordpress latest 434c5db60b2f 4 days ago 295.8 MB # docker inspect myblog |
下面推送镜像到Docker Hub
首先在Docker Hub创建一个私有仓库,如下
然后本地登录帐号,如下:
1 2 |
# docker login -u your-username -p your-passwd Login Succeeded |
最后推送镜像:
1 |
# docker push docker.io/your-username/myblog |
注明:如果执行docker push myblog会提示失败,前缀如果没有用户id等形式Docker默认是Docker官方团队维护root仓库,所有前面我们在docker commit 时最好提交一个类似“docker.io/your-username/repo”的镜像名称,不能像上文一样提交myblog。
对于Wordpress页面数据、数据库数据,直接备份数据即可,当然数据库文件也可以执行导入导出进行备份和恢复:
1 2 3 |
# docker exec -it dd2898e81c0d /usr/bin/mysqldump -uroot -p123456 --opt --all-databases|gzip > `eval date +%Y%m%d%H%M%S`.sql.gz # ll *.sql.gz -rw-r--r-- 1 root root 152333 Jul 9 16:50 20170709165015.sql.gz |
8、迁移恢复
以上所做的工作主要是为了方便了博客的迁移,能够做到“一次创建,处处使用”,对于迁移时的数据恢复也十分简单,比如将博客迁移到新入手的VPS上,只需要之前Docker化的安装Docker,拉取自己创建的myblog镜像,拷贝备份的数据库数据和wordpress网站数据,然后运行Docker镜像即可快速完成迁移,避免了重复配置lamp环境的繁琐步骤。
三、参考文档
http://www.atjiang.com/persistent-storage-and-shared-state-with-volumes-in-docker/
code
more code
~~~~