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 = 1#创建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.1.tar.gz /tmp          #拷贝文件或目录到镜像下,遇到压缩文件自动解压缩
RUN cd /tmp/nginx-1.12.1 && \         #运行shell命令编译安装nginx,make -j 给与2个线程编译 ./configure --prefix=/usr/local/nginx && \make -j 2 && \make install
RUN rm -rf /tmp/nginx-1.12.1* && 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.1.tar.gz  nginx.conf#build基于nginx的docker镜像
docker build -t nginx:1 .

#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  65;server {listen 80;server_name localhost;root html;index index.html index.php;location ~ \.php$ {root html;fastcgi_pass lnmp_php:9000;       #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.31.tar.gz /tmp/        #将安装包考到 /tmp下并自动解压缩RUN cd /tmp/php-5.6.31 && \        #编译安装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 4 && \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.31* && 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.31.tar.gz  php.ini#build基于php的docker镜像
docker build -t php:1 .

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

#创建一个叫做lnmp的网络
docker network create lnmp
dad428646d8f8278f36b80b3b960493aee8be1960bb1f505bfeebc97022b6385docker 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:1
5b49fc160f9e42364238a937149bbb475036b8a28feddf0fe05c1e70b414a151#启动nginx容器
docker run -dit --name lnmp-nginx --net lnmp -p 8888:80 --mount type=bind,src=/www,dst=/usr/local/nginx/html nginx:1
7ce4d14cf756859e814186090a12b770916f150ed2a5fab2f0dc6ba8c347aab8docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
7ce4d14cf756        nginx:1             "./sbin/nginx -g 'da…"   16 seconds ago      Up 15 seconds       0.0.0.0:8888->80/tcp   lnmp-nginx
5b49fc160f9e        php:1               "./sbin/php-fpm -c /…"   6 minutes ago       Up 6 minutes        9000/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.46.tar.gz  Dockerfile  jdk-8u45-linux-x64.tar.gz  server.xml#筹备Dockerfile
vim Dockerfile
FROM centos:7
MAINTAINER wkADD jdk-8u45-linux-x64.tar.gz /usr/local        #创建javaJDK环境
ENV JAVA_HOME /usr/local/jdk1.8.0_45       #强行生成一个环境变量ADD apache-tomcat-8.0.46.tar.gz /usr/local    #解压tomcat
COPY server.xml /usr/local/apache-tomcat-8.0.46/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:1docker 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.zipinflating: docker-compose         ll docker-compose
-rw-r--r-- 1 root root 8858496 Aug 31  2017 docker-composechmod +x docker-composemv 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.1.tar.gz        #nginx源码包
│   └── nginx.conf                 #nginx配置文件
├── php
│   ├── Dockerfile                 #自定义php的docker镜像文件
│   ├── php-5.6.31.tar.gz          #php源码包
│   └── php.ini                    #php配置文件
└── wwwroot                        #网页目录└── index.php                  #默认网页文件                                                          

vim docker-compose.yml       #docker-compose启动接口文件必须是以.yml 结尾 他和ansbile都是python写的
version: '3'            #容器版本为3
services:             #容器服务有以下 nginx:              #nginx的容器hostname: nginx        #容器主机名为nginxbuild:                     #指定dockerfile文件的位置context: ./nginx      #dockerfile文件位置在当前路径下的nginx目录里dockerfile: Dockerfile   #dockerfile文件名:Dockerfileports:             #指定映射端口主机81映射到80- 81:80                  networks:                  #指定容器网卡在lnmp网桥- lnmpvolumes:                   #挂载当前目录下的./wwwroot到容器nginx的网页目录- ./wwwroot:/usr/local/nginx/htmlphp:                         #和nginx类似hostname: phpbuild:context: ./phpdockerfile: Dockerfilenetworks:- lnmpvolumes:- ./wwwroot:/usr/local/nginx/htmlmysql:hostname: mysqlimage: mysql:5.6            #下载镜像mysql5.6版本ports:                      - 3306:3306networks:- lnmpvolumes:                        #挂载mysql主配置文件和数据文件- ./mysql/conf:/etc/mysql/conf.d- ./mysql/data:/var/lib/mysql  command: --character-set-server=utf8         #执行命令,覆盖默认命令 environment:                            #添加环境变量MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: wordpressMYSQL_USER: userMYSQL_PASSWORD: user123networks:          #加入网络lnmp,引用顶级networks下条目lnmp:

