Dockerfile常用指令介绍

指令 描述
FROM 构建的新镜像是基于哪个镜像。例如:FROM centos:6
MAINTAINER 镜像维护者姓名或邮箱地址。例如:MAINTAINER Mr.chen
RUN 构建镜像时运行的Shell命令。例如:RUN ["yum","install","httpd"]
  或者RUN yum install httpd
CMD 运行容器时执行的Shell命令(可以被运行时传递的参数覆盖)。例如:CMD ["-c","/start.sh"]
  或者CMD ["/usr/sbin/sshd","-D"]或者CMD /usr/sbin/sshd -D
EXPOSE 声明容器运行的服务端口。例如:EXPOSE 80 443
ENV 设置容器内环境变量。例如:ENV MYSQL_ROOT_PASSWORD 123456
ADD 拷贝文件或目录到镜像(可以自动解压缩或者下载)
  例如:ADD ["src","dest"]或者ADD https://xxx.com/html.tar.gz /var/www/html
  或者:ADD html.tar.gz /var/www/html
COPY 拷贝文件或目录到镜像(不能自动解压缩)。例如:COPY ./start.sh /start.sh
ENTRYPOINT 运行容器时执行的Shell命令(不能被运行时传递的参数覆盖)。例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"]
  或者ENTRYPOINT /bin/bash -c "/start.sh"
VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器
  例如:VOLUME ["/var/lib/mysql"]
USER 为RUN,CMD和ENTRYPOINT执行命令指定运行用户
  例如:USER Mr_chen
WORKDIR 为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。
  例如:WORKDIR /data
HEALTHCHECK 健康检查。例如:HEALTHCHECK --interval=5m --timeout=3s --retries=3
  CMD curl -f http://localhost/ || exit 1
ARG 在构建镜像时指定一些参数。例如:ARG user

利用Dockerfile编写简单的nginxWeb镜像

#首先开启ipv4转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
net.ipv4.ip_forward = #创建nginx的镜像目录
mkdir -p dockerfile/lib/centos/nginx
cd dockerfile/lib/centos/nginx #准备Dockerfile文件
vim Dockerfile
FROM centos:7 #构建的新镜像是基于哪个镜像(构建的nginx是基于centos7构建的,依赖centos7的系统支持,如果没有镜像自动下载)
MAINTAINER wk #镜像制作人
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel #构建镜像时运行shell命令,yum安装nginx的依赖包
ADD nginx-1.12..tar.gz /tmp #拷贝文件或目录到镜像下,遇到压缩文件自动解压缩
RUN cd /tmp/nginx-1.12. && \ #运行shell命令编译安装nginx,make -j 给与2个线程编译
./configure --prefix=/usr/local/nginx && \
make -j && \
make install
RUN rm -rf /tmp/nginx-1.12.* && yum clean all      #删除nginx源码包和清空yum缓存,使容器最轻量化
COPY nginx.conf /usr/local/nginx/conf #拷贝文件或目录到镜像
WORKDIR /usr/local/nginx                   #为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。
EXPOSE 80                            #声明容器的端口号
CMD ["./sbin/nginx", "-g", "daemon off;"]         #运行容器时执行的shell命令 -g daemon off 不以守护进程的方式开启nginx,即不以后台运行的方式开启nginx

