手记

用dockerfile配置生成docker image并实现容器部署


前言:

       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文件,生成新的p_w_picpath,然后从这个新的镜像创建容器,容器里面相关联的启动项和端口,目录都是提前定义好的。

原文: http://rfyiamcool.blog.51cto.com/1030776/1541081 

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#

原文: http://rfyiamcool.blog.51cto.com/1030776/1541081

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

wKioL1PvF17B2sFBAAE_w3QKOcY684.jpg

原文: http://rfyiamcool.blog.51cto.com/1030776/1541081 

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

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  ,配置看起来多 ,其实还是比较规范的。

原文: http://rfyiamcool.blog.51cto.com/1030776/1541081 

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-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf

# nginx config

RUN sed -i -e"s/keepalive_timeout\s*65/keepalive_timeout 2/" /etc/nginx/nginx.conf

RUN sed -i -e"s/keepalive_timeout 2/keepalive_timeout 2;\n\tclient_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_filesize\s*=\s*2M/upload_max_filesize = 100M/g" /etc/php5/fpm/php.ini

RUN sed -i -e "s/post_max_size\s*=\s*8M/post_max_size = 100M/g" /etc/php5/fpm/php.ini

RUN sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" /etc/php5/fpm/php-fpm.conf

RUN sed -i -e "s/;catch_workers_output\s*=\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。 写多了没用。

©著作权归作者所有:来自51CTO博客作者rfyiamcool的原创作品,谢绝转载,否则将追究法律责任

docker dockerfiledockerfiledocker 部署python应用


0人推荐
随时随地看视频
慕课网APP