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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
opsnotes 写了好多基础篇
docker 
http: / / opsnotes.net / 2015 / 07 / 06 / docker_install /
牛刀小试之docker安装部署
docker pull ubuntu: 12.04
docker pull dl.dockerpool.com: 5000 / ubuntu: 12.04
docker run  - - i ubuntu: 12.04  / bin / bash
docker images
docker run ubuntu: 12.04  / bin / echo  "hello world"
docker ps a
docker export  7582b0eaf376  > ubuntu.tar
cat ubuntu.tar | docker  import  -  test / buntu:v1. 0
docker rmi test / buntu:v1. 0
docker search centos
docker pull centos
牛刀小试之docker镜像相关配置
docker pull ubuntu: 12.10
如上命令相当于docker pull registry.hub.docker.com / ubuntu:latest.是从docker默认的服务器下载latest镜像
也可以从dockerpool地方下载镜像
docker run  - - i ubuntu  / bin / bash
docker inspect  6d4946999d4f
docker search mysql
可以看到很多关键字的镜像 包括名字 描述 和镜像的使用欢迎度 是否官方创建,感觉是不是有点像github
- - automated = false 只显示自动创建的镜像
- - no - trunc = false 输出信息不截断显示
- s,  - - stars = 0  显示指定星级的镜像
使用  - f 可以强制删除,但是需要注意的是,强制删除会造成一些相关遗留的问题
docker run  - ti ubuntu: 14.04  / bin / bash
docker commit  - 'added a new file'  - 'docker Steven'  c72ad6c5adcd test
docker images test
牛刀小试之docker容器增加删除
docker create  - it ubuntu:latest
启动容器有两种方式
1. 基于镜像新建一个容器并且启动
2. 把在终止的状态容器重新启动
docker run 相当于 docker create  +  docker start
docker run ubuntu  / bin / echo  "hello world"
登陆到交互式模式下面,
- t   让docker分配一个伪终端,并绑定到容器的标准输出上
- i   让容器的标准输出打开
可以是用crtl + d 或者exit退出,需要注意的是,退出意味着终止
docker run  - ti ubuntu: 14.04  / bin / bash
有时候为了业务方便可以使用” - d“参数来后台启动
docker run  - d ubuntu  / bin / bash  - "while true; do echo Hello world; sleep 1; done"
docker logs  6aa  连接的 ID
docker ps  - - q
docker restart  6aa  会将运行的容器终止,然后再重新启动它
docker rm  - 436efb7b9933  0aced9db36e2  b89ee17998ec
牛刀小试之docker基于容器备份与恢复之export  import
docker export a457 > test_for_run.tar
cat test_for_run.tar | docker  import  -  test / ubuntu:v1. 0
docker images test / ubuntu
建议在上传环境中 因容器是轻量级的,建议可以做成HA 这样就可以防止单点故障。在容器故障的时候,可以快速的切换到其他的容器
牛刀小试之docker容器的连接方式
docker run  - idt ubuntu
docker  1.3  版本之后自带命令,可以在容器直接运行命令,启动一个bash,
exec 工具相对比较简单
docker  exec  - ti  7d3d35cb9c40  / bin / bash
nsenter工具安装使用
把如下内容复制到“ / usr / local / bin / docker - enter”下面。
[root@test - devops ~] # cat /usr/local/bin/docker-enter
#!/bin/sh
 
if  - e $(dirname  "$0" ) / nsenter ]; then
     # with boot2docker, nsenter is not in the PATH but it is in the same folder
     NSENTER = $(dirname  "$0" ) / nsenter
else
     NSENTER = nsenter
fi
 
if  - "$1"  ]; then
     echo  "Usage: `basename " $ 0 "` CONTAINER [COMMAND [ARG]...]"
     echo ""
     echo  "Enters the Docker CONTAINER and executes the specified COMMAND."
     echo  "If COMMAND is not specified, runs an interactive shell in CONTAINER."
else
     PID = $(docker inspect  - - format  "u" { %  raw  % } "``.`State`.`Pid`"  "$1" #可以去掉u"{% raw %}"
     if  - "$PID"  ]; then
         exit  1
     fi
     shift
 
     OPTS = "--target $PID --mount --uts --ipc --net --pid --"
 
     if  - "$1"  ]; then
         # No command given.
         # Use su to clear all host environment variables except for TERM,
         # initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
         # and start a login shell.
         "$NSENTER"  $OPTS su  -  root
     else
         # Use env to clear all host environment variables.
         "$NSENTER"  $OPTS env  - - ignore - environment  - -  "$@"
     fi
