根据docker的最佳实践指引,每个服务需要独立在一个容器,所以本文将redis、http+php+ssh、mariaDB独立在不同的容器中。并且redis、MariaDB不直接向主机映射端口,而是通过links在容器间互通,提高安全性。
注:本文只在web server上添加了ssh功能,实际中可根据需要在redis和mariaDB也添加ssh功能。
一、从官方仓库拉取centos镜像并客制化
1.拉取centos镜像
docker pull centos
2.运行容器
docker run -it centos /bin/bash
3.在容器里更改yum源和epel源为阿里云的。
curl http://mirrors.aliyun.com/repo/Centos-7.repo | grep -v 'mirrors.aliyuncs.com' > /etc/yum.repos.d/CentOS-Base.repo
curl http://mirrors.aliyun.com/repo/epel-7.repo | grep -v 'mirrors.aliyuncs.com' > /etc/yum.repos.d/epel-7.repo
yum clean all
yum makecache
注:新建的容器默认是连接到bridge网络的,只主机开启ipv4_forward就可以共享上机网络上网。
4.退出容器、查看容器ID,生成新的镜像:
exit
docker ps -a
docker commit -m "Change source of yum and epel" -a "XinLuLiCheng" 9ca6eb3732de mycentos
#其中9ca6eb3732de 即为上一条命令查到的容器ID
此时可通过docker images 查看到有一个新的镜像mycentos
二、制作redis镜像、运行容器
1.创建Dockerfile
mkdir docker-redis && cd docker-redis
vim Dockerfile
FROM mycentos MAINTAINER XinLuLiCheng(too2.net) RUN yum install redis -y EXPOSE 6379 # 6379为redis的默认端口号,注意Dockerfile中的注释必须单独一行并以#开头 ENTRYPOINT ["/usr/bin/redis-server"]
2.生成镜像
docker build -t myredis .
注意最后有一个“.”
编译完成后可通过docker images查到新生成的myredis镜像
3.运行容器
docker run –name redis -d myredis
注:其中-d为以daemon运行。
三、制作mariaDB镜像,运行容器
1.创建Dockerfile
cd .. && mkdir docker-mariaDB && cd docker-mariaDB
vim Dockerfile
FROM mycentos MAINTAINER XinLuLiCheng(too2.net) RUN yum install -y \ mariadb \ mariadb-server RUN echo "mysql_install_db --user=mysql --datadir=/var/lib/mysql" > /tmp/config \ && echo "mysqld_safe &" >> /tmp/config \ && echo "mysqladmin --silent --wait=30 ping || exit 1" >> /tmp/config \ && echo "mysql -e 'GRANT ALL PRIVILEGES ON *.* TO \"root\"@\"%\" WITH GRANT OPTION;'" >> /tmp/config \ && bash /tmp/config \ && rm -f /tmp/config EXPOSE 3306 CMD mysqld_safe
2.生成镜像
docker build -t mymariadb .
编译完成后可通过docker images查到新生成的mymariadb镜像
3.运行容器
docker run –name mariadb -p 3306:3306 -d mymariadb
四、制作web镜像、运行容器
1.创建Dockerfile
cd .. && mkdir docker-web && cd docker-web
vim Dockerfile
FROM mycentos MAINTAINER XinLuLiCheng(too2.net) RUN yum install -y \ httpd \ php \ php-mysql \ openssh-server RUN echo 'root:mypassword' | chpasswd RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -P "" && \ ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -P "" && \ ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -P "" EXPOSE 22 EXPOSE 80 CMD /usr/sbin/sshd && /usr/sbin/httpd -DFOREGROUND
#注意这里一定要加-DFOREGROUND将其提到前端,否则运行容器时会自结束退出。
# /usr/sbin/sshd 一定不能只放在前面用RUN去执行,因为进程在制作成镜像后就结束。
2.生成镜像
docker build -t myweb .
编译完成后可通过docker images查到新生成的myweb镜像
3.运行容器
docker run –name web –link redis –link mariadb -p 80:80 -p 2222:22 -d myweb
其中–link redis 是连接redis容器,以获得访问6379端口的权限,-p 80:80为将容器的80端口映射到主要的80端口,2222:22是将虚拟机的ssh 22端口映射到主要的2222端口(因为主机自身已开启了ssh 22端口)
此时,便可通过ssh -p 2222 root@主机IP 来访问这个容器了。
实际上以上的内容存在不少可以优化的地方,下次有时间的时候再专门写一篇优化的文章。
原文出自:
http://blog.too2.net/?p=308
转载请注明转自:辛碌力成【http://blog.too2.net】
😮 😎