1. Dockerfile格式:
#从上往下逐步执行
FROM centos:latest
MAINTAINER liuzhousheng
RUN yum install gcc -y
COPY run.sh /usr/bin
EXPOSE 80
CMD ["run.sh"]
2. Dockerfile指令
指令 | 描述 |
---|---|
FROM | 构建新镜像是基于哪个镜像 |
MAINTAINER | 镜像维护者姓名或邮箱地址 |
RUN | 构建镜像时运行的Shell命令 |
COPY | 拷贝文件或目录到镜像中 |
ENV | 设置环境变量 |
USER | 为RUN、CMD和ENTRYPOINT执行命令指定运行用户 |
EXPOSE | 声明容器运行的服务端口 |
HEALTHCHECK | 容器中服务健康检查 |
WORKDIR | 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录 |
ENTRYPOINT | 运行容器时执行,如果有多个ENTRYPOINT指令,最后一个生效 |
CMD | 运行容器时执行,如果有多个CMD指令,最后一个生效 |
3. Build镜像
# docker build --help
Usage: docker build [OPTIONS] PATH | URL | - [flags] Options:
-t, --tag list # 镜像名称
-f, --file string # 指定Dockerfile文件位置
# docker build .
# docker build -t shykes/myapp .
# docker build -t shykes/myapp -f /path/Dockerfile /path
# docker build -t shykes/myapp http://www.example.com/Dockerfile
4. 构建Nginx,PHP,Tomcat基础镜像
编写Dockerfile 注意以下两点:
① 使用 && 符号将shell命令拼接起来,尽少使用dockerfile指令,减少分层,一个指令就是一层
② 清理当前环境留下的垃圾文件及缓存,减少空间大小,以便镜像上传下载等
• 构建Nginx基础镜像
FROM centos:7
MAINTAINER liuzhousheng
RUN yum install -y gcc gcc-c++ make \
openssl-devel pcre-devel gd-devel \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/*
RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz && \
tar zxf nginx-1.15.5.tar.gz && \
cd nginx-1.15.5 &&\
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module && \
make -j 4 && make install && \
rm -rf /usr/local/nginx/html/* && \
echo "ok" >> /usr/local/nginx/html/status.html && \
cd / && rm -rf nginx-1.12.2* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/nginx/sbin
#COPY nginx.conf /usr/local/nginx/conf/nginx.conf ## 先注释这行,不然构建需要依赖本地配置文件,启动启动容器会依赖php
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
运行命令:
# docker build -t nginx:v1 -f dockerfile-nginx .
...
Removing intermediate container 7b806be15eaf
---> ee4b38a88652
Successfully built ee4b38a88652
Successfully tagged nginx:v1
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 db3cfa07d4a5 45 seconds ago 395MB
# docker run -d --name nginx01 -p 88:80 nginx:v1
01cac841c29a11d61d7c2f49a45d8c36bbff7167694c2cab4df3e49e082dd138
# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
01cac841c29a nginx:v1 "nginx -g 'daemon of…" 6 seconds ago Up 4 seconds 0.0.0.0:88->80/tcp nginx01
# curl 10.40.6.165:88/status.html
ok
用刚刚创建的nginx:v1 镜像在创建一个v2镜像
# cat index.html ## 将这文件作为nginx root目录
hello docker!!!
# cat dockerfile-nginxv2 ## 新的dockerfile
FROM nginx:v1
COPY index.html /usr/local/nginx/html/
# docker build -t nginx:v2 -f dockerfile-nginxv2 . ## 创建nginx:v2镜像
Sending build context to Docker daemon 410.1kB
Step 1/2 : FROM nginx:v1
---> db3cfa07d4a5
Step 2/2 : COPY index.html /usr/local/nginx/html
---> 64f743ec5b18
Successfully built 64f743ec5b18
Successfully tagged nginx:v2
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 64f743ec5b18 27 seconds ago 395MB
nginx v1 db3cfa07d4a5 11 minutes ago 395MB
# docker run -d --name nginx02 -p 89:80 nginx:v2
c446b345b73ac6417d7090b5d46c7be574b87be152ad7c9f42886e86e43f4d06
# curl 10.40.6.165:89
hello docker!!!
• 构建PHP基础镜像
FROM centos:7
MAINTAINER liuzhousheng
RUN yum install epel-release -y && \
yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
libcurl-devel libjpeg-devel libpng-devel openssl-devel \
libmcrypt-devel libxslt-devel libtidy-devel autoconf \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/*
RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
tar zxf php-5.6.36.tar.gz && \
cd php-5.6.36 && \
./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm --enable-opcache \
--with-mysql --with-mysqli --with-pdo-mysql \
--with-openssl --with-zlib --with-curl --with-gd \
--with-jpeg-dir --with-png-dir --with-freetype-dir \
--enable-mbstring --with-mcrypt --enable-hash && \
make -j 4 && make install && \
cp php.ini-production /usr/local/php/etc/php.ini && \
cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf && \
sed -i "90a \daemonize = no" /usr/local/php/etc/php-fpm.conf && \
mkdir /usr/local/php/log && \
cd / && rm -rf php* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/php/sbin:/usr/local/php/bin
COPY php.ini /usr/local/php/etc/
COPY php-fpm.conf /usr/local/php/etc/
WORKDIR /usr/local/php
EXPOSE 9000
CMD ["php-fpm"]
运行命令构建:
# docker build -t php:v1 -f dockerfile-php .
...
---> 1c2bb6668116
Successfully built 1c2bb6668116
Successfully tagged php:v1
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
php v1 1c2bb6668116 About a minute ago 521MB
# docker run -d --name php01 php:v1
b41eab89377ddc8a0d9a600baeee33dd1c1b34b156d52c3d3d07abdb10f60e40
# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b41eab89377d php:v1 "php-fpm" 5 seconds ago Up 3 seconds 9000/tcp php01
# docker exec -it php01 bash
[root@b41eab89377d php]# ls
bin etc include lib log php sbin var
[root@b41eab89377d php]# pwd
/usr/local/php
[root@b41eab89377d php]#php -v
PHP 5.6.36 (cli) (built: May 15 2019 07:40:53)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
[root@b41eab89377d php]# ps aux |grep php
root 1 0.4 0.1 114644 8332 ? Ss 15:44 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nobody 6 0.0 0.0 114644 4356 ? S 15:44 0:00 php-fpm: pool www
nobody 7 0.0 0.0 114644 4356 ? S 15:44 0:00 php-fpm: pool www
nobody 8 0.0 0.0 114644 4356 ? S 15:44 0:00 php-fpm: pool www
[root@b41eab89377d php]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 1/php-fpm: master p
• 构建Tomcat基础镜像
FROM centos:7
MAINTAINER liuzhousheng
ENV VERSION=8.5.5
RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
yum clean all && \
rm -rf /var/cache/yum/*
#RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \
RUN wget http://10.40.6.64/src/apache-tomcat-${VERSION}.tar.gz && \
tar zxf apache-tomcat-${VERSION}.tar.gz && \
mv apache-tomcat-${VERSION} /usr/local/tomcat && \
rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
mkdir /usr/local/tomcat/webapps/test && \
echo "ok" > /usr/local/tomcat/webapps/test/status.html && \
sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/tomcat/bin
WORKDIR /usr/local/tomcat
EXPOSE 8080
CMD ["catalina.sh", "run"]
构建镜像运行一下命令:
# docker build -t tomcat:v1 -f dockerfile-tomcat .
...
---> e35360e86854
Successfully built e35360e86854
Successfully tagged tomcat:v1
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat v1 e35360e86854 About a minute ago 426MB
# docker run -d --name tomcat01 -p 8089:8080 tomcat:v1
fa5e1eafc72a5344b4d6c715bc98c5636d0b55519aea32754727ae542a0b0b1a
# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa5e1eafc72a tomcat:v1 "catalina.sh run" 4 seconds ago Up 3 seconds 0.0.0.0:8089->8080/tcp tomcat01
# curl 10.40.6.165:8089/test/status.html
ok
在tomcat:v1 镜像的基础创建一个tomcat:v2的镜像
# cat dockerfile-tomcatv2
FROM tomcat:v1
COPY jenkins.war /usr/local/tomcat/webapps/ROOT.war
# docker build -t tomcat:v2 -f dockerfile-tomcatv2 .
Sending build context to Docker daemon 74.99MB
Step 1/2 : FROM tomcat:v1
---> e35360e86854
Step 2/2 : COPY jenkins.war /usr/local/tomcat/webapps/ROOT.war
---> 59592f04baa9
Successfully built 59592f04baa9
Successfully tagged tomcat:v2
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat v2 59592f04baa9 10 seconds ago 501MB
# docker run -d --name tomcat02 -p 8088:8080 tomcat:v2
ad435374e7aea15e8f80b3bdb00c45ede4791a4801af2e774f5becb79cf1040d
# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad435374e7ae tomcat:v2 "catalina.sh run" 10 seconds ago Up 9 seconds 0.0.0.0:8088->8080/tcp tomcat02
## 然后用浏览器访问http://10.40.6.165:8088 就可以放到jenkins安装页面
• 快速部署LNMP网站平台
![](https://img.haomeiwen.com/i7464841/f24b98985af63982.png)
5. 快速搭建LNMP网站平台
lnmp 架构要用到三个容器,所以要准备相应的三个镜像:
php: php:v1(上边我们自己制作的镜像)
nginx: nginx:v1(上边我们自己制作的镜像)
mysql: mysql:5.7(使用官方镜像)
# docker pull mysql:5.7
(1)、自定义网络
# docker network create net-lnmp
(2)、创建Mysql容器
# docker run -d \
--name lnmp_mysql \
--net net-lnmp \
--mount src=mysql-vol,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 --character-set-server=utf8
(3)、创建PHP容器
docker run -d --name lnmp_php --net net-lnmp --mount src=wwwroot,dst=/wwwroot php:v1
(4)、创建Nginx容器
nginx.conf配置文件:
user nobody;
worker_processes 4;
worker_rlimit_nofile 65535;
error_log logs/error.log notice;
pid /var/run/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 off;
keepalive_timeout 65;
client_max_body_size 64m;
server {
listen 80;
server_name www.lnmp_test.com;
index index.php index.html;
access_log logs/www.lnmp_test.com_access.log;
error_log logs/www.lnmp_test.com_error.log;
# location ~ .*\.(js|css|html|png|gif|jpg|jpeg)$ {
location / {
root /wwwroot;
}
location ~* \.php$ {
root /wwwroot;
fastcgi_pass lnmp_php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
启动容器:
# docker run -d --name lnmp_nginx --net net-lnmp -p 88:80 \
--mount type=bind,src=$(pwd)/nginx.conf,dst=/usr/local/nginx/conf/nginx.conf --mount src=wwwroot,dst=/wwwroot nginx:v1
查看三个容器:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8c38e7b7a95 nginx:v1 "nginx -g 'daemon of…" 3 seconds ago Up 1 second 0.0.0.0:88->80/tcp lnmp_nginx
fe4117b21f2e php:v1 "php-fpm" 7 minutes ago Up 7 minutes 9000/tcp lnmp_php
7494e5977ba5 mysql:5.7 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 3306/tcp, 33060/tcp lnmp_mysql
创建php测试页:
# cat /var/lib/docker/volumes/wwwroot/_data/test.php
<?php
phpinfo()
?>
## 浏览器请求URL:http://10.40.6.165:88/test.php
(5)、以wordpress博客为例
https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
# cd /var/lib/docker/volumes/wwwroot/_data/
# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
# tar xvf wordpress-4.9.4-zh_CN.tar.gz
使用浏览器访问 http://10.40.6.165:88/wordpress
![](https://img.haomeiwen.com/i7464841/edc04ea5d095ec7d.png)
进入容器 lnmp_nginx查看nginx访问日志:
# docker exec -it lnmp_nginx bash
[root@f8c38e7b7a95 nginx]# tail -f logs/www.lnmp_test.com_access.log
10.19.1.28 - - [15/May/2019:17:13:42 +0800] "POST /wordpress/wp-admin/admin-ajax.php HTTP/1.1" 200 58 "http://10.40.6.165:88/wordpress/wp-admin/edit.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36"
10.19.1.28 - - [15/May/2019:17:13:43 +0800] "GET /wordpress/wp-includes/js/wp-emoji-release.min.js?ver=4.9.10 HTTP/1.1" 304 0 "http://10.40.6.165:88/wordpress/wp-admin/edit.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36"
10.19.1.28 - - [15/May/2019:17:13:43 +0800] "GET /wordpress/wp-admin/edit.php HTTP/1.1" 200 48058 "http://10.40.6.165:88/wordpress/wp-admin/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36"
10.19.1.28 - - [15/May/2019:17:13:43 +0800] "POST /wordpress/wp-admin/admin-ajax.php HTTP/1.1" 200 58 "http://10.40.6.165:88/wordpress/wp-admin/edit.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36"
网友评论