#将事先准备好的nginx-1.12.1.tar.gz和nginx.conf配置文件拷贝到当前目录下
ls
Dockerfile nginx-1.12..tar.gz nginx.conf #build基于nginx的docker镜像
docker build -t nginx: .
#nginx主配置文件
cat conf/nginx.conf
user root;
worker_processes auto; error_log logs/error.log info; pid logs/nginx.pid; events {
use epoll;
} 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 ; server {
listen ;
server_name localhost;
root html;
index index.html index.php; location ~ \.php$ {
root html;
fastcgi_pass lnmp_php:; #lnmp_ph为php容器主机名,对应的就是php的IP地址
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}

构建PHP网站平台镜像

#创建php的镜像目录
mkdir -p /root/dockerfile/lib/centos/php
cd /root/dockerfile/lib/centos/php #准备Dockerfile文件
vim Dockerfile
FROM centos:7 #新镜像基于centos7镜像
MAINTAINER wk     #新镜像制作人
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel      #运行shell安装依赖
ADD php-5.6..tar.gz /tmp/ #将安装包考到 /tmp下并自动解压缩 RUN cd /tmp/php-5.6. && \        #编译安装php,复制php启动文件.并修改启动文件的配置
./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 && \
make install && \
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/" /usr/local/php/etc/php-fpm.conf && \
sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf
COPY php.ini /usr/local/php/etc        #将php主配置文件拷贝进去 RUN rm -rf /tmp/php-5.6.* && yum clean all #删除不用的文件,清空yum缓存使容器最轻量化 WORKDIR /usr/local/php        #进入容器的位置,也是php程序的位置
EXPOSE 9000               #开启端口9000
CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"]    #开启php -c 指定主配置文件 #将事先准备好的php.ini文件及php-5.6.31.tar.gz拷贝到当前目录下
ls
Dockerfile php-5.6..tar.gz php.ini #build基于php的docker镜像
docker build -t php: .

创建nginx-php网络环境,并启动容器

#创建一个叫做lnmp的网络
docker network create lnmp
dad428646d8f8278f36b80b3b960493aee8be1960bb1f505bfeebc97022b6385 docker network ls
NETWORK ID NAME DRIVER SCOPE
0604a9338e1b bridge bridge local
b68e9da0b1e6 host host local
dad428646d8f lnmp bridge local
cf4b2d0b4394 none null local #创建nginx-php网页挂载目录
mkdir -p /www #启动php容器
docker run -dit --name lnmp-php --net lnmp --mount type=bind,src=/www,dst=/usr/local/nginx/html php:
5b49fc160f9e42364238a937149bbb475036b8a28feddf0fe05c1e70b414a151 #启动nginx容器
docker run -dit --name lnmp-nginx --net lnmp -p : --mount type=bind,src=/www,dst=/usr/local/nginx/html nginx:
7ce4d14cf756859e814186090a12b770916f150ed2a5fab2f0dc6ba8c347aab8 docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ce4d14cf756 nginx: "./sbin/nginx -g 'da…" seconds ago Up seconds 0.0.0.0:->/tcp lnmp-nginx
5b49fc160f9e php: "./sbin/php-fpm -c /…" minutes ago Up minutes /tcp lnmp-php #创建测试页面php.info
echo "<?php phpinfo();?>" > /www/index.php

通过浏览器进行访问测试

构建JAVA网站环境镜像

#创建java镜像构建存储目录
mkdir -p dockerfile/lib/centos/tomcat
cd dockerfile/lib/centos/tomcat #将所需软件包拷贝到当前目录下
ls
apache-tomcat-8.0..tar.gz Dockerfile jdk-8u45-linux-x64.tar.gz server.xml #筹备Dockerfile
vim Dockerfile
FROM centos:7
MAINTAINER wk ADD jdk-8u45-linux-x64.tar.gz /usr/local #创建javaJDK环境
ENV JAVA_HOME /usr/local/jdk1..0_45       #强行生成一个环境变量 ADD apache-tomcat-8.0..tar.gz /usr/local    #解压tomcat
COPY server.xml /usr/local/apache-tomcat-8.0./conf   #复制配置文件 RUN rm -f /usr/local/*.tar.gz            #删除安装包 容器轻量化 WORKDIR /usr/local/apache-tomcat-8.0.46      #工作目录 进入容器所在的目录
EXPOSE 8080                       #映射端口
ENTRYPOINT ["./bin/catalina.sh", "run"]      #用catalina。sh run前台启动tomcat #build基于tomcat的镜像
docker build -t tomcat:1 . #创建网页挂载目录
mkdir -p /app #启动tomcat的容器进程
docker run -dit --name=tomcat -p 8080:8080 --network lnmp --mount type=bind,src=/app/,dst=/usr/local/apache-tomcat-8.0.46/webapps tomcat:1 docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15eca19688ca tomcat:1 "./bin/catalina.sh r…" 17 seconds ago Up 16 seconds 0.0.0.0:8080->8080/tcp tomcat
7ce4d14cf756 nginx:1 "./sbin/nginx -g 'da…" 2 hours ago Up About an hour 0.0.0.0:8888->80/tcp lnmp-nginx
5b49fc160f9e php:1 "./sbin/php-fpm -c /…" 2 hours ago Up About an hour 9000/tcp lnmp_php #创建网站测试页
mkdir /app/ROOT
vim /app/ROOT/index.html
ddddddddddddddddddd

整套项目一键打包部署

Docker Compose用法

Compose是一个定义和管理多容器的工具,使用Python语言编写。使用Compose配置文件描述多个容器应用的架构,比如使用什么镜像,数据卷,网络,映射端口等;然后一条命令管理所有服务,比如启动,停止,重启等

安装

unzip docker-compose-linux-x86_64.zip
Archive: docker-compose-linux-x86_64.zip
inflating: docker-compose ll docker-compose
-rw-r--r-- root root Aug docker-compose chmod +x docker-compose mv docker-compose /usr/bin/

YAML文件格式及编写注意事项

YAML是一种标记语言很直观的数据序列化格式,可读性高。类似于XML数据描述语言,语法比XML简单的很多

YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号括起来,hash用花括号括起来

YAML文件格式注意事项:

  • 不支持制表符tab键缩进,需要使用空格缩进
  • 通常开头缩进2个空格
  • 字符后缩进1个空格,如冒号,逗号,横杆
  • 用井号注释
  • 如果包含特殊字符用单引号引起来
  • 布尔值(true,false,yes,no,on,off)必须用引号括起来,这样分析器会将他们解释为字符串。

配置文件常用字段

字段 描述
build 下级字段dockerfile:指定Dockerfile文件名
  下级字段context;构建镜像上下文路径
image 指定镜像
command 执行命令,覆盖默认命令
container_name 指定容器名称
deploy 指定部署和运行服务相关配置,只能在Swarm模式使用
environment 添加环境变量
networks 加入网络,引用顶级networks下条目
ports 暴露端口,与-p相同,但端口不能低于60
volumes 挂载宿主机路径或命名卷。如果是命名卷在顶级volumes定义卷名称
restart 重启策略,默认no,always | on-failure | unless-stopped
hostname

容器主机名

常用命令

字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里执行命令
scale 指定一个服务容器启动数量
top 显示容器进程
logs 查看容器输出
down 删除容器,网络,数据卷和镜像
stop/start/restart 停止/启动/重启服务

一键部署LNMP网站平台

#查看compose_lnmp包
tree /root/compose_lnmp/
/root/compose_lnmp/
├── docker-compose.yml #docker-compose启动接口文件
├── mysql
│   ├── conf
│   │   └── my.cnf #mysql配置文件
│   └── data #待挂载mysql数据目录
├── nginx
│   ├── Dockerfile #自定义nginx的Docker镜像配置文件
│   ├── nginx-1.12..tar.gz #nginx源码包
│   └── nginx.conf #nginx配置文件
├── php
│   ├── Dockerfile #自定义php的docker镜像文件
│   ├── php-5.6..tar.gz #php源码包
│   └── php.ini #php配置文件
└── wwwroot #网页目录
└── index.php #默认网页文件
vim docker-compose.yml       #docker-compose启动接口文件必须是以.yml 结尾 他和ansbile都是python写的
version: ''           #容器版本为3
services:             #容器服务有以下 
nginx:              #nginx的容器
hostname: nginx       #容器主机名为nginx
build: #指定dockerfile文件的位置
context: ./nginx      #dockerfile文件位置在当前路径下的nginx目录里
dockerfile: Dockerfile #dockerfile文件名:Dockerfile
ports:             #指定映射端口主机81映射到80
- :80
networks: #指定容器网卡在lnmp网桥
- lnmp
volumes: #挂载当前目录下的./wwwroot到容器nginx的网页目录
- ./wwwroot:/usr/local/nginx/html php:   #和nginx类似
hostname: php
build:
context: ./php
dockerfile: Dockerfile
networks:
- lnmp
volumes:
- ./wwwroot:/usr/local/nginx/html mysql:
hostname: mysql
image: mysql:5.6 #下载镜像mysql5.6版本
ports:
- :
networks:
- lnmp
volumes: #挂载mysql主配置文件和数据文件
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
command: --character-set-server=utf8 #执行命令,覆盖默认命令
environment: #添加环境变量
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE: wordpress
MYSQL_USER: user
MYSQL_PASSWORD: user123 networks: #加入网络lnmp,引用顶级networks下条目
lnmp:
#一键部署LNMP
docker-compose -f docker-compose.yml up #-f指定当前目录下的docker-compose为启动文件,up创建和启动容器
#一键查看所有部署的容器进程
docker-compose -f docker-compose.yml ps
Name Command State Ports
-------------------------------------------------------------------------------------
composelnmp_mysql_1 docker-entrypoint.sh --cha ... Up 0.0.0.0:->/tcp
composelnmp_nginx_1 ./sbin/nginx -g daemon off; Up 0.0.0.0:->/tcp
composelnmp_php_1 ./sbin/php-fpm -c /usr/loc ... Up /tcp #一键终止所有部署的容器进程
docker-compose -f docker-compose.yml stop
Stopping composelnmp_nginx_1 ... done
Stopping composelnmp_php_1 ... done
Stopping composelnmp_mysql_1 ... done #一键启动容器,在后台运行
docker-compose -f docker-compose.yml start
#一键清理所有部署的容器进程 docker-compose -f docker-compose.yml down

一键部署Nginx反向代理Tomcat集群实战

#查看compose_nginx_tomcat包
[root@docker ~]# tree compose_nginx_tomcat/
compose_nginx_tomcat/
├── docker-compose.yml
├── mysql
│ ├── conf
│ │ └── my.cnf #mysql的配置文件
│ └── data #待挂载mysql数据目录
├── nginx
│ ├── Dockerfile #自定义镜像配置文件
│ ├── nginx-1.12..tar.gz #源码包
│ └── nginx.conf #nginx配置文件
├── tomcat
│ ├── apache-tomcat-8.0..tar.gz #源码包
│ ├── Dockerfile #自定义镜像配置文件
│ └── server.xml #tomcat配置文件
└── webapps
└── ROOT
└── index.html #网页测试文件
#查看docker-compose的启动接口文件
cat compose_nginx_tomcat/docker-compose.yml
version: ''
services:
nginx:
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- :
networks:
- lnmt
volumes:
- ./webapps:/opt/webapps
tomcat01:
hostname: tomcat01
build: ./tomcat
networks:
- lnmt
volumes:
- /usr/local/jdk1..0_45:/usr/local/jdk1..0_45
- ./webapps:/usr/local/apache-tomcat-8.0./webapps
tomcat02:
hostname: tomcat02
build: ./tomcat
networks:
- lnmt
volumes:
- /usr/local/jdk1..0_45:/usr/local/jdk1..0_45 #docker宿主机的java环境被挂载了!
- ./webapps:/usr/local/apache-tomcat-8.0./webapps #挂载网页目录
mysql:
hostname: mysql
image: mysql:5.6
ports:
- :
networks:
- lnmt
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE: db
MYSQL_USER: user
MYSQL_PASSWORD: user123
networks:
lnmt:

每个容器安装JAVA环境,会使容器过大,所以用本地java环境挂在到tomcat容器内,这样节省空间

#由于tomcat容器进程需要挂载docker宿主机本地的java环境
#所以在docker宿主机本地安装jdk-8u45-linux-x64.tar.gz
tar xf jdk-8u45-linux-x64.tar.gz -C /usr/local #一键部署ngxin+tomcat反向代理集群
docker-compose -f docker-compose.yml up
nginx反向代理配置文件
user root;
worker_processes auto; error_log logs/error.log info; pid logs/nginx.pid; events {
use epoll;
} 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 ; upstream www.example.com {
#ip_hash;
server tomcat01:; #在compose的接口文件里定义的hostname主机名可直接解析为IP
server tomcat02:;
} server {
listen ;
server_name localhost; location / {
proxy_pass http://www.example.com;
} location ~ \.(html|css|js|jpg|png|gif)$ {
root /opt/webapps/ROOT;
}
}
}

