docker-compose搭建lnmp環境過程記錄

目錄結構:

 - docker-compose.yml
 - nginx
 	* conf
 		+ nginx.conf
 		+ conf.d
 			+ default.conf
 	* log
 	* Dockerfile
 	* run.sh
 - php
 	* conf
 		+ php-fpm.conf
 		+ php-fpm.d
 			+ www.conf
 			+ zz-docker.conf
 	* Dockerfile
 	* run.sh
 - mysql
	* conf
 		+ my.cnf
 	* Dockerfile
 	* run.sh

docker-compose文件配置

version: '2' #這個序號必須與docker-comose版本號相同,例如1.24,則version:2
services: 
    nginx: 
        #restart: always # nginx意外退出時自動重啓
        # image: nginx:alpine #進入這個容器的命令不是/bin/bash,而是/bin/sh
        build: # 要麼用官方的鏡像image,要麼用自己編排的鏡像build
            context: ./nginx
            dockerfile: Dockerfile
        container_name: my_nginx
        networks: # 網橋,跨主機容器之間通信(官方推薦使用networks,link依賴方式後期可能會被刪除)
            - lnmp
        #depends_on: #解決容器依賴的先後問題,等下面容器開啓後再開啓(link)
        #    - php72
        #    - mysql
        #links: #單主機容器連接
        #    - php72
        #    - mysql
        ports: # 主機端口:容器端口
            - "94:80"
        volumes: #主機:容器  將主機文件夾掛載到容器內部,使容器內部能夠訪問
            - ./www/:/www/:rw
            - ./nginx/conf/conf.d/:/etc/nginx/conf.d/:rw #容器內的配置文件可能可不相同,請按位置填寫
            - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro # docker不能掛載空文件,可先拷貝進主機文件夾,下面有方法去拷貝
            - ./nginx/log/:/var/log/nginx/:rw
    php72: 
        #restart: always
        # image: php:7.2-fpm
        build: 
            context: ./php
            dockerfile: Dockerfile
        container_name: my_php72
        networks: 
            - lnmp
        ports: 
            - "95:9000"
        volumes: 
            - ./www/:/www/:rw
            - ./php/conf/php.ini:/usr/local/etc/php/php.ini:ro
            - ./php/conf/php-fpm.d/:/usr/local/etc/php-fpm.d/:rw
            - ./php/conf/php-fpm.conf:/usr/local/etc/php-fpm.conf:ro
            - ./php/log/:/var/log/php/:rw
    mysql: 
        #restart: always
        image: mysql:5.6 
        container_name: my_mysql
        networks: 
            - lnmp
        ports: 
            - "96:3306"
        volumes: 
            - ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro # 複製的一定要是文件,別是軟鏈接,仔細覈對
            - ./mysql/log/:/var/log/mysql/:rw
            - ./mysql/data/:/var/lib/mysql/:rw
        privileged: true # 使用該參數,container內的root擁有真正的root權限。
        environment: 
            MYSQL_ROOT_PASSWORD: "123456"
networks: 
    lnmp:







# 1 docker-compose up -d --force-recreate  強制重新構建容器

# 2 docker 查看日誌代碼:
    #docker logs 對應的docker容器別名或者id

# 3 第一次使用up,之後使用start,如果再次使用up將會重新創建容器,一些對容器的修改將會丟失

# 4 docker不能掛載文件,文件不能爲空文件,可先手動開啓容器,從容器中中拷貝進主機文件夾
    # 手動開啓容器如下
    # 例nginx : docker run -d -p 94:94 -v /www:/www/ --name my_nginx nginx:alpine
    # 例mysql : docker run -it -d --name my_mysql -p 96:96 --env MYSQL_ROOT_PASSWORD='123456' mysql:latest
    # 拷貝代碼如步驟:5

# 5容器主機互相拷貝命令 :容器必須開啓狀態
    # 將主機./RS-MapReduce目錄拷貝到容器30026605dcfe的/home/cloudera目錄下。
    #docker cp RS-MapReduce 30026605dcfe:/home/cloudera

    #將容器30026605dcfe的/home/cloudera/RS-MapReduce目錄拷貝到主機的/tmp目錄中。
    # docker cp  30026605dcfe:/home/cloudera/RS-MapReduce /tmp/

# 6 mysql啓動立刻退出問題 總結:
    # 1虛擬內存 
        # 查詢服務器 free
        # 發現swap 虛擬內存都是0
        # 應該是swap 未啓用
        # 啓用swap:
        # dd if=/dev/zero of=/swapfile bs=1M count=1024
        # mkswap /swapfile
        # swapon /swapfile
        # 再次 free
        # 發現swap 已經有數值 已啓用
    # 2 日誌報:docker mysql Operation CREATE USER failed for 'root'@'%'
        #1、拉取mysql5.6鏡像
        #    $docker pull mysql:5.6
        #2、創建一個網橋(有的話就不必)
        #    $docker network create -d bridge blog_network
        #3、運行mysql 容器
        #    $docker container run -it --detach --name my_mysql  --network blog_network -p 96:96 --env MYSQL_RANDOM_ROOT_PASSWORD=yes mysql:5.6
        #4、查看root密碼
        #    $docker container logs my_mysql| grep 'GENERATED ROOT PASSWORD: ' | awk -F': ' '{print $2}'
        #    會返回一串字符串,這個就是我們的root用戶的實際密碼:使用這個密碼登錄後再修改root用戶密碼即可。
        #4、進入容器
        #    $docker exec -it mysql bash
        #5、進入mysql
        #    $mysql -u root -p
        #    使用上面的密碼,進入mysql之後就是修改密碼了。
        #6、修改密碼
        #    mysql>update mysql.user set authentication_string=password('newpassword') where user='root' ;
        #    mysql>flush privileges;
        #    mysql>exit


