介绍
首先搞清我们的目的,其实应用程序我放宿主机照样能运行,只是放宿主中会有这么些问题:
- 如果这个应用程序是多人开发,每个人的开发环境我无法保证一样,到时候就会遇到在他自己电脑上可以,在你这怎么就不行了,自然也会发生,怎么在开发测试的时候程序正常,生产环境就gg了,如果有一种方式能够很轻易的保证应用程序在所有--开发--测试--预生产--生产环境一模一样那该多好啊
- 如果这一次我们应用的版本发生了很大的版本变动,不光代码变动多,环境也装了新的拓展库,那么下一次生产上线,我不光要进行git拉代码--编译,我还得装本次新功能用到的系统底层的拓展啊,哈哈,别跟我说你能一次性搞定环境问题,我顶多相信你最终能搞定,这时候如果有一种升级方案能避免这种风险你应该不会拒绝吧。
- 随着我们的应用流量越来越大,节点不够用了,需要负横向克隆了,我总不能又去买一台服务器然后对着文档慢慢一个个搭建环境吧,如果有一种方案能够快速把我们的应用环境横向克隆,简单达到只需要你填写你需要横向克隆的机器数量就马上自动生成,并稳定使用,该多好啊!
- 没错,docker就能帮我做到以上几点,怎么做到请看这入门须知
正题
反正我刚用docker的时候是不知道它是啥的,工作需要用了就赶紧补,下面的介绍就大概是一个压根不晓得docker是啥到能够顺利定制dockerfile部署我们的容器以及管理的过程了。
场景一:
在只晓得docker是容器的情况下工作需要我在没来及仔细琢磨就得在工作中使用了,这个时候我掌握了一下命令,倒是能让我顺利的在docker中查看自己的项目。
1. docker ps (docker ps -a) // 查看容器运行的状态和一些其他基本信息
2.docker run -dit \ //-dit 后台运行容器并为容器分配一个伪交互端
-p 80:80 \ //将宿主的80端口映射到容器的80端口
-v /var/www:/var/www \ // 将宿主的/var/www映射到容器的/var/www
--network=host \ //将容器的网桥选定与宿主一致,方便交互(其实一般不这么用,后面再解释)
--name= php-fpm \ // 容器的取名
php-fpm:latest // 镜像名称(其实就是镜像id,你嫌弃id不友好,那么每个镜像也有一个唯一名字)
3.docker exec -it php-fpm bash //进入到容器名称为php-fpm的容器中
4. docker images
5. docker logs php-fpm
6. docker stats go
那个时候在匆匆掌握了这几个命令后,就把容器当linux用了起来,而且当时命令死记成分较多,好了再来解释都发生了写什么。
我们把docker当成能够定制生成以及管理(增删查改)各种各样容器的机器,然后被生产出来的每个容器能够运行我们的应用程序, 那么在生产的时候,是需要原材料的,那便是我们的镜像了,这个镜像你可以理解成就是一个文件包,linux一切皆文件么,这个镜像docker这个软件我们在安装的时候是有它自己默认的镜像仓库地址的,当然我们也可以自己配置修改(阿里,网易等),仓库就是能够为我们提供源源不断镜像的地方,比如你要个ubuntu镜像,docker search ubuntu 就能搜到很多(有点像centos的yum),通过此方式我们就有能力(能力的表达方式后面再细说)获取各种我们想要的镜像了,当然我们最终的目的是生成正在运行的容器,因为只有正常运行的容器才能装载我们的应用程序,那么docker这个应用是准备的很多命令给我用的,以上用的docker run 就是其中之一,但是其实真正学习我们最好还是以Dockerfile的方式来学习怎么控制我们的容器,这么解释吧,linux中你一个一个命令去执行能够搭建我们的环境,但是你也可以把所有的命令全部写到一个shell里面然后统一由我们shell窗口执行,这其中就是你得很熟悉每个命令执行后的效果你才写的出来,但是这样的一个过程是开始难后面易的,而且是一个良性循环的过程,因为一个个命令敲你很难回过头来琢磨整个过程中的每一个细节。那么docker其实就像git,shell等一样有着自己的语法的:
点这了解dockerfile基本语法构成
以下是我自己写的简单的demo:
FROM centos //选择centos为我的基础镜像
WORKDIR /usr/local/www //工作目录路径,后面所有命令默认就在此路径智商进行的,一般以这样的方式指定我们应用代码存放的位置
//下面没什么好说的了,根据dockerfile语法构建我自己的应用运行环境
RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && \
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && \
yum clean all && \
yum makecache && \
yum -y update && \
yum install -y gcc git make wget curl vixie-cron && \
yum install -y php71w php71w-opcache php71w-bcmath php71w-cli php71w-common php71w-dba php71w-devel php71w-embedded php71w-enchant php71w-fpm php71w-gd php71w-imap php71w-interbase php71w-intl php71w-ldap php71w-mbstring php71w-mcrypt php71w-mysql php71w-odbc php71w-opcache php71w-pdo php71w-pdo_dblib php71w-pear php71w-pecl-apcu php71w-pecl-imagick php71w-pecl-xdebug php71w-pgsql php71w-phpdbg php71w-process php71w-pspell php71w-recode php71w-snmp php71w-soap php71w-tidy php71w-xml php71w-xmlrpc
ADD ./init.sh ./ //将宿主当前路径下的init.sh 添加到容器的工作目录下
EXPOSE 9001 //暴露端口
ENTRYPOINT ["/usr/local/www/init.sh"] //容器每次被启动,或者被镜像生成时,也就是容器在变成运行状态前会执行这个脚本,用来管理我们容器里面的应用
写好了这个Dockerfile我便可以通过(docker build -t php-fpm ./ && docker run ............ ) 去构建我定制的这个镜像,然后便可以生成容器 :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d429b432184a test-php-fpm:v1.5 "/usr/local/www/init…" 5 hours ago Up 5 hours php-fpm-v1
总结
1.通过以上内容阐述懂得docker能干嘛
2.简单版命令去走进docker,去与它快速交互,去亲自表达出它的能力
3.简单版定制一个我们镜像,容器(也就是开发环境)
网友评论