摘要:使用部署環境簡介是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的機器上,也可以實現虛擬化。命令是編寫之后使用的。后者會自動繼承中的服務及相關的環境變量設置網絡模式。
使用Docker 部署 LNMP+Redis 環境 Docker 簡介
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。推薦內核版本3.8及以上
為什么使用Docker加速本地的開發和構建流程,容器可以在開發環境構建,然后輕松地提交到測試環境,并最終進入生產環境
能夠在讓獨立的服務或應用程序在不同的環境中得到相同的運行結果
創建隔離的環境來進行測試
高性能、超大規劃的宿主機部署
從頭編譯或者擴展現有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環境
目錄安裝Docker
目錄結構
快速使用
進入容器內部
PHP擴展安裝
Composer安裝
常見問題處理
常用命令
Dockerfile語法
docker-compose語法說明
項目源碼地址:GitHub安裝Docker
windows 安裝
參考
mac
docker toolbox參考
linux
# 下載安裝 curl -sSL https://get.docker.com/ | sh # 設置開機自啟 sudo systemctl enable docker.service sudo service docker start|restart|stop # 安裝docker-compose curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose目錄結構
docker_lnmp ├── v2 ├── mysql │ └── Dockerfile │ └── my.cnf ├── nginx │ ├── Dockerfile │ ├── nginx.conf │ ├── log │ │ └── error.log │ └── www │ ├── index.html │ ├── index.php │ ├── db.php │ └── redis.php ├── php │ ├── Dockerfile │ ├── www.conf │ ├── php-fpm.conf │ ├── php.ini │ └── log │ └── php-fpm.log └── redis └── Dockerfile └── redis.conf創建鏡像與安裝
直接使用docker-compose一鍵制作鏡像并啟動容器
版本一
該版本是通過拉取純凈的CentOS鏡像,通過Dockerfile相關命令進行源碼編譯安裝各個服務。所以該方式很方便定制自己需要的鏡像,但是占用空間大且構建慢。
git clone https://github.com/voocel/docker-lnmp.git cd docker-lnmp docker-compose up -d
版本二(推薦)
git clone https://github.com/voocel/docker-lnmp.git cd docker-lnmp/v2 chmod 777 ./redis/redis.log chmod -R 777 ./redis/data docker-compose up -d
該版本是通過拉取官方已經制作好的各個服務的鏡像,再通過Dockerfile相關命令根據自身需求做相應的調整。所以該方式構建迅速使用方便,因為是基于Alpine Linux所以占用空間很小。
測試使用docker ps查看容器啟動狀態,若全部正常啟動了則
通過訪問127.0.0.1、127.0.0.1/index.php、127.0.0.1/db.php、127.0.0.1/redis.php 即可完成測試
(若想使用https則請修改nginx下的dockerfile,和nginx.conf按提示去掉注釋即可,靈需要在ssl文件夾中加入自己的證書文件,本項目自帶的是空的,需要自己替換,保持文件名一致)
使用 docker exec
docker exec -it ngixn /bin/sh
使用nsenter命令
# cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24; # ./configure --without-ncurses # make nsenter && sudo cp nsenter /usr/local/bin
為了連接到容器,你還需要找到容器的第一個進程的 PID,可以通過下面的命令獲取再執行。
PID=$(docker inspect --format "{{ .State.Pid }}" container_id) # nsenter --target $PID --mount --uts --ipc --net --pidPHP擴展安裝
安裝PHP官方源碼包里的擴展(如:同時安裝pdo_mysql mysqli pcntl gd四個個擴展)
在php的Dockerfile中加入以下命令
RUN apk add libpng-dev && docker-php-ext-install pdo_mysql mysqli pcntl gd
注:因為該鏡像缺少gd庫所需的libpng-dev包,所以需要先下載這個包
PECL 擴展安裝
# 安裝擴展 RUN pecl install memcached-2.2.0 # 啟用擴展 && docker-php-ext-enable memcached
通過下載擴展源碼,編譯安裝的方式安裝
# 安裝Redis和swoole擴展 RUN cd ~ && wget https://github.com/phpredis/phpredis/archive/4.2.0.tar.gz && tar -zxvf 4.2.0.tar.gz && mkdir -p /usr/src/php/ext && mv phpredis-4.2.0 /usr/src/php/ext/redis && docker-php-ext-install redis && apk add libstdc++ && cd ~ && wget https://github.com/swoole/swoole-src/archive/v4.2.12.tar.gz && tar -zxvf v4.2.12.tar.gz && mkdir -p /usr/src/php/ext && mv swoole-src-4.2.12 /usr/src/php/ext/swoole && docker-php-ext-install swoole
注:因為該鏡像需要先安裝swoole依賴的libstdc++,否則安裝成功后無法正常加載swoole擴展
Composer安裝在Dockerfile中加入
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer常見問題處理
redis啟動失敗問題
在v2版本中redis的啟動用戶為redis不是root,所以在宿主機中掛載的./redis/redis.log和./redis/data需要有寫入權限。
chmod 777 ./redis/redis.log chmod 777 ./redis/data
MYSQL連接失敗問題
在v2版本中是最新的MySQL8,而該版本的密碼認證方式為Caching_sha2_password,而低版本的php和mysql可視化工具可能不支持,可通過phpinfo里的mysqlnd的Loaded plugins查看是否支持該認證方式,否則需要修改為原來的認證方式mysql_native_password:
select user,host,plugin,authentication_string from mysql.user; ALTER USER "root"@"%" IDENTIFIED WITH mysql_native_password BY "123456"; FLUSH PRIVILEGES;
注意掛載目錄的權限問題,不然容器成功啟動幾秒后立刻關閉,例:以下/data/run/mysql 目錄沒權限的情況下就會出現剛才那種情況
docker run --name mysql57 -d -p 3306:3306 -v /data/mysql:/var/lib/mysql -v /data/logs/mysql:/var/log/mysql -v /data/run/mysql:/var/run/mysqld -e MYSQL_ROOT_PASSWORD=123456 -it centos/mysql:v5.7
需要注意php.ini 中的目錄對應 mysql 的配置的目錄需要掛載才能獲取文件內容,不然php連接mysql失敗
# php.ini mysql.default_socket = /data/run/mysql/mysqld.sock mysqli.default_socket = /data/run/mysql/mysqld.sock pdo_mysql.default_socket = /data/run/mysql/mysqld.sock # mysqld.cnf pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock
使用php連接不上redis
# 錯誤的 $redis = new Redis; $rs = $redis->connect("127.0.0.1", 6379);
php連接不上,查看錯誤日志
PHP Fatal error: Uncaught RedisException: Redis server went away in /www/index.php:7
考慮到docker 之間的通信應該不可以用127.0.0.1 應該使用容器里面的ip,所以查看redis 容器的ip
[root@localhost docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b5f7dcecff4c docker_nginx "/usr/sbin/nginx -..." 4 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx 60fd2df36d0e docker_php "/usr/local/php/sb..." 7 seconds ago Up 5 seconds 9000/tcp php 7c7df6f8eb91 hub.c.163.com/library/mysql:latest "docker-entrypoint..." 12 seconds ago Up 11 seconds 3306/tcp mysql a0ebd39f0f64 docker_redis "usr/local/redis/s..." 13 seconds ago Up 12 seconds 6379/tcp redis
注意測試的時候連接地址需要容器的ip或者容器名names,比如redis、mysql.
例如nginx配置php文件解析 fastcgi_pass php:9000;
例如php連接redis $redis = new Redis;$res = $redis->connect("redis", 6379);
因為容器ip是動態的,重啟之后就會變化,所以可以創建靜態ip
第一步:創建自定義網絡
#備注:這里選取了172.172.0.0網段,也可以指定其他任意空閑的網段 docker network create --subnet=172.171.0.0/16 docker-at docker run --name redis326 --net docker-at --ip 172.171.0.20 -d -p 6379:6379 -v /data:/data -it centos/redis:v3.2.6
連接redis 就可以配置對應的ip地址了,連接成功
$redis = new Redis; $rs = $redis->connect("172.171.0.20", 6379);
另外還有種可能phpredis連接不上redis,需要把redis.conf配置略作修改。
bind 127.0.0.1 改為: bind 0.0.0.0
啟動docker web服務時 虛擬機端口轉發 外部無法訪問 一般出現在yum update的時候(WARNING: IPv4 forwarding is disabled. Networking will not work.)或者宿主機可以訪問,但外部無法訪問
vi /etc/sysctl.conf 或者 vi /usr/lib/sysctl.d/00-system.conf 添加如下代碼: net.ipv4.ip_forward=1 重啟network服務 systemctl restart network 查看是否修改成功 sysctl net.ipv4.ip_forward 如果返回為"net.ipv4.ip_forward = 1"則表示成功了
如果使用最新的MySQL8無法正常連接,由于最新版本的密碼加密方式改變,導致無法遠程連接。
# 修改密碼加密方式 ALTER USER "root"@"%" IDENTIFIED WITH mysql_native_password BY "123456";常用命令
docker start 容器名(容器ID也可以)
docker stop 容器名(容器ID也可以)
docker run 命令加 -d 參數,docker 會將容器放到后臺運行
docker ps 正在運行的容器
docker logs --tail 10 -tf 容器名 查看容器的日志文件,加-t是加上時間戳,f是跟蹤某個容器的最新日志而不必讀整個日志文件
docker top 容器名 查看容器內部運行的進程
docker exec -d 容器名 touch /etc/new_config_file 通過后臺命令創建一個空文件
docker run --restart=always --name 容器名 -d ubuntu /bin/sh -c "while true;do echo hello world; sleep 1; done" 無論退出代碼是什么,docker都會自動重啟容器,可以設置 --restart=on-failure:5 自動重啟的次數
docker inspect 容器名 對容器進行詳細的檢查,可以加 --format="{(.State.Running)}" 來獲取指定的信息
docker rm 容器ID 刪除容器,注,運行中的容器無法刪除
docker rm $(docker ps -aq) 刪除所有容器
docker rmi $(docker images -aq) 刪除所有鏡像
docker images 列出鏡像
docker pull 鏡像名:標簽 拉鏡像
docker search 查找docker Hub 上公共的可用鏡像
docker build -t="AT/web_server:v1" 命令后面可以直接加上github倉庫的要目錄下存在的Dockerfile文件。 命令是編寫Dockerfile 之后使用的。-t選項為新鏡像設置了倉庫和名稱:標簽
docker login 登陸到Docker Hub,個人認證信息將會保存到$HOME/.dockercfg,
docker commit -m="comment " --author="AT" 容器ID 鏡像的用戶名/倉庫名:標簽 不推薦這種方法,推薦dockerfile
docker history 鏡像ID 深入探求鏡像是如何構建出來的
docker port 鏡像ID 端口 查看映射情況的容器的ID和容器的端口號,假設查詢80端口對應的映射的端口
run 運行一個容器, -p 8080:80 將容器內的80端口映射到docker宿主機的某一特定端口,將容器的80端口綁定到宿主機的8080端口,另 127.0.0.1:80:80 是將容器的80端口綁定到宿主機這個IP的80端口上,-P 是將容器內的80端口對本地的宿主機公開
http://docs.docker.com/refere... 查看更多的命令
docker push 鏡像名 將鏡像推送到 Docker Hub
docker rmi 鏡像名 刪除鏡像
docker attach 容器ID 進入容器
docker network create --subnet=172.171.0.0/16 docker-at 選取172.172.0.0網段
docker build 就可以加 -ip指定容器ip 172.171.0.10 了
刪除所有容器和鏡像的命令
docker rm `docker ps -a |awk "{print $1}" | grep [0-9a-z]` 刪除停止的容器 docker rmi $(docker images | awk "/^Dockerfile語法/ { print $3 }")
MAINTAINER 標識鏡像的作者和聯系方式
EXPOSE 可以指定多個EXPOSE向外部公開多個端口,可以幫助多個容器鏈接
FROM 指令指定一個已經存在的鏡像
#號代表注釋
RUN 運行命令,會在shell 里使用命令包裝器 /bin/sh -c 來執行。如果是在一個不支持shell 的平臺上運行或者不希望在shell 中運行,也可以 使用exec 格式 的RUN指令
ENV REFRESHED_AT 環境變量 這個環境亦是用來表明鏡像模板最后的更新時間
VOLUME 容器添加卷。一個卷是可以 存在于一個或多個容器內的特定的目錄,對卷的修改是立刻生效的,對卷的修改不會對更新鏡像產品影響,例:VOLUME["/opt/project","/data"]
ADD 將構建環境 下的文件 和目錄復制到鏡像 中。例 ADD nginx.conf /conf/nginx.conf 也可以是取url 的地址文件,如果是壓縮包,ADD命令會自動解壓、
USER 指定鏡像用那個USER 去運行
COPY 是復制本地文件,而不會去做文件提取(解壓包不會自動解壓) 例:COPY conf.d/ /etc/apache2/ 將本地conf.d目錄中的文件復制到/etc/apache2/目錄中
docker-compose.yml 語法說明image 指定為鏡像名稱或鏡像ID。如果鏡像不存在,Compose將嘗試從互聯網拉取這個鏡像
build 指定Dockerfile所在文件夾的路徑。Compose將會利用他自動構建這個鏡像,然后使用這個鏡像
command 覆蓋容器啟動后默認執行的命令
links 鏈接到其他服務容器,使用服務名稱(同時作為別名)或服務別名(SERVICE:ALIAS)都可以
external_links 鏈接到docker-compose.yml外部的容器,甚至并非是Compose管理的容器。參數格式和links類似
ports 暴露端口信息。宿主機器端口:容器端口(HOST:CONTAINER)格式或者僅僅指定容器的端口(宿主機器將會隨機分配端口)都可以(注意:當使用 HOST:CONTAINER 格式來映射端口時,如果你使用的容器端口小于 60 你可能會得到錯誤得結果,因為 YAML 將會解析 xx:yy 這種數字格式為 60 進制。所以建議采用字符串格式。)
expose 暴露端口,與posts不同的是expose只可以暴露端口而不能映射到主機,只供外部服務連接使用;僅可以指定內部端口為參數
volumes 設置卷掛載的路徑。可以設置宿主機路徑:容器路徑(host:container)或加上訪問模式(host:container:ro)ro就是readonly的意思,只讀模式
volunes_from 掛載另一個服務或容器的所有數據卷
environment 設置環境變量。可以屬于數組或字典兩種格式。如果只給定變量的名稱則會自動加載它在Compose主機上的值,可以用來防止泄露不必要的數據
env_file 從文件中獲取環境變量,可以為多帶帶的文件路徑或列表。如果通過docker-compose -f FILE指定了模板文件,則env_file中路徑會基于模板文件路徑。如果有變量名稱與environment指令沖突,則以后者為準(環境變量文件中每一行都必須有注釋,支持#開頭的注釋行)
extends 基于已有的服務進行服務擴展。例如我們已經有了一個webapp服務,模板文件為common.yml。編寫一個新的 development.yml 文件,使用 common.yml 中的 webapp 服務進行擴展。后者會自動繼承common.yml中的webapp服務及相關的環境變量
net 設置網絡模式。使用和docker client 的 --net 參數一樣的值
pid 和宿主機系統共享進程命名空間,打開該選項的容器可以相互通過進程id來訪問和操作
dns 配置DNS服務器。可以是一個值,也可以是一個列表
cap_add,cap_drop 添加或放棄容器的Linux能力(Capability)
dns_search 配置DNS搜索域。可以是一個值也可以是一個列表
注意:使用compose對Docker容器進行編排管理時,需要編寫docker-compose.yml文件,初次編寫時,容易遇到一些比較低級的問題,導致執行docker-compose up時先解析yml文件的錯誤。比較常見的是yml對縮進的嚴格要求。yml文件還行后的縮進,不允許使用tab鍵字符,只能使用空格,而空格的數量也有要求,一般兩個空格。
項目源碼地址:GitHub
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40288.html
摘要:使用部署環境簡介是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的機器上,也可以實現虛擬化。命令是編寫之后使用的。后者會自動繼承中的服務及相關的環境變量設置網絡模式。 使用Docker 部署 LNMP+Redis 環境 Docker 簡介 Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器...
摘要:使用部署環境簡介是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的機器上,也可以實現虛擬化。命令是編寫之后使用的。后者會自動繼承中的服務及相關的環境變量設置網絡模式。 使用Docker 部署 LNMP+Redis 環境 Docker 簡介 Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器...
閱讀 2957·2021-11-08 13:20
閱讀 1030·2021-09-22 15:20
閱讀 659·2019-08-30 15:53
閱讀 1964·2019-08-30 15:43
閱讀 1278·2019-08-29 17:21
閱讀 539·2019-08-29 12:15
閱讀 2374·2019-08-28 17:51
閱讀 3142·2019-08-26 13:26