dockerfile配置教程 生成docker image并实现docker部署

docker有个dockerfile 是什么东西,为什么我们要用他?

简单的说:  以前咱们docker run创建一个docker容器,有时候会附带不少的参数。

比如:

 代码如下 复制代码
docker run -d -p 22 -p 8080:8080 ruifengyun/ubunt-redis "redis-server redis.conf && /usr/sbin/sshd -D"

会发现很是麻烦。  这个时候咱们可以创建编辑一个dockerfile文件,生成新的image,然后从这个新的镜像创建容器,容器里面相关联的启动项和端口,目录都是提前定义好的。

cat Dockerfile

 代码如下 复制代码
#配置redis
FROM ubuntu
MAINTAINER ruifengyun "ruifengyun@qq.com"
ADD ./start.sh  /root/start.sh
RUN apt-get update
RUN apt-get install -y redis-server
RUN apt-get install -y openssh-server
#CMD redis-server /etc/redis/redis.conf && /usr/sbin/sshd -D
CMD ["redis-server","/etc/redis/redis.conf"]
EXPOSE 6379
EXPOSE 22

FROM   是作为镜像的基础

RUN    可以理解为在FROM下来的镜像做一些环境的部署。

CMD    是创建容器后,会运行的命令

EXPOSE 是暴露的端口

MAINTAINER 通知的邮件

ADD    相当于把主机的start.sh脚本传递给了容器里面。

VOLUME  是本地的路径的映射

WORKDIR 是执行的路径,也就是cmd entrypoint执行的路径。

 代码如下 复制代码
root@dev-ops:/var/4# docker build -t rui Dockerfile
Uploading context 2.048 kB
Uploading context
2014/08/16 09:50:59 Error: open /tmp/docker-build829651796/Dockerfile: not a directory
root@dev-ops:/var/4# docker build -t rui/redis .
Uploading context 2.56 kB
Uploading context
Step 0 : FROM ubuntu
 ---> c4ff7513909d
Step 1 : MAINTAINER Victor Coisne victor.coisne@dotcloud.com
 ---> Using cache
 ---> bbe0c91632f1
Step 2 : RUN apt-get update
 ---> Running in b10a1a60dcb3
Ign http://archive.ubuntu.com trusty InRelease
Ign http://archive.ubuntu.com trusty-updates InRelease
Ign http://archive.ubuntu.com trusty-security InRelease
Get:1 http://archive.ubuntu.com trusty Release.gpg [933 B]
Get:2 http://archive.ubuntu.com trusty-updates Release.gpg [933 B]
Get:3 http://archive.ubuntu.com trusty-security Release.gpg [933 B]
Get:4 http://archive.ubuntu.com trusty Release [58.5 kB]
Get:5 http://archive.ubuntu.com trusty-updates Release [59.7 kB]
Get:6 http://archive.ubuntu.com trusty-security Release [59.7 kB]
Get:7 http://archive.ubuntu.com trusty/main Sources [1335 kB]
Get:8 http://archive.ubuntu.com trusty/restricted Sources [5335 B]
Get:9 http://archive.ubuntu.com trusty/universe Sources [7926 kB]
Get:10 http://archive.ubuntu.com trusty/main amd64 Packages [1743 kB]
Get:11 http://archive.ubuntu.com trusty/restricted amd64 Packages [16.0 kB]
Get:12 http://archive.ubuntu.com trusty/universe amd64 Packages [7589 kB]
Get:13 http://archive.ubuntu.com trusty-updates/main Sources [138 kB]
Get:14 http://archive.ubuntu.com trusty-updates/restricted Sources [1250 B]
Get:15 http://archive.ubuntu.com trusty-updates/universe Sources [91.7 kB]
Get:16 http://archive.ubuntu.com trusty-updates/main amd64 Packages [375 kB]
Get:17 http://archive.ubuntu.com trusty-updates/restricted amd64 Packages [6341 B]
Get:18 http://archive.ubuntu.com trusty-updates/universe amd64 Packages [235 kB]
Get:19 http://archive.ubuntu.com trusty-security/main Sources [47.4 kB]
Get:20 http://archive.ubuntu.com trusty-security/restricted Sources [40 B]
Get:21 http://archive.ubuntu.com trusty-security/universe Sources [11.9 kB]
Get:22 http://archive.ubuntu.com trusty-security/main amd64 Packages [167 kB]
Get:23 http://archive.ubuntu.com trusty-security/restricted amd64 Packages [40 B]
Get:24 http://archive.ubuntu.com trusty-security/universe amd64 Packages [57.0 kB]
Fetched 19.9 MB in 11min 48s (28.1 kB/s)
Reading package lists...
 ---> 9ce87ae24eeb
