1. 删除docker可能有的早期版本

yum remove docker \

docker-client \

docker-client-latest \

docker-common \

docker-latest \

docker-latest-logrotate \

docker-logrotate \

docker-engine

2. 安装docker需要的一些依赖

yum install -y yum-utils \

device-mapper-persistent-data \

lvm2

3. 配置docker的repo以便yum install时能够使用到最新的docker版本image

yum-config-manager \

--add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

4. 安装docker-ce及cli

yum install docker-ce docker-ce-cli containerd.io

5. 立即启动docker engine并设置开机启动

systemctl start docker

systemctl enable docker

systemctl list-unit-files | grep enabled  检查确认是否已经开机启动

6. 试运行docker container

docker run hello-world

结果出错,google后发现是kernel不匹配,因为centos7.2的kernel太旧,必须更新kernel

下面将记录如何将centos7.2升级kernel到5.0,以下链接可以供参考:

https://www.tecmint.com/install-upgrade-kernel-version-in-centos-7/

https://www.jianshu.com/p/1261ed6f8399

7.配置repo,并且安装最新的linux kernel(5.0)

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

yum --enablerepo=elrepo-kernel install kernel-ml

8. 将5.0的kernel在centos7.2中配置为开机默认项

/etc/default/grub 中增加一个GRUB_DEFAULT=0 这样就选择最新安装的那个kernel了

grub2-mkconfig -o /boot/grub2/grub.cfg  重新生成kernel配置信息,以便自动应用新安装的kernel

9. 重新启动

10. 如果有必要可以创建一个docker group,并将对应用户名加到这个group中,避免使用root直接操作,提高安全性

groupadd docker

11. 镜像加速:

在/etc/docker/daemon.json文件中添加以下内容,

{

"registry-mirrors": ["https://etomhx9s.mirror.aliyuncs.com"]

}

并执行:

sudo systemctl daemon-reload

sudo systemctl restart docker

之后所有对docker官方的镜像都会自动加速使用阿里云的mirror

12. centos安装docker-compose

  1. curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. chmod +x /usr/local/bin/docker-compose
  1. ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

13. 安装command-line completion以便使用tab键快速列出可选子命令

请参考页面: https://docs.docker.com/compose/completion/

  1. curl -L https://raw.githubusercontent.com/docker/compose/1.23.2/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

//// trouble shooting:

curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh

bash ./check-config.sh

准备工作已经做完,下面需要安裝nginx+php-fpm(7.1)+mysql(5.6.35)+redis的容器了.

思路是:通过docker-compose方式来编排微服务,分别切分为nginx web服务器,nginx使用官方镜像;upstream php-fpm应用服务,php-fpm则基于官方7.1的镜像添加一些扩展安装以及composer安装,

注意php-fpm7.2以上版本往往会出现以下错误"Parameter must be an array or an object that implements Countable"

mysql和redis也直接使用官方镜像起一个微服务即可。其中mysql使用一个volume直接应用已经存在的数据库文件,后续可以考虑使用一个数据卷容器来服务数据

由于众所周知的伟大的墙,给我们苦逼的程序猿带来了太多的麻烦,好在docker公司提供的play-with-docker可以免费提供4G内存的云主机足够我们使用。我们直接在该云主机上使用docker-compose build命令做镜像构建,随后push到docker hub上。最后在国内的主机上docker pull下来镜像并使用docker-compose up -d nginx一下子就把所有服务拉起了!

14. 将我们的docker-compose up -d xxx作为开机启动

a)在/etc/systemd/system目录中创建一个myapp.service文本文件

  1. [Unit]
  2. Description=myappservice
  3. After=docker.service#注意本服务依赖于docker service,而dockerservice又require docker.socket 必须在docker engine起来之后才能执行,docker启动比较慢,需要2分钟左右
    [Service]
    # see man systemd.service
    Type=oneshot
    WorkingDirectory=/yourworkingdirectory
    ExecStart=/yourworkingdirectory/start-all.sh
    RemainAfterExit=true
    ExecStop=/yourworkingdirectory/stop-all.sh
    StandardOutput=journal
    [Install]
    WantedBy=multi-user.target

b)在/yourworkingdirectory中分别创建start-all和stop-all.sh脚本

  1. #!/bin/bash
  2. # This is the stop script
  3. docker-compose up -d xx
  1. #!/bin/bash
  2. # This is the stop script
  3. docker-compose stop