fi
chmod  + / usr / local / bin / docker - enter
docker run  - idt ubuntu
docker - enter a457769fdd92
牛刀小试之docker数据卷容器共享
数据卷可以在容器之间共享和重用  
对数据卷的修改会立马生效  
对数据卷的更新不会影响镜像  
卷会一直存在,直到没有容器使用
在docker run 启动的时候 可以加 - v参数来创建一个容器卷。注意多次创建可以使用 - v标记多个数据卷
docker run  - - - - name web  - / webapp training / webapp echo  "hello world"
本地硬盘挂载
docker run  - - - - name web  - / srv / webapp: / opt / webapp /  training / webapp echo  "hello world"
本地硬盘挂载一个只读的  - ro参数
[root@docker ~] # docker run -d -P --name web -v /srv/webapp:/opt/webapp/:ro training/webapp echo "hello test"
挂载一个本地主机文件作为数据卷,建议一般不要挂载一个文件
[root@docker ~] # docker run --rm -it -v ~/.bash_history:/.bash_history centos:6 /bin/bash
实战案例: 数据卷容器
场景:
     如果用户需要在容器之间共享一些持续更新的数据,最简单的办法就是使用数据卷容器。数据卷容器就是一个普通的容器。专门用它提供数据卷供其他容器挂载使用。
优点:
    使用数据卷容器可以让用户在容器之间自由的升级和移动数据卷。
mkdir  / dbdata
docker run  - it  - / dbdata /  - - name dbdata centos: 6
docker run  - it  - - volumes - from  dbdata  - - name db1 centos: 6
exit
docker run  - it  - - volumes - from  dbdata  - - name db2 centos: 6
exit
启动容器
docker start   96513f616aa4   98a6cca3fee3   a85c2ed8df59
使用docker - enter 登陆到db1 在dbdata下面创建一个目录uptime
在其他两台机器查看
使用dockerfile创建基于ubuntu的ssh容器
touch Dockerfile run.sh
cat run.sh
#!/bin/bash
chmod  400  authorized_keys
编写dockerFile
[root@test - devops sshd_ubuntu] # cat Dockerfile
# 继承的镜像
FROM ubuntu: 14.04
 
# 作者信息
MAINTAINER  from  steven (www.opsnotes.net)
 
# 安装SSH服务和VIM服务
RUN apt - get install  - y openssh - server vim
RUN mkdir  - / var / run / sshd
RUN mkdir  - / root / .ssh
RUN echo  'root:123qwer'  |chpasswd
RUN sed  - "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g"  / etc / ssh / sshd_config
RUN sed  - "s/UsePAM.*/UsePAM no/g"  / etc / ssh / sshd_config
RUN sed  - 's/^PermitRootLogin without-password/PermitRootLogin yes/g'  / etc / ssh / sshd_config
 
# 取消PAM限制
RUN sed  - '/pam_loginuid.so/c session    optional     pam_loginuid.so'   / etc / pam.d / sshd
 
# 复制文件,给脚本可执行权限
ADD authorized_keys  / root / .ssh / authorized_keys
ADD run.sh  / run.sh
RUN chmod  + / run.sh
 
# 设置开放端口
EXPOSE  22
 
# 设置自动开启命令
CMD [ "/run.sh" ]
创建镜像
docker build  - t sshd:dockerfile .
测试镜像,运行容器
docker run  - - 10122 : 22  sshd:dockerfile
netstat  - tlnp
登陆
ssh  - 10122  root@ 121.41 . 118.184
docker commit 创建基于ubuntu的ssh镜像
docker run  - it ubuntu: 14.04  / bin / bash
vi  / root / .ssh / authorized_keys  客户端的公钥放到里面,那台机器需要登陆就需要登陆的public放到里面
docker commit fb0 ubuntu_sshd: 14.04
启动镜像,本地的 10022 端口绑定到docker容器的 22 端口
docker run  - 10022 : 22  - d ubuntu_sshd: 14.04  / ssh.sh
ssh  - 10022  root@ 121.41 . 118.184
使用dockerfile创建基于centos的ssh容器
打包的镜像需要支持SSH key和密码登录
编写Dockerfile文件
[root@test - devops sshd_centos] # cat Dockerfile
# 继承的镜像
FROM centos: 6
 
# 作者信息
MAINTAINER  steven <www.opsnotes.net>
 
# 安装SSH服务和VIM服务
RUN yum install  - y openssh - server openssh - clients vim
RUN mkdir  - / root / .ssh /
ADD authorized_keys  / root / .ssh / authorized_keys
RUN ssh - keygen  - / etc / ssh / ssh_host_rsa_key
RUN ssh - keygen  - t dsa  - / etc / ssh / ssh_host_dsa_key
RUN echo  'root:123qwer'  |chpasswd
 