Step 3 : RUN apt-get install -y redis-server
 ---> Running in b28a88665c3f
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  libjemalloc1 redis-tools
The following NEW packages will be installed:
  libjemalloc1 redis-server redis-tools
0 upgraded, 3 newly installed, 0 to remove and 3 not upgraded.
Need to get 410 kB of archives.
After this operation, 1272 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/universe libjemalloc1 amd64 3.5.1-2 [76.8 kB]
Get:2 http://archive.ubuntu.com/ubuntu/ trusty/universe redis-tools amd64 2:2.8.4-2 [65.7 kB]
Get:3 http://archive.ubuntu.com/ubuntu/ trusty/universe redis-server amd64 2:2.8.4-2 [267 kB]
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin:
Fetched 410 kB in 4s (91.4 kB/s)
Selecting previously unselected package libjemalloc1.
(Reading database ... 11518 files and directories currently installed.)
Preparing to unpack .../libjemalloc1_3.5.1-2_amd64.deb ...
Unpacking libjemalloc1 (3.5.1-2) ...
Selecting previously unselected package redis-tools.
Preparing to unpack .../redis-tools_2%3a2.8.4-2_amd64.deb ...
Unpacking redis-tools (2:2.8.4-2) ...
Selecting previously unselected package redis-server.
Preparing to unpack .../redis-server_2%3a2.8.4-2_amd64.deb ...
Unpacking redis-server (2:2.8.4-2) ...
Processing triggers for ureadahead (0.100.0-16) ...
Setting up libjemalloc1 (3.5.1-2) ...
Setting up redis-tools (2:2.8.4-2) ...
Setting up redis-server (2:2.8.4-2) ...
invoke-rc.d: policy-rc.d denied execution of start.
Processing triggers for libc-bin (2.19-0ubuntu6.1) ...
Processing triggers for ureadahead (0.100.0-16) ...
 ---> d37fb2bbe0b5
Step 4 : ENTRYPOINT redis-server /etc/redis/redis.conf && /usr/sbin/sshd -D
 ---> Running in f6c027ac643d
 ---> ec7fe19bdfed
Step 5 : USER daemon
 ---> Running in 0e3b10d07a16
 ---> d16398d08a4a
Step 6 : EXPOSE 6379
 ---> Running in c8ca52dde189
 ---> e0a9bcb25972
Step 7 : EXPOSE 22
 ---> Running in 22845a6abd90
 ---> 54bb130c7a44
Successfully built 54bb130c7a44
Removing intermediate container b10a1a60dcb3
Removing intermediate container b28a88665c3f
Removing intermediate container f6c027ac643d
Removing intermediate container 0e3b10d07a16
Removing intermediate container c8ca52dde189
Removing intermediate container 22845a6abd90
root@dev-ops:/var/4#

等折腾完了后,他会生成一个镜像 。 这个镜像是由咱们的dockerfile搞的。

这次咱们再创建容器,不用再加那么多参数了。

 代码如下 复制代码
root@dev-ops:~# docker run -d -P rui
116b30b056493237caca158849ae687c9beb4f8656be485c2a3cc71a27d8e951
root@dev-ops:~#
root@dev-ops:~#
root@dev-ops:~# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                CREATED             STATUS              PORTS                      NAMES
116b30b05649        rui:latest                      redis-server /etc/redis/redis.conf    4 seconds ago       Up 3 seconds        0.0.0.0:49153->6379/tcp   nostalgic_lumiere

咱们再来一个比较全的dockerfile例子:

功能是用来部署lnmp和wordpress  ,配置看起来多 ,其实还是比较规范的。

 代码如下 复制代码
FROM ubuntu:14.04
MAINTAINER liudehua <liudehua@xxx.com>
 
# Keep upstart from complaining
RUN dpkg-divert --local --rename --add /sbin/initctl
RUN ln -sf /bin/true /sbin/initctl
 
# Let the conatiner know that there is no tty
ENV DEBIAN_FRONTEND noninteractive
 
RUN apt-get update
RUN apt-get -y upgrade
 