### 搭建單個容器命令示範:$PWD 宿主機當前目錄
### docker run -itd --name my_mysql2 --network docker_app_lnmp -p 97:3306 -v "$PWD"/mysql2/conf/:/etc/mysql/ -v "$PWD"/mysql2/log/:/var/log/mysql/ -v "$PWD"/mysql2/var/:/var/lib/mysql/ --env MYSQL_ROOT_PASSWORD='123456' mysql:5.6


## 運行docker容器時報standard_init_linux.go:195: exec user process caused "no such file or directory" 的解決方法
## 這是由於windows 和linux dos字符與unix字符的問題

## 安裝dos2unix
## yum install dos2unix

## 將相關文件轉換一下字符,刪除上次已構建的鏡像,重新docker up:
##dos2unix Dockerfile
##dos2unix run-lamp.sh


構建php新鏡像dockerfile

## 指定鏡像
FROM  php:7.2-fpm

## 維護者信息
## 指定鏡像
FROM  php:7.2-fpm

## 維護者信息
MAINTAINER lico "[email protected]"

## 運行用戶,默認root
# ENV RUN_USER php 
## 設置組
# ENV RUN_GROUP php
## 數據文件夾
# ENV DATA_DIR /data
## 日誌文件夾
# ENV LOG_DIR /log

## 設置時區
ENV TZ=Asia/Shanghai
# RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

## 可以先進入容器查看php已經有了哪些擴展: php -m ,例如下
## Core,ctype,curl,date,dom,fileinfo,filter,ftp,hash,iconv,json,
## libxml,mbstring,mysqlnd,openssl,pcre,PDO,pdo_sqlite,Phar,posix,
## readline,Reflection,session,SimpleXML,sodium,SPL,sqlite3,standard,
## tokenizer,xml,xmlreader,xmlwriter,zlib

RUN apt-get update

## docker 官方擴展
RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm

# bz2
RUN apt-get install -y --no-install-recommends \
libbz2-dev \
&& docker-php-ext-install -j$(nproc) bz2

# gd
RUN apt-get install -y --no-install-recommends \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd

# intl
# RUN apt-get install -y --no-install-recommends \
# libicu-dev \
# && docker-php-ext-install -j$(nproc) intl

# mcrypt
# RUN apt-get install -y --no-install-recommends \
# libmcrypt-dev \
# && pecl install mcrypt-1.0.1 && docker-php-ext-enable mcrypt

# igbinary
RUN pecl install igbinary && docker-php-ext-enable igbinary

# xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug

# gmp
# RUN apt-get install -y --no-install-recommends libgmp-dev \
# && docker-php-ext-install -j$(nproc) gmp

# soap wddx xmlrpc tidy xsl
# RUN apt-get install -y --no-install-recommends \
# libxml2-dev \
# libtidy-dev \
# libxslt1-dev \
# && docker-php-ext-install -j$(nproc) soap wddx xmlrpc tidy xsl

# pgsql pdo_pgsql 
# RUN apt-get install -y --no-install-recommends \
# libpq-dev \
# && docker-php-ext-install -j$(nproc) pgsql pdo_pgsql

# zip
# RUN apt-get install -y --no-install-recommends \
# libzip-dev \
# && docker-php-ext-install -j$(nproc) zip

# memcached 
RUN apt-get install -y --no-install-recommends \
libmemcached-dev \
zlib1g-dev \
&& pecl install memcached && docker-php-ext-enable memcached

# redis
RUN pecl install redis && docker-php-ext-enable redis

# opcache
RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache

## 清除臨時擴展文件
RUN apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* \
&& docker-php-source delete

## cmd 用於執行容器啓動後的命令,只能出現一次,所以用腳本
# RUN chmod 775 /run.sh
# CMD ["/run.sh"]

EXPOSE 9000

CMD ["php-fpm", "-F"]

nginx 構建新鏡像

## 指定鏡像
FROM  nginx:alpine

## 維護者信息
MAINTAINER lico "[email protected]"

## 運行用戶,默認root
# ENV RUN_USER nginx 
## 設置組
# ENV RUN_GROUP nginx
## 數據文件夾
# ENV DATA_DIR /data
##日誌文件夾
# ENV LOG_DIR /log

## 設置時區
ENV TZ=Asia/Shanghai
# RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

## 設置一個默認端口
EXPOSE 80

## 創建一些需要的目錄
# RUN mkdir /www -p

## 進入目錄中,相當於cd
WORKDIR /root/nginx

## 添加當前目錄的一些東西複製到進入鏡像
ADD conf/nginx.conf /etc/nginx/nginx.conf
ADD conf/conf.d/default.conf /etc/nginx/conf.d/default.conf
ADD run.sh /run.sh

## 設置權限
# RUN chown nginx.nginx -R /www
RUN chmod 775 /run.sh

## cmd 用於執行容器啓動後的命令,只能出現一次,所以用腳本
# CMD ["/run.sh"]

CMD ["nginx", "-g", "daemon off;"]

docker-compose 一主二從三哨兵模式:

https://www.cnblogs.com/hckblogs/p/11186311.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章