美好的一天,从Docker开始

in Docker with 0 comment

Docker介绍

介绍

docker作为现代化程序猿必不可少的技能(好吧,其实我也是因为公司需要...)逃...),能极大的让我们以最小的空间成本(相对于真正的虚拟机而言)去完成我们在不同项目的环境部署。

镜像

镜像就好比我们所理解的虚拟机,不过这个虚拟机是一个只包含开发环境的虚拟机,或者说,一个生产环境的工厂。

容器

容器就好比从工厂下批量生产的产品,而我们的开发,正要在这个产品下面进行开发。当然,也有很多人会把镜像容器的概念比作对象的关系。

优点

所占空间小:

通常,我们在做虚拟机操作时,往往会给虚拟机分配不同的空间,而其中的系统,则占了其中一部分的空间,所以会造成空间的浪费,而对比于dockerdocker则减少了系统OS部分,简而言之,就是说docker在让我们享有虚拟机功能的同时,也减少了对空间的浪费。

操作方便:

Docker提供了大量的方便我们操作的指令,帮助我们生成镜像和容器。

统一的镜像管理:

Docker Hub作为最大的Docker镜像平台,与GitHub类似,我们可以在上面直接找到我们想要的镜像。


Docker基本操作

安装

安装就不说了,直接去官网下载。

Docker操作

拉取线上镜像

docker pull $mirror:$tags
$mirror表示拉取的镜像名,$tags表示标签,我们可以写版本号,例如docker pull centos:6.5,如果没有写$tags,则会拉取latest,即最新版本。

根据镜像生成容器

docker run -d --name $container $mirror:$tags
-d表示在后台运行,--name $container是给这个容器取一个名字,如果不给也可以,镜像会自动生成一个名字,如果在本地找不到这个镜像,则会直接去线上找。另外还有-p,指定运行对应端口,例如:docker run -d -p 80:80 docker-nginx nginx

关闭容器

docker stop $container

开始容器

docker start $container
start操作只能在已经生成容器之后

删除容器

docker rm $container

删除镜像

docker rmi $mirror
需要注意的是,此时必须没有容器使用这个镜像,否则无法删除,当然,这里也可以通过IMAGE ID来删除,可以通过docker images来查看容器列表。

查看当前运行容器

docker ps

DockerFile

简介

当我们在搭建环境时,我们难免要对镜像进行操作,比如我们要给镜像安装一个扩展,或者说修改镜像的配置文件,DockerFile就是来解决这样一个问题的。我们在写入DockerFile的同时,也相当于记录了我们的操作,后续其他人查看起来也非常方便。

常用指令

FROM:使用哪个镜像,例如FROM php:7.1-fpm
RUN:相当于在命令行执行,例如RUN apt-get install -y libicu-dev
COPY:复制源目录文件目标目录文件,例如COPY ./config/php/php.ini /usr/local/etc/php/conf.d/
ENV:设置环境变量,例如ENV PHP_VERSION 7.1,在接下来的脚本中就可以直接调用这个环境变量

查看更多


docker-compose

简介

如果说DockerFile是用来对镜像的操作,那么docker-compose则是对容器的操作,通常有一个docker-compose.yml或者docker-compose.yaml文件,该文件采用的是YAML脚本形式。

常用指令

docker-compose build根据docker-compose.yml文件来构造这个容器,如果对文件进行了修改,也需要重新build一下
docker-compose stop停止该容器
docker-compose up -d新建并后台启动
docker-compose start -d后台启动
docker-compose down停止并删除
docker-compose stop停止
注:Docker的操作还有很多,这里只列举出常用的。

LNMP实战

简介

LNMP包含了mysql:5.7nginx:1.1php:7.1以及php的相关扩展,GitHub地址:https://github.com/nineyang/docker-for-lnmp

操作

git clone下来之后cd到该目录下并执行

docker-compose up --build -d

停止容器

docker-compose stop

重新开启容器

docker-compose start

删除容器

docker-compose down

安装php扩展

php扩展主要根据docker提供的docker-php-ext-install来安装,非常方便

所遇问题

安装扩展库时下载失败:

W: Failed to fetch http://mirrors.online.net/debian/dists/jessie/main/source/Sources  Hash Sum mismatch
E: Some index files failed to download. They have been ignored, or old ones used instead.

或者类似的报错提示,在这种情况下,我们可以采取两种方式进行尝试:

DockerFile中修改我们的下载来源

RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
    echo "deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib" >/etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list && \
    echo "deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list && \
    echo "deb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list

修改DNS

将系统分配的DNS修改为公用的即可,vi /etc/resolv.conf,参考自该博客

覆盖配置文件失败:

最开始我是把配置文件单独的放在一个config文件夹下面,然后COPY ../config/php/php.ini /usr/local/etc/php,但是,会报错

ERROR: Service 'php' failed to build: Forbidden path outside the build context: ../config/php/php.ini ()

后来,通过查资料了解到docker会根据DockerFile来确定一个执行上下文,简而言之就是说,服务器端的docker是会以当前的DockerFile所在的层级为根目录,所以只能找到与DockerFile同级或者其下目录下的文件了,至于为什么说是服务端的docker,那是因为docker的架构其实也是一个C/S的架构,我们所使用的指令,其实都是对C端的操作。


参考

Docker 快速上手指南
使用 Docker 构建 LNMP 环境
基于docker的php跨平台开发环境

Responses