#一键部署LNMP
docker-compose -f docker-compose.yml up        #-f指定当前目录下的docker-compose为启动文件,up创建和启动容器

#一键查看所有部署的容器进程
docker-compose -f docker-compose.yml psName                      Command               State           Ports
-------------------------------------------------------------------------------------
composelnmp_mysql_1   docker-entrypoint.sh --cha ...   Up      0.0.0.0:3306->3306/tcp
composelnmp_nginx_1   ./sbin/nginx -g daemon off;      Up      0.0.0.0:81->80/tcp
composelnmp_php_1     ./sbin/php-fpm -c /usr/loc ...   Up      9000/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.1.tar.gz #源码包
│   └── nginx.conf          #nginx配置文件
├── tomcat
│   ├── apache-tomcat-8.0.46.tar.gz #源码包
│   ├── Dockerfile      #自定义镜像配置文件
│   └── server.xml      #tomcat配置文件
└── webapps         └── ROOT└── index.html  #网页测试文件

#查看docker-compose的启动接口文件cat compose_nginx_tomcat/docker-compose.yml
version: '3'
services:nginx:hostname: nginxbuild:context: ./nginxdockerfile: Dockerfileports:- 82:80networks:- lnmtvolumes:- ./webapps:/opt/webappstomcat01:hostname: tomcat01build: ./tomcatnetworks:- lnmtvolumes:- /usr/local/jdk1.8.0_45:/usr/local/jdk1.8.0_45- ./webapps:/usr/local/apache-tomcat-8.0.46/webappstomcat02:hostname: tomcat02build: ./tomcatnetworks:- lnmtvolumes:- /usr/local/jdk1.8.0_45:/usr/local/jdk1.8.0_45   #docker宿主机的java环境被挂载了!- ./webapps:/usr/local/apache-tomcat-8.0.46/webapps    #挂载网页目录mysql:hostname: mysqlimage: mysql:5.6ports:- 3307:3306networks:- lnmtvolumes:- ./mysql/conf:/etc/mysql/conf.d- ./mysql/data:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: dbMYSQL_USER: userMYSQL_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  65;upstream www.example.com {#ip_hash;server tomcat01:8080;      #在compose的接口文件里定义的hostname主机名可直接解析为IPserver tomcat02:8080;}server {listen 80;server_name localhost;location / {proxy_pass http://www.example.com;}location ~ \.(html|css|js|jpg|png|gif)$ {root /opt/webapps/ROOT;}}
}

