前言:
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搞的。
原文: 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。 写多了没用。