RUN sed  - "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g"  / etc / ssh / sshd_config
RUN sed  - "s/UsePAM.*/UsePAM no/g"  / etc / ssh / sshd_config
 
# 取消PAM限制
RUN sed  - '/pam_loginuid.so/c session    optional     pam_loginuid.so'   / etc / pam.d / sshd
 
# 复制文件,给脚本可执行权限
ADD run.sh  / run.sh
RUN chmod  + / run.sh
 
# 设置开放端口
EXPOSE  22
 
# 设置自动开启命令
CMD [ "/run.sh" ]
docker build  - 'sshd/centos62'  .
查看镜像是否创建成功
[root@test - devops sshd_centos] # docker images
启动docker容器
[root@test - devops sshd_centos] # docker run -d -p 10125:22 sshd/centos62
测试,可以测试key登录以及密码登录
ssh  - 10125  root@ 121.41 . 118.184
zhangkeyuan@opsnotes:~  ssh  - 10125  root@ 121.41 . 118.184
docker容器ubuntu安装apache + php
[root@test - devops apache_ubuntu] # pwd
 
/ home / docker / apache_ubuntu
 
[root@test - devops apache_ubuntu] # tree
 
.
 
├── Dockerfile
 
├── run.sh
 
└── sample
 
     ├── index.html
 
     └── index.php
[root@test - devops apache_ubuntu] # cat Dockerfile
 
# 继承的镜像
 
FROM sshd / ubuntu
 
# 作者信息
 
MAINTAINER  from  steven (www.opsnotes.net)
 
# set env
ENV DEBIAN_FRONTEND noninteractive
 
 
# install
 
#RUN apt-get -yq install apache2 && rm -rf /var/lib/apt/lists/*
 
RUN apt - get update && apt - get  - y install apache2 php5 php5 - cli libapache2 - mod - php5 php5 - gd php5 - json php5 - ldap php5 - mysql php5 - pgsql
 
#RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
 
 
# add scripts
 
ADD run.sh  / run.sh
 
RUN chmod  + / * .sh
 
# add web site
 
RUN rm  - rf  / var / www / html / *
 
COPY sample /  / var / www / html /
 
 
# set apache env
 
ENV APACHE_RUN_USER www - data
 
ENV APACHE_RUN_GROUP www - data
 
ENV APACHE_LOG_DIR  / var / log / apache2
 
ENV APACHE_PID_FILE  / var / run / apache2.pid
 
ENV APACHE_RUN_DIR  / var / run / apache2
 
ENV APACHE_LOCK_DIR  / var / lock / apache2
 
ENV APACHE_SERVERADMIN admin@opsnotes.net
 
ENV APACHE_SERVERNAME localhost
 
ENV APACHE_SERVERALIAS docker.localhost
 
ENV APACHE_DOCUMENTROOT  / var / www
 
EXPOSE  80
 
CMD [ "/run.sh" ]
[root@test - devops apache_ubuntu] # cat run.sh
 
#!/bin/bash
 
/ usr / sbin / sshd &  / usr / sbin / apache2ctl  - D FOREGROUND
[root@test - devops apache_ubuntu] # cat sample/index.html sample/index.php
 
Hello docker  for  apache2
 
<?php
 
   phpinfo();
 
?>
docker build  - t apache / ubuntu .
允许DOCKER镜像指定端口以及映射
docker run  - - 10122 : 22  - 888 : 80  apache / ubuntu
docker - enter fbe
logout
docker - 创建nginx镜像  
[root@test - devops nginx_ubuntu] # tree
 
.
 
├── Dockerfile
 
└── run.sh
[root@test - devops nginx_ubuntu] # cat Dockerfile
 
# 继承的镜像
 
FROM sshd / ubuntu
 
 
 
# 作者信息
 
MAINTAINER  from  steven (www.opsnotes.net)
 
 
 
# install
 
RUN apt - get install  - y nginx
 
RUN sed  - 's/listen \[\:\:\]:80 default_server ipv6only=on;/#listen \[\:\:\]:80 default_server ipv6only=on;/g'  / etc / nginx / sites - enabled / default
 
RUN echo  "\ndaemon off;"  >>  / etc / nginx / nginx.conf
 
 
 
# add scripts
 
ADD run.sh  / run.sh
 
RUN chmod  + / * .sh
 
 
 
WORKDIR  / etc / nginx
 
 
 
# Expose ports.
 
EXPOSE  80
 
 
 
# Define default command.
 
CMD [ "/run.sh" ]
[root@test - devops nginx_ubuntu] # cat  run.sh
 
#!/bin/bash
 
/ usr / sbin / sshd &  / usr / sbin / nginx
docker build  - t nginx / ubuntu .



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