Docker的镜像制作与整套项目一键打包部署的更多相关文章

  1. 5分钟快速掌握Jenkins,项目一键自动部署

    5分钟快速掌握Jenkins,项目一键自动部署 目录 前言 Jenkins是什么? Jenkins环境安装搭建 Jenkins基本使用介绍 Jenkins快速构建项目,项目自动化部署 学习总结 前言 ...

  2. 测试环境docker化(一)—基于ndp部署模式的docker基础镜像制作

    本文来自网易云社区 作者:孙婷婷 背景 我所在测试项目组目前的测试环境只有一套,在项目版本迭代过程中,开发或产品偶尔会在测试环境进行数据校验,QA人数在不断增加,各个人员在负责不同模块工作时也会产生脏 ...

  3. 中标麒麟龙芯平台--docker基础镜像制作

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 的出现为开发人员和运维人员带来了极大的便利.Docker在X86下常见的发行版Linux如Ub ...

  4. k8s+docker+proget 镜像制作

    安装proget 1 首先在k8s上运行proget的数据库配置有个注意点:要根据proget官网要求的sql server排序方式建数据库,不然数据保存的时候会报错 2 proget运行起来后,默认 ...

  5. 使用IntelliJ IDEA和Maven构建Java web项目并打包部署

    爱编程爱分享,原创文章,转载请注明出处,谢谢! http://www.cnblogs.com/fozero/p/6120375.html 一.背景 现在越来越多的人使用IntelliJ IDEA工具进 ...

  6. Jenkins结合shell脚本实现(gitLab/gitHub)前端项目自动打包部署服务器

    原始发布部署: 石器时代的我们,先是本地打包好项目,在去服务器上把原来的文件删了,然后回到本地copy到服务器: 这操看起来简单,实际部署的人就知道多烦了,假如来几个项目都要重新发布:那就爽了: 今天 ...

  7. docker tomcat镜像制作

    推荐使用dockerfile(本文直接拉取tomcat需要进入容器自行安装vim):docker利用Dockerfile来制作镜像 1.查找Docker Hub上的tomcat镜像 [root@loc ...

  8. docker之镜像制作

    #:下载镜像并初始化系统 root@ubuntu:~# docker pull centos #:创建目录 root@ubuntu:/opt# mkdir dockerfile/{web/{nginx ...

  9. Vue项目build打包部署到Tomcat后,刷新报404错误解决方案

    问题描述: 一.更新依赖,并打包项目 cd /root/.jenkins/workspace/v-test;npm installcd /root/.jenkins/workspace/v-test; ...

随机推荐

  1. 支持向量机通俗导论 ——理解SVM的三层境界 总结

    1.什么是支持向量机(SVM) 所谓支持向量机,顾名思义,分为两部分了解:一,什么是支持向量(简单来说,就是支持或支撑平面上把两类类别划分开来的超平面的向量点):二,这里的“机(machine,机器) ...

  2. IO 理论 SOCK理论

    IO密集型程序 在程序执行过程中存在大量IO操作,而CPU操作较少,消耗CPU较少,运行效率较低CPU(计算)密集型程序 在程序执行中,CPU运算较多,IO操作相对较少(消耗CPU大,运行速度快)IO ...

  3. 8.caffe:make_mean.sh( 数据平均化 )

    个人实践代码如下: #!/usr/bin/env sh # Compute the mean image from the imagenet training lmdb # N.B. this is ...

  4. IDEA常见问题和设置

    1.查看方法的文档:快捷键 Ctrl-Q(Ctrl-J(mac)) 2.历史记录 3.IDEA控制台输出中文乱码问题 4.修改Idea默认的maven等全局设置 5.idea 启动时报错javax.i ...

  5. 在当前目录下配置ansible

    配置ansible.cfg [defaults] inventory = myhost # 指定主机清单文件 host_key_checking = False 配置主机清单文件 [node] nod ...

  6. bat文件设置环境变量脚本

    :: 获取管理员权限 @echo off % mshta vbscript:CreateObject()(window.close)&&exit cd /d "%~dp0&q ...

  7. Ubuntu操作及Linux基础知识

    part 1: Ubuntu操作基础 1.调整字体的大小 调大:crtl+shift+“+”  调小:crtl+“-” 2.不要把虚拟机全屏的时候截屏,要不然会认为是Linux系统截屏而非Window ...

  8. 蓝桥 log大侠

    标题:Log大侠 atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠. 一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力... 变换的规则是: ...

  9. jQuery系列(十):事件对象

    1.事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. (1)什么时候会产生Event 对象呢? 例如: 当用户单击某个元素的时候,我们给 ...

  10. mysql查询字段中含有中文

    查询mysql数据库中字段中含有中文使用正则表达式: 例如: select create_time,nickname from eb_engineer where not(nickname regex ...