Docker的镜像制作与整套项目一键打包部署相关推荐

  1. docker打包镜像上传_Jenkins | 一键打包部署Spring Boot 应用的Docker镜像

    一.前言 1.本文主要内容 将在项目中实际使用到的相关东西整理记录一波,同时可以方便其他同学在使用到的时候参考一下(自己也备忘),有不对的地方,欢迎指出~~ Docker部署SpringBoot 项目 ...

  2. 【项目部署】使用Jenkins一键打包部署前端Vue应用

    文章目录 前言 一.准备工作 1.安装nginx 1.1 下载nginx的docker镜像 1.2 从容器中拷贝nginx配置 1.3 使用docker命令启动 1.4 测试 二.安装NodeJS插件 ...

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

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

  4. 蒲公英java后台上传_Android apk 项目一键打包并上传到蒲公英的实现方法

    项目一键打包并上传到蒲公英 缘由:测试流程由 打包 找包准备上传 填写更新信息 然后上传 过于复杂 所以想要简化开发 阅读须知:需要读者了解如何在项目里面建立一个空的gradle plugin的过程, ...

  5. jenkins shell 权限_使用Jenkins一键打包部署SpringBoot应用,就是这么6!

    任何简单操作的背后,都有一套相当复杂的机制.本文将以SpringBoot应用的在Docker环境下的打包部署为例,详细讲解如何使用Jenkins一键打包部署SpringBoot应用. Jenkins简 ...

  6. php项目webpack打包,Vue项目webpack打包部署时Tomcat刷新报404错误问题如何处理

    这次给大家带来Vue项目webpack打包部署时Tomcat刷新报404错误问题如何处理,Vue项目webpack打包部署时Tomcat刷新报404错误问题处理的注意事项有哪些,下面就是实战案例,一起 ...

  7. tim指定保存云服务器_阿里云发布 Cloud Toolkit for VS Code 新版本!一键打包部署,开发提速 8 倍...

    去年,阿里云发布了本地 IDE 插件 Cloud Toolkit,仅 IntelliJ IDEA 一个平台,就有 15 万以上的开发者进行了下载,体验了一键部署带来的开发便利.时隔一年,阿里云正式发布 ...

  8. Vue项目webpack打包部署到服务器

    Vue项目webpack打包部署到服务器 这篇博文主要说的就是我今天遇到的问题,而且在经过我的询问,好多人在打包部署的时候都遇到了一些问题,下面就来说下,如何将Vue项目放置在服务器上,这里以Tomc ...

  9. Vue项目的打包\部署\优化

    Vue项目的打包\部署\优化 如果有帮助到你 麻烦点个赞或者 收藏 +关注 哟 以后会经常发布一些干货文章 我只是一个前端小菜鸟,大佬勿喷! 一.nginx 开启 gzip 理论上,nginx 开启 ...

最新文章

  1. 最新!中国内地大学ESI排名出炉:362所高校上榜,南方科技大学、深圳大学、暨南大学表现出色!...
  2. 基于Spark ALS算法的个性化推荐
  3. 0.为什么要学习Vue?
  4. Kubernetes二进制部署——证书的制作和ETCD的部署
  5. 视图之二--视图中数据的更新
  6. CactiEZ V10.1 中文版 Cacti中文解决方案+使用教程(2)
  7. 博客七----tensorflow-gpu安装满满填坑
  8. SpringBoot中使用Hibernate Validator校验工具类
  9. puppet 3+Unicorn+Nginx安装配置
  10. Android apk如何加固防止被破解(防止逆向编译)
  11. 动画效果之时间轴对象构造器(即逐个执行动画)
  12. now is all
  13. Pascal 转 C++ 教程2
  14. Python+Selenium爬虫实现:草料二维码微信群活码自动更新,提升社群运营效率
  15. 解决mysql每天12点的dos弹框
  16. 2022年最新谷歌翻译chrome 浏览器翻译解决方案
  17. html3d轮播图片效果,CSS3,3D效果轮播图
  18. 用Matlab画散点图
  19. k8s学习-CKA真题-Pod指定节点部署
  20. WebRequest、WebResponse的使用示例

热门文章

  1. DRF 框架总结 - 视图集路由 Routers
  2. 欢迎大家多踩踩偶的个人博客噶 哇哈哈
  3. 如何基于 ZEGO SDK 实现 Android 一对一音视频聊天应用
  4. CSS 2D 转换 transform translate() rotate() scale() skew() matrix()
  5. vcenter server安装到第二阶段无法“下一步“问题解决
  6. pb文件转java 报:protoc did not exit cleanly. Review output for more information
  7. Linux查看文件行数
  8. ArcGIS模型构建器批量将多个图层根据字段分割
  9. Python二级(04)——Python语言基本语法元素
  10. (30)zabbix Trapper 监控项配置