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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

前言:

       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
相关文章
|
18天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
61 2
|
16天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
19天前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
90 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
3天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
24 6
|
3天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
13 5
|
3天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
23 3
|
3天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
15 2
|
8天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
39 5
|
10天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
9天前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
25 1