docker搭建mangeto2最佳实践

一、基于alpine基础镜像制作dockerFile,alpine的好处是体积小,有apk命令方便添加包

制作nginx

运行容器

docker run -it -d  --name nginx  alpine:latest

进入容器

docker exec -it nginx sh

# 简单解释:-it 获得输入输出

配置阿里云的alpine,apk源,不然太慢了 

sed -i 's@dl-cdn.alpinelinux.org@mirrors.aliyun.com@g' /etc/apk/repositories

# 更新软件包索引 apk update

apk查找包:apk search nginx

nginx比较简单,所以直接用:apk add nginx,安装后程序文件会在各个常规目录

修改nginx为前台启动模式:

daemon off

保存容器为镜像

docker  commit  nginx  zenghansen/nginx:v1  

 

然后同理制作php

apk add php7 php7-fpm

修改为前台运行模式:

daemonize = no

docker  commit  nginx  zenghansen/php74:v1   #docker  commit 容器名称  分组名称/镜像名称:镜像tag

 

一般来说,制作Docker的过是很漫长的,不建议直接用dockerfile去调试,直接进到alpine容器里面执行命令,最后根据成品容器二次from,封装一层薄薄的Dockerfile即可

此时,我们在容器里面运行完dockerfile里面的命令并且确认无误后,我们推出容器,然后执行制作镜像。

 

或者我们可以基于Dockerfile来制作,比如

FROM zenghansen/php-fpm-7.4:v4
EXPOSE 9000
CMD ["/usr/local/php/sbin/php-fpm"]

docker build -t zenghansen/php-fpm-7.4:v1  .  #记得后面有个点

 

推送到仓库

docker login harbor.ym

docker push harbor.ym/php-fpm/php56fpmzts:latest

 

然后我们可以选择推送到docker.hub仓库备用

docker login 

docker push zenghansen/php-fpm-7.4:v1

 

 

运行后发现容器停止了,是因为没有挂起的进程,

设置php-fpm为前台模式:daemonize = no,修改一下Dockerfile,重新构建容器即可

FROM zenghansen/php-fpm-7.4:v4
RUN sed -i 's@daemonize = yes@daemonize = no@g' /usr/local/php/etc/php-fpm.conf
EXPOSE 9000
CMD ["/usr/local/php/sbin/php-fpm"]

 

 接下来,为了方便可以用docker-compose构建,进行容器之间的交互。包括es和mysql我也顺便放出来了

 

version: '2.3'
services:
  nginx:
    image: zenghansen/nginx:v1
    volumes:
     - $HOME/work:/data/www
     - $HOME/docker/nginx/conf.d:/etc/nginx/conf.d
    # nginx意外退出时自动重启
    restart: always
    command: ["/usr/sbin/nginx"]
    # 映射80和443端口
    ports:
     - "80:80"
     - "443:443"
    # 容器名称
    networks:
      - elastic
    container_name: nginx

  mysql:
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password --lower-case-table-names=1
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
     - "3306:3306"
    networks:
      - elastic
    container_name: mysql
  php74:
    image: zenghansen/php-fpm-74:v1
    restart: always
    command: ["/usr/sbin/php-fpm7"]
    volumes:
     - $HOME/work:/data/www #注意,这里一定要挂载代码目录,因为nginx只负责文件路径转发,并不会把代码文件转发过去。
    networks:
      - elastic
    container_name: php74
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms128m -Xmx128m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - $HOME/docker/elk/es/data1:/usr/share/elasticsearch/data
      - $HOME/docker/elk/es/config1:/usr/share/elasticsearch/config
    ports:
      - 9200:9200
    networks:
      - elastic
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms128m -Xmx128m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - $HOME/docker/elk/es/data2:/usr/share/elasticsearch/data
      - $HOME/docker/elk/es/config2:/usr/share/elasticsearch/config
    networks:
      - elastic
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms128m -Xmx128m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - $HOME/docker/elk/es/data3:/usr/share/elasticsearch/data
      - $HOME/docker/elk/es/config3:/usr/share/elasticsearch/config
    networks:
      - elastic
  esh:
    image: mobz/elasticsearch-head:5
    container_name: es-head
    ports:
      - 9100:9100
    volumes:
      - $HOME/docker/elk/esh/vendor.js:/usr/src/app/_site/vendor.js

networks:
  elastic:
    driver: bridge

  

  

由于nginx和php的配置需要经常修改,我们一般挂载出来。

php的监听端口,我们要改成:0.0.0.0:9000,如果是127.0.0.1会提示refund,因为nginx在另外一个容器, 所以需要开发所有ip可以转发到这个端口。

另外需要修改一下php.ini的参数,可以参考官方文档;比如内存大小之类的。

解决把magento2代码里的nginx配置文件复制到配置目录。调用nginx配置为:

upstream fastcgi_backend {
   # use tcp connection
   server  php74:9000;
   # or socket
   #server   unix:/var/run/php/php7.4-fpm.sock;
}
server {
   listen 80;
   server_name localhost;
   set $MAGE_ROOT /data/www/m2;
   set $MAGE_DEBUG_SHOW_ARGS 0;
   include /etc/nginx/conf.d/nginx.conf.sample;
}

  nginx.conf.sample;m2代码目录有提供。


配置限定了只能直接访问某些根目录php,增加的php是无法访问的。


 

然后进入php容器进行安装项目:

docker exec -it php74 sh

 

安装composer  apk add composer

设置阿里云的源:

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

 

拉取构建项目: composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition m2

 

安装过程中发现少了很多php的扩展,由于我们用的是alpine,所以可以用 apk add php7-xxx(扩展名称来安装,有些扩展可能后缀会更多一些,注意版本号和php版本对应上即可),完毕后继续安装

成功继续进入代码目录的bin目录,执行magento2的安装:

./magento setup:install --base-url=http://localhost \
--db-host=mysql --db-name=magento --db-user=root --db-password=root \
--admin-firstname=Magento --admin-lastname=User --admin-email=user@example.com \
--admin-user=admin --admin-password=admin123 --language=en_US \
--currency=USD --timezone=America/Chicago --use-rewrites=1 \
--search-engine=elasticsearch7 --elasticsearch-host=es01 \
--elasticsearch-port=9200

 

 

 

 安装完成是这个鸟样。

 

 

 

posted @ 2021-09-18 16:47  zenghansen  阅读(198)  评论(0编辑  收藏  举报