# Basic Requirements
RUN apt-get -y install mysql-server mysql-client nginx php5-fpm php5-mysql php-apc pwgen python-setuptools curl git unzip
 
# Wordpress Requirements
RUN apt-get -y install php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-sqlite php5-tidy php5-xmlrpc php5-xsl
 
# mysql config
RUN sed -i -e"s/^bind-addresss*=s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
 
# nginx config
RUN sed -i -e"s/keepalive_timeouts*65/keepalive_timeout 2/" /etc/nginx/nginx.conf
RUN sed -i -e"s/keepalive_timeout 2/keepalive_timeout 2;ntclient_max_body_size 100m/" /etc/nginx/nginx.conf
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
 
# php-fpm config
RUN sed -i -e "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g" /etc/php5/fpm/php.ini
RUN sed -i -e "s/upload_max_filesizes*=s*2M/upload_max_filesize = 100M/g" /etc/php5/fpm/php.ini
RUN sed -i -e "s/post_max_sizes*=s*8M/post_max_size = 100M/g" /etc/php5/fpm/php.ini
RUN sed -i -e "s/;daemonizes*=s*yes/daemonize = no/g" /etc/php5/fpm/php-fpm.conf
RUN sed -i -e "s/;catch_workers_outputs*=s*yes/catch_workers_output = yes/g" /etc/php5/fpm/pool.d/www.conf
RUN find /etc/php5/cli/conf.d/ -name "*.ini" -exec sed -i -re 's/^(s*)#(.*)/1;2/g' {} ;
 
# nginx site conf
ADD ./nginx-site.conf /etc/nginx/sites-available/default
 
# Supervisor Config
RUN /usr/bin/easy_install supervisor
RUN /usr/bin/easy_install supervisor-stdout
ADD ./supervisord.conf /etc/supervisord.conf
 
# Install Wordpress
ADD http://wordpress.org/latest.tar.gz /usr/share/nginx/latest.tar.gz
RUN cd /usr/share/nginx/ && tar xvf latest.tar.gz && rm latest.tar.gz
RUN mv /usr/share/nginx/html/5* /usr/share/nginx/wordpress
RUN rm -rf /usr/share/nginx/www
RUN mv /usr/share/nginx/wordpress /usr/share/nginx/www
RUN chown -R www-data:www-data /usr/share/nginx/www
 
# Wordpress Initialization and Startup Script
ADD ./start.sh /start.sh
RUN chmod 755 /start.sh
 
# private expose
EXPOSE 3306
EXPOSE 80
 
CMD ["/bin/bash", "/start.sh"]

再来一个mognodb的例子:

注: 可以用   标识换行

 代码如下 复制代码
FROM dockerfile/ubuntu
 
# Install MongoDB.
RUN
  apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 &&
  echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list &&
  apt-get update &&
  apt-get install -y mongodb-org &&
  mkdir -p /data/db
 
VOLUME ["/data"]
 
WORKDIR /data
 
CMD ["mongod"]
 
EXPOSE 27017
EXPOSE 28017

官网有不少的例子,有兴趣的朋友可以到 https://github.com/dockerfile 查看下。

在dockerfile使用cmd、entrypoint 需要注意:

cmd 是可以写成shell的模式, 也就是 咱们平时写语句那样

CMD  redis-server redis.conf && service sshd restart

docker调用它的时候是用/bin/sh -c 调用的。  这个时候有些少许的问题,大家再测试的时候,最好在自己的本机也测一般。  sh -c 这东西挺奇妙的 ,貌似他的参数断句有问题,有些蛋疼。

一般来说,在用cmd启动的时候  用exec的模式多点 ,也就是 ['redis-server','/etc/redis/redis.conf'] 他自己会用空格组成一条命令。 

一个dockerfile里面只能有一个CMD。 写多了没用。

时间: 2024-08-02 22:26:56

dockerfile配置教程 生成docker image并实现docker部署的相关文章

Linux下Docker安装配置教程_docker

在Linux上安装Docker,具体几个步骤: 环境:windows7 虚拟机:Oracle VMVirtualBox Linux: ubuntukylin-14.04.1-amd64.iso JDK:1.7 一.环境准备 step1:安装虚拟机 step2:修改宿主机BIOS配置,详细步骤见文章:http://www.jb51.net/article/96239.htm step3:在虚拟机上安装ubuntu系统.内存设置为4G,硬盘设置为100G,其余均按默认,一直点选下一步.直到系统安装成

