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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介:

前言:

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


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


比如:

1
docker run -d -p 22 -p 8080:8080 ruifengyun /ubunt-redis  "redis-server redis.conf && /usr/sbin/sshd -D"


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

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

cat Dockerfile

1
2
3
4
5
6
7
8
9
10
11
#配置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执行的路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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 

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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
原文: 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的例子:

注: 可以用 \  标识换行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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。 写多了没用。





 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1541081 ,如需转载请自行联系原作者

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
9天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
39 2
|
6天前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
6天前
|
JavaScript 开发者 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
6天前
|
安全 Docker 微服务
深入理解Docker容器技术:从基础到实践
深入理解Docker容器技术:从基础到实践
|
8天前
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。
|
9天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
9天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
2月前
|
Linux Docker 容器
Docker操作 :容器命令
Docker操作 (四)
|
1月前
|
安全 Shell Linux
docker进入容器命令
docker进入容器命令
|
2月前
|
应用服务中间件 Shell nginx
Docker容器操作基础命令
关于Docker容器操作基础命令的教程,涵盖了从启动、查看、删除容器到端口映射和容器信息获取的一系列常用命令及其使用方法。
98 14
下一篇
无影云桌面