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
bash复制代码一、docker的三要素
1.镜像image       就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多容器
2.容器container   docker利用容器独立运行一个或一组应用。容器是用镜像创建的运行实列,可以把容器看做是一个简易版的linux环境。
3.仓库repository  是集中存放镜像文件的场所,最大的公开仓库是Docker Hub(https://hub.docker.com/)


二、配置阿里云镜像加速器。https://cr.console.aliyun.com/cn-hangzhou/mirrors(自己的淘宝账号即可登录)
1.对于已创建的Docker Machine实例,更换镜像源的方法如下
在windows命令行执行docker-machine ssh default 进入default的 VM bash
sudo vi /var/lib/boot2docker/profile
在--label provider=virtualbox的下一行添加 --registry-mirror https://6wicrzn3.mirror.aliyuncs.com (注:这个换成自己专属的加速器地址)
重启docker服务:sudo /etc/init.d/docker restart或者重启VM:exit退出VM bash,在windows命令行中执行docker-machine restart

2.创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。(注:需要换成自己专属的加速器地址)
docker-machine create --engine-registry-mirror=https://6wicrzn3.mirror.aliyuncs.com -d virtualbox default

3.镜像的帮助命令
docker info;docker version;docker --help


三、docker镜像命令
(1).docker images(列出本地主机上的镜像)
REPOSITORY      TAG        IMAGE ID        CREATED        SIZE
hello-world     latest     2cb0d9787c4d    2 weeks ago    1.85kB
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个TAG,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG来定义不同的镜像
如果你不指定一个镜像的版本标签,例如你只使用ubuntu,docker将默认使用ubuntu:latest镜像

1.1 docker images -a 列出本地主机上的镜像(含中间映像层)
1.2 docker images -q 只显示镜像ID
1.3 docker images --digests 显示镜像的摘要信息
1.4 docker images --no-trunc 显示镜像的完整信息

(2).docker search(查询某个镜像)
网站:https://hub.docker.com
2.1 docker search 镜像名
2.2 docker search -s 30 镜像名 (点赞数超过30)
2.3 docker search --no-trunc 显示镜像的完整描述
2.4 docker search --automated 只列出automated build类型的镜像

(3).docker pull(拉取镜像:[TAG])

(4).docker rmi(删除镜像:[TAG])
4.1 docker rmi  镜像名|镜像id
4.2 docker rmi -f  镜像名|镜像id (强制删除)
4.3 docker rmi -f  镜像名|镜像id 镜像名|镜像id(删除多个,中间以空格隔开)
4.4 docker rmi -f $(docker images -qa) 删除所有镜像


四、docker容器命令
(1)容器启动
docker run -it 镜像名|镜像id --name 重新命名
--name="容器新名字",为容器指定一个名称
-d:后台运行容器,并返回容器id,也即启动守护式容器
-i:以交互模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-P:随机端口映射
-p:指定端口映射,有4种格式:
ip:hostPort:containerPort;ip::containerPort;
hostPort:containerPort;containerPort

(2)列出所有正在运行的容器
docker ps -a|-l|-n 3|-q
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:静默模式,只显示容器编号
-no-trunc:不截断输出

(3)退出容器
exit  关闭并离开容器
ctrl+p q 离开容器  --> 再进入 docker attach 容器id|容器名

(4)重启容器
docker restart 容器id|容器名

(5)关闭容器
docker stop 容器id|容器名

(6)强制停止容器
docker kill 容器id|容器名

(7)删除已停止容器
docker rm 容器id|容器名
docker rm -f 容器id|容器名
docker rm -f $(docker ps -qa) 或 docker ps -qa | xargs docker rm

(四.1)容器命令重要。
启动守护式容器命令:docker run -d 容器id|容器名,但是docker ps查不到了
这说明:docker容器后台运行,就必须有一个前台进程,容器以后台进程模式运行,
就导致了docker前台没有运行的应用,后台会立即自杀,因为他觉得他没用。所以
最佳的方案是,将运行的程序以前台进程的形式运行。
(以下命令,会不停的输出llsydn,所以这个容器不会自杀)
docker run -d 容器id /bin/sh -c "while true; do echo hello llsydn; sleep 2; done"

查看容器日志:docker logs -f -t --tail 容器id
-f 跟随最新的日志打印(会不停的追加)
-t 加入时间戳
--tail 数字 显示最后多少条

查看容器内运行的进程:docker top 容器id

查看容器内部细节:docker inspect 容器id

重新进入容器:docker attach 容器id (直接进入容器启动命令的终端,不会启动新的进程)
             docker exec 容器id(直接进入容器启动命令的终端,并且可以启动新的进程)
             docker exec -it 容器id ls -l /tmp
             docker exec -it 容器id

从容器内拷贝文件到主机上:docker cp 容器id:容器内路径 目的主机路径
                        docker cp 229d3f057e13:/tmp/yum.log /root


五、Docker镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的
软件,他包含运行某个软件所需的所有内容,包含代码、运行时、库、环境变量和配置文件

(1)UnionFS联合文件系统,Docker镜像加载,分层的镜像

(2)特点:只读;当容器启动,一个新的可写层被加载到镜像的顶部。

(3)docker commit操作。
docker commit 提交容器副本使之成为一个新的镜像。
docker commit -m="描述信息" -a="作者" 容器id 镜像名:[标签名]

docker run -it -p 8888:8080 tomcat(在docker的8080端口启动tomcat,暴露的端口8888)
docker run -it -P tomcat(随机暴露端口)


六、Docker容器数据卷。
容器的持久化,容器间继承+共享数据
(1)容器内添加数据卷。(主机和容器数据的共享)
直接命令添加,docker run -it -v /宿主机绝对路径目录:容器内目录 镜像名
            docker run -it -v /dataVolumeMain:/dataVolumeContainer centos
            使用docker inspect 容器id,可以查看到 "HostConfig": {
                                                    "Binds": [
                                                        "/dataVolumeMain:/dataVolumeContainer"
                                                    ],
                                                 }
            这样的话,在容器里面的dataVolumeContainer目录下,有创建新的文件,
            在主机的dataVolumeMain目录下,也会有的,修改也会同步。容器停止了,主机修改了文件,还是会同步的
            docker run -it -v /dataVolumeMain:/dataVolumeContainer:ro centos (加了ro表示只读)

(2)DockerFile添加数据卷。
vim Dockerfile

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,---------success"
CMD /bin/bash

docker build -f dockerfile文件的路径 -t 镜像名字:[TAG] . (注意最后有个点)


七、Dockerfile解析
Dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤:编写Dockerfile文件 ==> docker build ==> docker run
Dockerfile是软件的原材料;Docker镜像是软件的交付品,Docker容器则可以认为是软件的运行态

(1)docker内容基础知识:
1.每条保留字指令必须为大写字母且后面要跟随至少一个参数
2.指令按照从上到下,顺序执行
3.#表示注释
4.每条指令都会创建一个新的镜像层,并对镜像进行提交

(2)docker执行Dockerfile的大致流程:
1.docker从基础镜像运行一个容器
2.执行一条指令并对容器作出修改
3.执行类似docker commit的操作提交一个新的镜像层
4.docker再基于刚提交的镜像运行一个新容器
5.执行dockerfile中下一条指令直到所有指令都执行完成

(3)Dockerfile保留字指令:
1.FROM 基础镜像,当前镜像是基于哪个镜像
2.MAINTAINER 镜像维护者的姓名和邮箱地址
3.RUN 容器构建时需要运行的命令
4.EXPOSE 当前容器对外暴露的端口
5.WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
6.ENV 用来构建镜像过程中设置环境变量
7.ADD 将宿主机目录下的文件拷贝进镜像且ADD命令自动处理URL和解压tar压缩包
8.COPY 类似ADD,但不能自动处理URL和解压tar压缩包
9.VOLUME 容器数据卷,用于数据保存和持久化工作
10.CMD 指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
11.ENTRYPOINT 指定一个容器启动时要运行的命令,但这个指令不会替换,只是在后面拼接
12.ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

(4)Docker安装mysql
1.下载
docker pull docker
2.运行
docker run -p 12345:3306 --name mysql -v /mysql/conf:/etc/mysql/conf.d -v /mysql/logs:/logs -e MYSQL_ROOT_PASSWORD=123456 -d mysql

(5)Docker安装redis
1.下载
docker pull redis
2.运行
docker run -p 6379:6379 --name redis -v /redis/data:/data -v /redis/conf:/usr/local/etc/redis/redis.conf -d redis redis-server /user/local/etc/redis/redis.conf --appendonly yes
3.启动客户端
docker exec -it 容器id redis-cli

(6)自定义的tomcat9的Dockerfile
FROM centos
MAINTAINER llsydn 1091391667@qq.com
#把java与tomcat添加到容器中
ADD jdk-linux-x64.tar.gz /usr/local/
ADD apache-tomcat.tar.gz /usr/local/
#安装vim编辑器
RUM yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local/
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_BASE/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out


八、Docker本地镜像推送到阿里云
1.在阿里云开发者平台,创建仓库。(命令空间,仓库名称)
https://cr.console.aliyun.com/cn-hangzhou/repositories

2.将镜像推送到阿里云仓库Registry
docker login --username=13543844606li registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/llsydn/mycentos:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/llsydn/mycentos:[镜像版本号]

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%