Docker Compose是一個定義及運行多個Docker容器的工具,它自身咱們能夠簡單的理解爲就是一個二進制文件(命令),是咱們能夠更方便易於管理的構建基於docker的複雜應用php
- 使用Compose的過程:三步
- 使用Dock而file定義單個應用程序的環境,以便在任何地方進行復制。
- 在docker-compose.yml中定義組成該應用程序的服務,將單個應用程序組成一個總體,它們各自處在相對隔離的環境中,卻能夠經過端口映射來進行協同工做。
- 運行docker-compose開始撰寫後並運行整個應用程序
編排
指揮的角色地位,根據被部署的對象之間的耦合關係,以及被部署對象的環境依賴,制定部署流程中各個動做的執行順序和獲取防止;這些信息都會在編排工具中以指定的格式在配置文件中定義,保證這個流程能夠隨時在全新環境可靠有序重現html
部署
具體實施的角色地位,按照編排指定的內容和流程,在目標容器執行,一切都是按照編排中制定好的來進行具體實施。mysql
Compose原理
簡單概述下:如用戶執行docker-compose up指令表示運行在docker-compose.yml中定義好的各項任務,進行構建鏡像或者運行容器,等一些列操做。 那麼若是在當前宿主機中已經存在了與該應用對應的容器(即重複了),docker-compose會進行邏輯判斷,若是用戶指定了能夠從新啓動已有服務,其就會執行service模塊的容器重啓方法 不然將直接啓動已有的容器。二者區別在於前者是重啓,會建立新容器,就容器會移除掉。 該過程當中建立容器的各項定義參數都是compose指令和.yml文件中指定好的。linux
YAML簡介
YAML 是一種標記語言,可讀性很強。相似於 XML 數據描述語言,語法比 XML 簡單的多。YAML 數據結構經過縮進來表示,連續的目錄經過減號來表示,鍵值對用冒號分割,數組用括號括起來,hash 用花括號括起來。nginx
YAML 文件格式注意事項:c++
在縮進中空白字符的數目並非很是重要,只要相同階層的元素左對齊就能夠了(不過不能使用TAB字符);git
一般開頭縮進2個空格;github
字符的後面縮進1個空格,好比冒號、逗號、橫杆;web
支持#註釋;sql
容許在文件中加入選擇性的空行,以增長可讀性
字段 | 描述 |
build dockerfile context |
指定 dockerfile 文件名 構建鏡像上下文路徑 |
image | 指定鏡像 |
command | 執行命令,覆蓋默認命令 |
container_name | 指定容器名稱,因爲容器名稱是惟一的,若是指定自定義名稱,則沒法scale |
deploy | 指定部署和運行服務相關配置,只能在Swarm模式使用 |
environment | 添加環境變量 |
metworks | 加入網絡,引入頂級networks下條目 |
ports | 暴露端口,與-p相同,但端口不低於60 |
volumes | 掛載宿主機路徑或命名卷。若是是命名卷在頂級volumes定義卷名稱 |
restart | 重啓策略,默認no,always|on-failure|unless-stopeed |
hostname | 容器主機名 |
2、使用docker compose 部署lnmp
安裝 docker-ce
yum -y install yum-utils device-mapper-persistent-data lvm2
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl start docker
systemctl enable docker
阿里雲鏡像加速器
https://cr.console.aliyun.com/
[root@gitlab ~]# cat << END > /etc/docker/daemon.json
{
"registry-mirrors":["https://xc1orh81.mirror.aliyuncs.com"]
}
END
[root@gitlab ~]# systemctl daemon-reload
[root@gitlab ~]# systemctl restart docker
安裝compose工具
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
mkdir compose_lnmp
cd compose_lnmp/
編寫compose文件和dockerfile文件
[root@tomcat compose_lnmp]# tree
.
├── docker-compose.yml
├── mysql
│ ├── conf
│ │ └── my.cnf
│ └── data
├── nginx
│ ├── Dockerfile
│ ├── nginx-1.12.1.tar.gz
│ ├── nginx.conf
│ └── run.sh
├── php
│ ├── Dockerfile
│ ├── php-5.6.39.tar.gz
│ └── php.ini
└── wwwroot
├── index.html
└── index.php
6 directories, 11 files
[root@tomcat compose_lnmp]# cat docker-compose.yml
version: '3'
services:
nginx:
#在 services 標籤下的第二級標籤是 web,這個名字是用戶本身自定義,它就是服務名稱。
hostname: nginx
#至關於提早預約義容器的主機名,會寫入到容器的/etc/hostname中
build:
#該標籤標示基於dockerfile來構建一個鏡像
context: ./nginx
#指定構建鏡像所需的dockerfile目錄,我這裏指定的是相對目錄,該文件(docker-compose.yml)所處位置,也能夠絕對目錄,
dockerfile: Dockerfile
ports:
- 80:80
#和宿主機映射的端口
networks:
- lnmp
#指定的網絡環境????
volumes:
- ./wwwroot:/usr/local/nginx/html
#將宿主機目錄掛載到該容器當中
( - ./wwwroot:/usr/local/nginx/html:ro
#將宿主機目錄掛載到該容器當中(只讀))
php:
hostname: php
build:
context: ./php
dockerfile: Dockerfile
ports:
- 9000:9000
networks:
- lnmp
volumes:
- ./wwwroot:/usr/local/nginx/html
mysql:
hostname: mysql
image: mysql:5.6
#image標籤表示是基於mysql:5.6鏡像構建一個新的
ports:
- 3306:3306
networks:
- lnmp
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
command: --character-set-server=utf8
environment:
MYSQL_ROOT_PASSWORD: 123456
#???mysql中root用戶密碼
MYSQL_DATABASE: wordpress
#新建一個數據庫名爲WordPress
MYSQL_USER: user
#新建一個用戶名爲user
MYSQL_PASSWORD: user123
#新建user用戶密碼爲user123
networks:
lnmp:
#建立一個網絡,lnmp爲該網絡的別名
Nginx的dockerfile編寫
[root@tomcat compose_lnmp]# cat nginx/Dockerfile
FROM centos:7
#若是有該docker鏡像則基於該鏡像進行構建,沒有則自行從鏡像倉庫pull
MAINTAINER crushlinux
ENV TIME_ZOME Asia/Shanghai
RUN useradd -s /sbin/nologin -M nginx && yum -y install gcc gcc-c++ make openssl-devel pcre-devel
#運行的命令,安裝依賴
ADD nginx-1.12.1.tar.gz /tmp
#將宿主機源碼包傳送到容器內tmp目錄
RUN cd /tmp/nginx-1.12.1 && \
./configure --prefix=/usr/local/nginx && \
make -j 2 && \
make install
#編譯;make -j 2使用兩個進程來make,加速
RUN rm -rf /tmp/nginx* && yum clean all && \
echo "${TIME_ZOME}" > /etc/timezone && \
ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime
EXPOSE 80
COPY nginx.conf /usr/local/nginx/conf/
WORKDIR /root/nginx
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]
#一系列命令操做
Nginx配置文件,直接複製到容器內使用
[root@tomcat compose_lnmp]# cat nginx/nginx.conf
user nginx nginx;
worker_processes 1;
worker_rlimit_nofile 102400;
error_log logs/error.log;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 4096;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html;
fastcgi_index index.php;
fastcgi_pass 192.168.200.113:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
daemon off;
[root@tomcat compose_lnmp]# cat nginx/run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
MySQL配置文件
[root@tomcat compose_lnmp]# cat mysql/conf/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/tmp/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysql/mysql.log
pid-file=/tmp/mysql.pid
PHP配置文件
[root@tomcat compose_lnmp]# cat php/Dockerfile
FROM centos:7
MAINTAINER crushlinux
ENV TIME_ZOME Asia/Shanghai
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel
ADD php-5.6.39.tar.gz /tmp/
RUN cd /tmp/php-5.6.39 && \
./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-mysql --with-mysqli \
--with-openssl --with-zlib --with-curl --with-gd \
--with-jpeg-dir --with-png-dir --with-iconv \
--enable-fpm --enable-zip --enable-mbstring && \
make -j 4 && \
make install
RUN cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
sed -i 's/127.0.0.1/0.0.0.0/g' /usr/local/php/etc/php-fpm.conf && \
sed -i "21a daemonize=no" /usr/local/php/etc/php-fpm.conf && \
echo "${TIME_ZOME}" > /etc/timezone && \
ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime
COPY php.ini /usr/local/php/etc/
RUN rm -rf /tmp/php* && yum clean all
WORKDIR /usr/local/php/
EXPOSE 9000
#將容器內該端口進行映射
CMD ["./sbin/php-fpm","-c","/usr/local/php/etc/php-fpm.conf"]
wwwroot目錄爲網頁測試文件
[root@tomcat compose_lnmp]# cat wwwroot/index.html
www.crushlinux.com
[root@tomcat compose_lnmp]# cat wwwroot/index.php
<?php
phpinfo();
?>
問題:
gpg 驗證錯誤
然而忽然出現一個docker安裝的gpg 驗證錯誤:
warning: /var/cache/yum/x86_64/7/dockerrepo/packages/docker-engine-selinux-1.10.3-1.el7.centos.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 2c52609d: NOKEY
Retrieving key from https://yum.dockerproject.org/gpg
GPG key retrieval failed: [Errno 12] Timeout on https://yum.dockerproject.org/gpg: (28, 'Resolving timed out after 3512 milliseconds')
解決辦法是:
rpm -import http://yum.dockerproject.org/gpg
導入gpg文件,ok,很是簡單, 搞定
Gpgkey
開啓gpgcheck後,經過gpgkey來指定,相應的gpg文件
若是不指定gpgkey文件,那麼就必須手動的導入相應的gpg文件,
Rpm --import http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
必須手動的敲入這條命令。
RHEL發行版安裝好後會將相應的gpgkey放在/etc/pki/rpm-gpg目錄下面。
Yum倉庫中每一行參數都已經介紹完畢了
建立容器的時候報錯WARNING: IPv4 forwarding is disabled. Networking will not work.
解決辦法:
添加以下代碼:
重啓network服務
完成之後,刪除錯誤的容器,再次建立新容器,就再也不報錯了