jpgraph安装配置教程详细介绍

在学习了之前两篇php jpgraph安装教程后,只要jpgraph类库通过了PHP安装环境的验证后,就可以正式安装jpgraph类库了,其实jpgraph类库的安装非常方便,只要将下载的jpgraph类库解压缩至已搭建的PHP环境下的相关目录下即可.jpgraph安装过程的关键在于PHP配置文件php.ini与jpgraph配置文件jpg-config.inc.php配置.下面我根据jpgraph类库的英文文档进行说明,希望对使用jpgraph类库的PHP开发者有所帮助. jpgraph类库安

织梦cms目录权限安全配置教程(iis/apache/windows/linux)

../  [站点上级目录] //如果要使用后台的目录相关的功能需要有列出目录的权限 //0444 /   [站点根目录] //需要执行和读取权限 如果要在根目录下面创建文件和目录的话需要有写入权限 //0755 /install [安装程序目录] //需要有执行和读取权限 //建议安装完成以后删除或者改名 //0555 /dede [后台程序目录] //需要有执行权限和读取权限 //建议安装完成以后修改目录名称 //0755 /include [主程序目录] //需要有写入.执行权限和读取权限

nginx搭建https服务器的配置教程

nginx搭建https服务器的配置教程 首先确保机器上安装了openssl和openssl-devel #yum install openssl #yum install openssl-devel 然后就是自己颁发证书给自己 #cd /usr/local/nginx/conf #openssl genrsa -des3 -out server.key 1024 #openssl req -new -key server.key -out server.csr #openssl rsa -in

PHP框架laravel的.env文件配置教程

前言 大家应该都知道使用laravel框架开发PHP程序的时候,配置框架的.env文件是至关重要的,这个文件上需要配置数据库.数据库用户以及缓存等,下面来一起看看详细的配置教程. 一.配置APP_KEY laravel框架默认在.env配置文件中硬编码了对称加密密钥,开发环境和生产环境不必且应严格禁止使用相同的APP_KEY 在项目中运行php artisan key:generate就会在.env文件中自动生成密钥. APP_KEY=Li0zqXhuxOlnsMtG90UsU*********

CssGaga教程:生成DataURI,抽取图片,下载远程css文件,图片无损压缩

文章简介:CssGaga教程:生成DataURI,抽取图片,下载远程css文件,图片无损压缩. CssGaga – 生成dataURI和MHTML Before: .base64{background-image:url('base64/logo.png');} .base64{border-image:url('base64/logo.png');} 注:要转换的图片文件所在base64文件夹与css同级且引用时为相对路径 After: .base64{background-image:url

PHP调试工具Xdebug安装配置教程

说道PHP代码调试,对于有经验的PHPer,通过echo.print_r.var_dump函数,或PHP开发工具zend studio.editplus可解决大部分问题,但是对于PHP入门学习的童鞋来说有一定的难度,而且仅仅通过上述这些PHP调试手段,也很难准确发现PHP性能方面的问题,Xdebug是一个非常有用的PHP调试工具. Xdebug作为PHP调试工具,提供了丰富的调试函数,也可将Xdebug安装配置为zend studio.editplus调试PHP的第三方插件,通过开启自动跟踪(a

网吧交换机配置教程

在网管的工作中,网吧交换机配置是必须要掌握和熟练的,由于这是一个复杂的过程,对于一些新生的网管们,可能还缺乏经验.本篇具体的说明网吧交换机配置教程,仅供参考. 不同类型的交换机Console端口所处的位置并不相同,Console端口的类型也有所不同,绝大多数都采用RJ-45端口,但也有少数采用DB-9串口端口或DB-25串口端口.那么接下来就具体的来操作一下,步骤如下: 第1步:打开与交换机相连的计算机电源,运行计算机中的Windows2003或2008操作系统. 第2步:检查是否安装有"超级终

Stingray Traffic Manager配置教程

Stingray Traffic Manager配置教程 首先把你后端的软件端口改掉 改成 除80外的可用端口 比如 81 82 83 登录zxtm后台(ZXTM 是一款很强大的负载均衡软件.主要用于web服务器.强大的规则功能和监控系统都是非常给力的.) 第一步 选择 services 再点击pools 找到 Create a new Pool 部分 输入名称 通信服务器IP及端口 可以使用Use Auto-Scaling for the nodes in this pool Monitor: