forked from guoxuce/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1-docker
268 lines (197 loc) · 11.7 KB
/
1-docker
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
容器虚拟化,轻量, 以进程形式存在
2013年出现
redhat 6.5开始支持
go语言开发,Apache2.0协议
github维护
首先,在开发主机上构建容器A,构建方法既可以是手工构建,也可以通过Dockerfile自动构建。
容器A的构建必须基于一个已有的基础镜像,并在它之上执行一系列操作。
镜像A是容器的静态形式,容器是镜像的运行态。
将容器A保存为镜像A,然后推送到Docker库中进行共享。
这时候,在产品部署方面,另一端则可以通过在Docker库中搜索来获得镜像A,并将其拉取到本地,
最后在产品集群中运行容器A,其中产品集群中一般会同时运行很多容器,
例如容器B和容器C等,而这些容器互不影响,相互隔离。
优势:
启动非常快,秒级实现
资源利用率高,一台机器可以跑上千docker容器
更快的交付和部署,创建后任意地方运行
内核级别的虚拟化,性能更高,
容易迁移,平台依赖性不强
概念:
镜像:只读模板,类似iso文件,用于部署, 类似操作系统
容器:可以启动,开始,停止,删除等,每个容器都是隔离的 类似虚拟机本身
仓库:存放镜像的一个场所,公开仓库和私有仓库
最大的公开仓库Docker hub hub.docker.com
国内公开仓库dockerpool.com
注意:
在容器中查看内核版本,显示的是宿主机的版本
centos6:
安装:
yum install -y epel-release
yum install -y docker-io
启动
/etc/init.d/docker start
centos7:
安装:
yum install -y docker
启动:
systemctl start docker
镜像管理
docker images:列出本地所有镜像
docker search <IMAGE_ID/NAME>:查找image
docker tag centos centos1:new_centos 为centos镜像设置名字为centos1,标签为new_centos,会有两行
docker pull <IMAGE_ID>:下载image
docker push <IMAGE_ID>:上传image
docker rmi <IMAGE_ID>:删除image
docker rmi `docker images -q -a`
使用镜像开启容器 docker run -it IMAGE /bin/bash
使用容器生成镜像 dockek commit -m 'centos_with_net' -a 'xuce' CONTAINER_ID centos_net
docker commit -m "comment" -a "author" <CONTAINER_ID> ouruser/imagename:tag
使用本地模板生成镜像 cat centos.tar | docker import - image_name (本地模板从openvz上下载)
cat centos.tar.gz | docker import - centos-6-x86(镜像的name)
将镜像导出为文件 docker save -o centos.tar IMAGE
docker save -o centos_with_net.tar container_id/name 导出为模板(当前目录)
将镜像导出的文件重新加载为镜像 docker load -i (--input) centos.tar
docker load < centos.tar
docker load -i/--input centos_with_net_name.tar
docker load < centos_with_net_name.tar (导入后没有名字)(使用tag改名)
docker push image_name 上传到dockerhub官网
容器管理
docker create -it imagename
docker start <CONTAINER_ID>:重新启动container
docker run -i -t <IMAGE_ID> /bin/bash:-i:标准输入给容器 -t:分配一个虚拟终端 /bin/bash:执行bash脚本
-d:以守护进程方式运行(后台)
-P:默认匹配docker容器的5000端口号到宿主机的49153 to 65535端口
-p <HOT_PORT>:<CONTAINER_PORT>:指定端口号
--name: 指定容器的名称
--rm:退出时删除容器
docker exec -it <CONTAINER> <COMMAND>:在容器里执行命令,并输出结果
docker exec -it container_id /bin/bash 进入开启的容器
docker attach <CONTAINER_ID> 连接到启动的容器,一旦退出,容器也停止
docker stop <CONTAINER_ID>:停止container
docker ps - Lists containers.
-l:显示最后启动的容器
-a:同时显示停止的容器,默认只显示启动状态
docker ps -a
docker logs <CONTAINER_ID> : 输出容器日志(正在运行的才可以)
-f:实时输出
docker rm <CONTAINER_ID>:删除container(删除正在运行的加上-f)
docker rm `docker ps -a -q`:删除所有容器
docker export container_id > xuce_centos.tar 将容器导出为文件,实现容器的迁移
cat centos.tar | docker import - centos-6-x86(镜像的name) 将容器导出的文件恢复到镜像
docker cp <CONTAINER_ID>:path hostpath:复制容器内的文件到宿主机目录上
docker kill `docker ps -q`
docker wait <CONTAINER_ID>:阻塞对容器的其他调用方法,直到容器停止后退出
docker top <CONTAINER_ID>:查看容器中运行的进程
docker diff <CONTAINER_ID>:查看容器中的变化
docker inspect <CONTAINER_ID>:查看容器详细信息(输出为Json)
-f:查找特定信息,如docker inspect -f '{{ .NetworkSettings.IPAddress }}'
仓库管理
docker pull registry 下载registry镜像,可以用来创建本地的docker私有仓库
docker run -d -p 5000:5000 registry 开启容器,监听5000端口 -p端口映射
telnet 127.0.0.1 5000
curl 127.0.0.1:5000
docker tag busybox 192.168.153.129:5000/busybox5000 给镜像打上tag才能上传到本地仓库
报错:
Error response from daemon: invalid registry endpoint https://192.168.153.129:5000/v0/: unable to ping registry
endpoint https://192.168.153.129:5000/v0/
v2 ping attempt failed with error: Get https://192.168.153.129:5000/v2/: tls: oversized record received with length 20527
v1 ping attempt failed with error: Get https://192.168.153.129:5000/v1/_ping: tls: oversized record received with length 20527.
If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry
192.168.153.129:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate,
no need for the flag; simply place the CA certificate at /etc/docker/certs.d/192.168.153.129:5000/ca.crt
vim /etc/init.d/docker
修改
$exec -d $other_args &>> $logfile &
为
$exec -d --insecure-registry 192.168.153.129:5000 $other_args &>> $logfile &
重启
/etc/init.d/docker restart
开启容器 registry
再上传 docker push 192.168.153.129:5000/busybox5000
查看本地仓库有哪些镜像 curl http://192.168.153.129:5000/v1/search
数据管理:
1.挂载本地目录到容器里,将数据保存在本地目录
docker run -itd -v /data/:/data1 aming bash
//-v 用来指定挂载目录, :前面的/data/为本地目录,后面的/data1为容器里的目录
2.挂载数据卷,创建新容器的时候,使用旧的数据卷。
docker run -itd --volumes-from loving_kowa xuce/centos bash
3.定义数据卷容器
类似NFS,搭建一个专门的数据卷容器,其他容器直接挂载该数据卷,
首先建立数据卷容器,
docker run -itd -v /data/ --name testvol xuce/centos bash
//注意这里的/data/ 是容器的/data目录,并非本地的/data/目录,
然后让其他容器挂载该数据卷
docker run -itd --volumes-from testvol xuce bash
数据卷的备份和恢复
备份:首先使用testvol数据卷新开一个容器,同时把本地的/vol_data_backup目录挂载到该容器下的
/backup目录下,这样就可以在本地的/vol_data_backup目录里查看新容器的/backup目录里的文件,
然后再把/data目录下的文件打包成data.tar放到/backup目录下,在本地就得到了备份
mkdir /vol_data_backup
docker run --volumes-from testvol -v /vol_data_backup:/backup aming/centos tar cvf /backup/data.tar /data/
恢复
先新建一个数据卷容器,再建一个新的容器,并挂载该数据卷容器,然后再把tar包解包。
新建数据卷容器:docker run -itd -v /data/ --name testvol2 aming/centos bash
挂载数据卷新建容器,并解包:docker run --volumes-from testvol2 -v /vol_data_backup/:/backup aming/centos tar xvf /backup/data.tar
网络管理
host模式:使用docker run 时使用--net=host指定,
docker使用的网络实际上和宿主机一样,在容器内看到的网卡IP是宿主机上的IP,
对宿主机IP的复用
container模式:使用--net=container:container_id/container_name
多个容器使用共同的网络,看到的ip是一样的
none模式:使用--net=none指定
这种模式下,不会配置任何网络
bridge模式:使用--net=bridge指定
默认模式,为每个容器分配一个独立的network namespace .
类似VMware的nat网络模式,同一个宿主机上的所有容器会在同一个网段,相互之间可以通信
外部访问容器
首先使用centos镜像新建一个容器,然后再该容器中安装httpd服务,并启动
再把该容器导出成一个新的镜像(centos-httpd)然后再使用新镜像创建容器,并指定端口映射
docker run -itd -p 5123:80 centos-httpd bash
//-p 可以指定端口映射,本例中将容器的80端口映射为本机的5123端口
docker exec -ut container_id bash
启动httpd
编辑页面
在本机测试 curl 127.0.0.1:5123/1.html
-p后面也支持ip:port:port 格式 ,如 -p 127.0.0.1:8080:80
也可以不写本地的端口,只写ip,这样会随意分配一个端口
-p 127.0.0.1::80
容器互联
使用容器别名即可
docker run -itd -p 13306:3306 --name db centos6_with_mysql
docker run -itd -p 18080:8080 --name web --link db:db_httpd centos_with_httpd
env可以在web上查看db信息
docker login:登录
网络管理
docker run -P:随机分配端口号
docker run -p 5000:5000:绑定特定端口号(主机的所有网络接口的5000端口均绑定容器的5000端口)
docker run -p 127.0.0.1:5000:5000:绑定主机的特定接口的端口号
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py:绑定udp端口号
docker port <CONTAINER_ID> 5000:查看容器的5000端口对应本地机器的IP和端口号
使用Docker Linking连接容器:
Docker为源容器和接收容器创建一个安全的通道,容器之间不需要暴露端口,接收的容器可以访问源容器的数据
docker run -d -P --name <CONTAINER_NAME> --link <CONTAINER_NAME_TO_LINK>:<ALIAS>
数据管理
Data Volumes:volume是在一个或多个容器里指定的特殊目录
数据卷可以在容器间共享和重复使用
可以直接修改容器卷的数据
容器卷里的数据不会被包含到镜像中
容器卷保持到没有容器再使用它
可以在容器启动的时候添加-v参数指定容器卷,也可以在Dockerfile里用VOLUMN命令添加
docker run -d -P --name web -v /webapp training/webapp python app.py
也可以将容器卷挂载到宿主机目录或宿主机的文件上,<容器目录或文件>的内容会被替换为<宿主机目录或文件>的内容,
默认容器对这个目录有可读写权限
docker run -d -P --name web -v <宿主机目录>:<容器目录> training/webapp python app.py
可以通过指定ro,将权限改为只读
docker run -d -P --name web -v <宿主机目录>:<容器目录>:ro training/webapp python app.py
在一个容器创建容器卷后,其他容器便可以通过--volumes-from共享这个容器卷数据,如下:
docker run -d -v /dbdata --name db1 training/postgres echo Data-only container for postgres
首先启动了一个容器,并为这个容器增加一个数据卷/dbdata,然后启动另一个容器,共享这个数据卷
docker run -d --volumes-from db1 --name db2 training/postgres
此时db2使用了db1的容器卷,当容器db1被删除时,容器卷也不会被删除,只有所有容器不再使用此容器卷时,才会被删除
docker rm -v:删除容器卷
除了共享数据外,容器卷另一个作用是用来备份、恢复和迁移数据
docker run --volumes-from db1 -v /home/backup:/backup ubuntu tar cvf /backup/backup.tar /dbdata
启动一个容器数据卷使用db1容器的数据卷,同时新建立一个数据卷指向宿主机目录/home/backup,将/dbdata目录的数据压缩为/backup/backup.tar
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
docker run --volumes-from dbdata2 -v /home/backup:/backup busybox tar xvf /backup/backup.tar
启动一个容器,同时把backup.tar的内容解压到容器的backup