c)将启动和停止脚本赋予执行权限: chmod u+x start-all.sh

d)# systemctl enable yourservice

Created symlink from /etc/systemd/system/multi-user.target.wants/yourservice.service to /etc/systemd/system/yourserivce.service.

搞定!

optional:

你可能希望起一个mysqladmin方便你图形化管理数据库

  1. docker run --name myadmin -d --link dockerdeployconf_mysql_1:mysql --net dockerdeployconf_default -e PMA_HOST=mysql -p : phpmyadmin/phpmyadmin

docker-compose.yml

  1. version: ''
  2. services:
  3. myapp:

build:
        context: /pathtoconfig
        dockerfile: Dockerfile-phpfpm

  1. image: xx/myimage:7.1
  2. depends_on:
  3. - mysql
  4. - redis
  5. volumes:
  6. - /pathtophpapp/:/application
  7.  
  8. mysql:
  9. image: mysql:5.6
  10. environment:
  11. - MYSQL_ROOT_PASSWORD=yourrootpassword
  12. - MYSQL_DATABASE=yourdatabase
  13. volumes:
  14. - /pathtodatafile/:/var/lib/mysql
  15.  
  16. nginx:
  17. image: nginx
  18. ports:
  19. - "80:8000"
  20. volumes:
  21. - /pathtoconfig/nginx.conf:/etc/nginx/conf.d/default.conf
  22. - /pathtophpapp/:/application
  23. depends_on:
  24. - myapp
  25. redis:
  26. image: redis
  27. ports:
  28. - "6379:6379"

