Docker的镜像制作与整套项目一键打包部署
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的镜像制作与整套项目一键打包部署的更多相关文章
- 5分钟快速掌握Jenkins,项目一键自动部署
5分钟快速掌握Jenkins,项目一键自动部署 目录 前言 Jenkins是什么? Jenkins环境安装搭建 Jenkins基本使用介绍 Jenkins快速构建项目,项目自动化部署 学习总结 前言 ...
- 测试环境docker化(一)—基于ndp部署模式的docker基础镜像制作
本文来自网易云社区 作者:孙婷婷 背景 我所在测试项目组目前的测试环境只有一套,在项目版本迭代过程中,开发或产品偶尔会在测试环境进行数据校验,QA人数在不断增加,各个人员在负责不同模块工作时也会产生脏 ...
- 中标麒麟龙芯平台--docker基础镜像制作
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 的出现为开发人员和运维人员带来了极大的便利.Docker在X86下常见的发行版Linux如Ub ...
- k8s+docker+proget 镜像制作
安装proget 1 首先在k8s上运行proget的数据库配置有个注意点:要根据proget官网要求的sql server排序方式建数据库,不然数据保存的时候会报错 2 proget运行起来后,默认 ...
- 使用IntelliJ IDEA和Maven构建Java web项目并打包部署
爱编程爱分享,原创文章,转载请注明出处,谢谢! http://www.cnblogs.com/fozero/p/6120375.html 一.背景 现在越来越多的人使用IntelliJ IDEA工具进 ...
- Jenkins结合shell脚本实现(gitLab/gitHub)前端项目自动打包部署服务器
原始发布部署: 石器时代的我们,先是本地打包好项目,在去服务器上把原来的文件删了,然后回到本地copy到服务器: 这操看起来简单,实际部署的人就知道多烦了,假如来几个项目都要重新发布:那就爽了: 今天 ...
- docker tomcat镜像制作
推荐使用dockerfile(本文直接拉取tomcat需要进入容器自行安装vim):docker利用Dockerfile来制作镜像 1.查找Docker Hub上的tomcat镜像 [root@loc ...
- docker之镜像制作
#:下载镜像并初始化系统 root@ubuntu:~# docker pull centos #:创建目录 root@ubuntu:/opt# mkdir dockerfile/{web/{nginx ...
- Vue项目build打包部署到Tomcat后,刷新报404错误解决方案
问题描述: 一.更新依赖,并打包项目 cd /root/.jenkins/workspace/v-test;npm installcd /root/.jenkins/workspace/v-test; ...
随机推荐
- 【Java并发】线程安全和内存模型
一.概述 1.1 什么是线程安全? 1.2 案例 1.3 线程安全解决办法: 二.synchronized 2.1 概述 2.2 同步代码块 2.3 同步方法 2.4 静态同步函数 2.5 总结 三. ...
- C# Winfrom TabControl美化
实例一: using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; na ...
- Hadoop_01_Apache Hadoop概述
一:Hadoop(Hadoop Distributed File System)概述:对海量数据分析处理的工具 1. Hadoop是Apache旗下的一个用java语言实现开源软件框架,是一个开发和运 ...
- VMware无法连接MKS:套接字连接尝试次数太多解决
粘贴自:https://jingyan.baidu.com/article/425e69e61eb578be15fc16ae.html VMware在开启虚拟机的时候,突然弹出[无法连接MKS:套接字 ...
- oracle 初试 hint
最近在研究oracle的视图问题,本来想全转成 物化视图(materialized view)的,这样可以极大提升系统的响应时间,无奈工作量太大,所以就研究了SQL优化的问题. 我这个普通视图 有36 ...
- Linux的.a、.so和.o文件及链接时的命名
在说明Linux的.a..so和.o文件关系之前,先来看看windows下obj,lib,dll,exe的关系 windows下obj,lib,dll,exe的关系 lib是和dll对应的.lib是静 ...
- wkhtmltopdf 自定义字体未生效或中文乱码
使用wkhtmltopdf控件将网页保存成pdf的过程中出现网页中有些字体,在PDF中未生效.通过网上查询结果有一种处理方式: 在网页头部的style标签中,手工指定宋体字体的本地存放位置,wkhtm ...
- Solving Docker permission denied while trying to connect to the Docker daemon socket
The error message tells you that your current user can’t access the docker engine, because you’re la ...
- modbus_百度经验
转自:https://jingyan.baidu.com/article/2c8c281dbdfa9f0009252a74.html 图片都没了,百度真差劲---还是博客园好!!! ModBus通讯规 ...
- HDU 6063 - RXD and math | 2017 Multi-University Training Contest 3
比赛时候面向过题队伍数目 打表- - 看了题解发现确实是这么回事,分析能力太差.. /* HDU 6063 - RXD and math [ 数学,规律 ] | 2017 Multi-Universi ...