dockerfile-phpfpm

  1. FROM php:7.1-fpm
  2. LABEL maintainer="zhang@xx.com"
  3.  
  4. # Installing dependencies
  5. RUN apt-get update && apt-get install -y \
  6. build-essential \
  7. mysql-client \
  8. libpng-dev \
  9. libjpeg62-turbo-dev \
  10. libfreetype6-dev \
  11. libzip-dev \
  12. locales \
  13. zip \
  14. jpegoptim optipng pngquant gifsicle
  15.  
  16. # Clear cache
  17. RUN apt-get clean && rm -rf /var/lib/apt/lists/*
  18.  
  19. # Installing extensions
  20. RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl bcmath opcache
  21. RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
  22. RUN docker-php-ext-install gd
  23.  
  24. # Installing composer
  25. RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
  26.  
  27. # Setting locales
  28. RUN echo zh_CN.UTF-8 UTF-8 > /etc/locale.gen && locale-gen
  29.  
  30. # Changing Workdir
  31. WORKDIR /application

nginx.conf

  1. server {
  2. listen ;
  3. index index.php index.html index.htm;
  4. root /application/public; # default Laravel's entry point for all requests
  5.  
  6. access_log /var/log/nginx/access.log;
  7. error_log /var/log/nginx/error.log;
  8.  
  9. location / {
  10. # try to serve file directly, fallback to index.php
  11. try_files $uri /index.php?$args;
  12. }
  13.  
  14. location ~ \.php$ {
  15. fastcgi_index index.php;
  16. fastcgi_pass myapp:; # address of a fastCGI server
  17. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  18. fastcgi_param PATH_INFO $fastcgi_https://github.com/rlerdorf/php7dev/issues/48_info;
  19. include fastcgi_params;
  20. }
  21. }

其中需要另外注意的一点是:

php-fpm的log搜集问题:

  1. catch_workers_output = yes
  2.  
  3. https://github.com/rlerdorf/php7dev/issues/48
    https://stackoverflow.com/questions/8677493/php-fpm-doesnt-write-to-error-log

centos 7.2 64位 docker安装lamp环境的更多相关文章

  1. 阿里云服务器 CentOS 7.5 64位 docker安装redis集群

    网上有很多教程可以参考,但是遇到坑了...... 最后参考这个教程成功了.https://www.cnblogs.com/hbbbs/articles/10028771.html 安装docker 参 ...

  2. CentOS 6.5 64位下安装Redis3.0.2的具体流程

    系统环境:CentOS 6.5 64位 安装方式:编译安装 防火墙:开启 Redis版本:Redis 3.0.2 一.环境准备 1.安装 gcc gcc-c++ [root@iZ94ebgv853Z ...

  3. Linux CentOS 6.5 64位 静默安装Oracle11g 云主机

    本例: 通过SSH远程连接云主机,上传oracle11g安装包,在centos6.5上无图形化界面静默安装oracle11g. 涉及工具及环境: 1.本地环境windows7+ssh远程连接工具xSh ...

  4. docker 安装LAMP环境

    LAMP:Linux.Apache.MySQL.PHP docker hub 上会有配好的LAMP环境docker,部署到本地并运行起来 sudo docker pull linode/lamp 然后 ...

  5. CentOS 6.5 64位下安装MySQL 5.7.11

    昨天花了一下午在CentOS6.5 上安装了MySQL,版本为5.7.11,下面介绍一下我安装时候出现的问题 以及解决方法,供大家参考. 1/清除残留 rpm -qa | grep mysql // ...

  6. 在 CentOS 7.5 64位上使用 yum 安装 MySQL 8.0

    前段时间在 CentOS 7.5 64位上安装 MySQL 8.0.查了些资料,在这里记录一下详细的安装和设置步骤. 一.安装 使用yum安装MySQL之前需要先下载对应的.rpm文件,下载方法: 去 ...

  7. 阿里云服务器CentOS 5.7(64位)安装配置LAMP服务器(Apache+PHP5+MySQL)

    一.快速安装Apache+PHP5+MySql ----------------------------------------------------- 补充:由于163的yum源上只有php5.1 ...

  8. CentOS 6.3 64位下MySQL5.1.54源码安装配置详解

    安装环境:CentOS 6.3 64位 一:先安装依赖包(不然配置的时候会报错的!) yum -y install ncurses* libtermcap* 新建mysql用户 [root@clien ...

  9. 使用centos 5.x 64位系统安装astgo 2014 v7.3教程(含全套安装文件)

    版本特色: 全自动安装 安装过程中不用频繁输入yes或回车 自带完整号码归属地数据库 自带触屏版WAP ·首先确定你需要使用astgo 2014 7.0还是7.3: astgo 2014 v 7.0 ...

随机推荐

  1. H5拖动火狐自动打开新标签

    写在前面的话:<H5拖动火狐自动打开新标签>原因是为什么百度很多了我就不细说,本文章只说我自己的解决方法... 自定义数据里写个链接,如果火狐自动打开就跳到这个链接 这个页面就写一句话:关 ...

  2. Python——pytessercat识别简单的验证码

    什么是验证码 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computersand Humans Apart” (全自动 ...

  3. Java NIO中的通道Channel(一)通道基础

    什么是通道Channel 这个说实话挺难定义的,有点抽象,不过我们可以根据它的用途来理解: 通道主要用于传输数据,从缓冲区的一侧传到另一侧的实体(如文件.套接字...),反之亦然: 通道是访问IO服务 ...

  4. C语言第六讲,数组

    C语言第六讲,数组 一丶什么是数组 数组,就是一整块的连续内存空间. 且类型都是一样的.大小一样 比如: 1.1数组元素的访问 我们要访问数组,例如上面,我们访问元算2,元素3等等怎么访问.. 比如有 ...

  5. 【Shell实战】批量在多台服务器上执行命令

    功能说明:批量在多台服务器上执行命令 #!/bin/bash # ========================================== # 功能:批量在多台服务器上执行命令 # 方法: ...

  6. 初识Quartz (一)

    首先大概的了解一下Quartz. 一:首先进入官网去看看什么是quartz.http://www.quartz-scheduler.org/ Quartz是一个功能丰富的开源作业调度库,可以集成到几乎 ...

  7. RabbitMQ Exchange详解以及Spring中Topic实战

    前言 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦. 业务需求 ...

  8. SpringMVC4+MyBatis+SQL Server2014实现读写分离

    前言 基于mybatis的AbstractRoutingDataSource和Interceptor用拦截器的方式实现读写分离,根据MappedStatement的boundsql,查询sql的sel ...

  9. MVC中的HtmlHelper详解

    熟悉MVC开发的朋友都应该知道在MVC中,每一个Controller都对应一个View,并且CS文件和对应的ASPX文件也被分离了,更重要的是不再有服务器端控件在工具箱中,不再是代码后至了.MVC中的 ...

  10. cache 访问频率的思考

    互联网的项目用户基数很大,有时候瞬间并发量非常大,这个时候对于数据访问来说是个灾难.为了应对这种场景,一般都会大量采用web服务器集群,缓存集群.采用集群后基本上就能解决大量并发的数据访问.当然这个时 ...