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
[容器]
$ docker run -ite --name runoob ubuntu:15.10 //-t: 在新容器内指定一个伪终端或终端。 -i: 允许你对容器内的标准输入 (STDIN) 进行交互。 --name 标识来命名容器,配置名称来与虚拟ip做映射 d 后台运行容器

$ docker pull ubuntu //获取镜像

$ docker ps -a //查看所有的容器命令

$ docker start <容器 ID> //使用 docker start 启动一个已停止的容器:

$ docker stop <容器 ID> //停止容器的命令

$ docker restart <容器 ID> //重启容器的命令

$ docker exec <容器 ID> //在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令 ex:docker exec -it 243c32535da7 /bin/bash

$ docker rm -f <容器 ID> //删除容器使用 docker rm 命令

$ docker port <容器 ID> //可以查看指定(ID 或者名字)容器的某个确定端口映射到宿主机的端口号

$ docker logs -f <容器 ID> //可以查看容器内部的标准输出。 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。

$ docker top <容器 ID> //查看容器内部运行的进程

$ docker inspect <容器 ID> //查看 Docker 的底层信息

[镜像]

$ docker images //本地主机上的镜像

$ docker search httpd //查找镜像

$ docker pull ubuntu:13.10 //拖取镜像

$ docker rmi hello-world //删除镜像

$ docker build -t runoob/centos:6.7 . //-t :指定要创建的目标镜像名 .表示 Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

$ docker tag 860c279d2fec runoob/centos:dev, // 为镜像添加一个新的标签


[容器链接]

$ docker run -d -p 5000:5000 training/webapp python app.py //网络端口映射 -P :是容器内部端口随机映射到主机的高端口。-p : 是容器内部端口绑定到指定的主机端口。

$ docker network create -d bridge test-net //创建一个新的 Docker 网络 -d 参数指定 Docker 网络类型,有 bridge、overlay

$ docker run -itd --name test1 --network test-net ubuntu /bin/bash //运行一个容器并连接到新建的 test-net 网络

$ docker run -itd --name test2 --network test-net ubuntu /bin/bash //运行一个容器并连接到新建的 test-net 网络

[单向通信] (容器创建完成后都会生成一个唯一的ip,这个ip外界不能直接访问,他只用于容器之间进行通信交互用。这就是虚拟ip 容器之间的虚拟ip是互通的)

$ docker run -d --name mytomcat tomcat //创建tomcat容器 --name就是给docker配置名称来与虚拟ip做映射

$ docker run -d --name database -it mysql /bin/bash //创建mysql容器

$ docker inspect <容器 ID> //容器的虚拟ip怎么查 进入mytomcat的容器然后去ping database的ip看看是否通

$ docker exec -it mytomcat /bin/bash
ping 172.17.0.6

[单向通信使用容器昵称]

$ docker rm -f mytomcat //强制删除老的

$ docker run -d --name mytomcat --link database tomcat //创建新的容器,用--link指定我们想连的配置的数据库“域名”

$ docker exec -it mytomcat /bin/bash //进入mytomcat容器

$ ping database

[双向通信]

暂无


[容器间数据共享]

$ docker run -v /home/main/programe:/usr/local/tomcat/webapps tomcat //比如如下:他会把/home/main/programe下面的所有目录都挂载到容器的/usr/local/tomcat/webapps下

[共享容器概念]


$ docker create --name <共享容器名称> -v <宿主机路径>:<容器内挂载路径> 镜像名称 /bin/true

$ docker run --volumes-from <共享容器名称> --name xxx -d <镜像名称>

$ docker create --name webpage -v /home/docker:/usr/local/ tomcat /bin/true //创建共享容器

$ docker run -p 8300:8080 --volumes-from webpage --name t3 -d tomcat //采取共享容器的配置来启动容器

$ docker run -p 8400:8080 --volumes-from webpage --name t4 -d tomcat


[DockerCompose]





[Docker File ]

1.FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

2.RUN:用于执行后面跟着的命令行命令。构建镜像时运行,有以下俩种格式:

Shell 格式:
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令

exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

3.COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径

4.ADD: ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效

5.CMD:类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

1.CMD 在docker run 时运行。RUN 是在 docker build。为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束
2.CMD 指令指定的程序可被 docker run命令行参数中指定要运行的程序所覆盖,即如果容器启动的时候有其他额外的附加指令,则CMD指令不生效
3.如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效

6.ENTRYPOINT:类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
说明:ENTRYPOINT和CMD可以共用,若共用则他会一起合并执行
ENTRYPOINT ["ps"]
CMD ["-ef"]
他给我们合并执行了:ps -ef,这么做的好处在于如果容器启动的时候添加额外指令,CMD会失效,可以理解成我们可以动态的改变CMD内容而不需要重新构建镜像等操作。比如
docker run chentongwei.com/docker-run -aux
结果直接变成了 ps -aux

7.ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量,${xxx}来引用

8.ARG:构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

9.VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。避免重要的数据,因容器重启而丢失,这是非常致命的

10.EXPOSE:声明端口,帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射,在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

11.WORKDIR:指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。docker build 构建镜像过程中的,
每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

12.USER:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

13.HEALTHCHECK:用于指定某个程序或者指令来监控 docker 容器服务的运行状态

14.ONBUILD:用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。
当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
15.MAINTAINER:一般写个人id或组织id
16.LABEL:就是注释,方便阅读的,纯注释说明
17.


[Docker Redis ](开启Redis(修改Redis.conf daemonize为no))

$ docker run -itd --name redis-demo -p:6378:6378 -v /usr/redis-5.0.8/redis.conf:/etc/redis/redis.conf -v /usr/redis-5.0.8/data:/data -d redis redis-server /etc/redis/redis.conf

$ docker exec -it <容器 ID> /bin/bash //进入容器

$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2 //打包提交为新容器 -m: 提交的描述信息 -a: 指定镜像作者 e218edb10161:容器 ID runoob/ubuntu:v2: 指定要创建的目标镜像名

$ docker run -itd runoob/ubuntu:v2 /bin/bash //使用我们的新镜像 runoob/ubuntu 来启动一个容器 使用新镜像(docker images 命令来查看我们的新镜像runoob/ubuntu:v2)


[Docker Mysql ]

$ docker search mysql //查询镜像

$ docker pull mysql //拉取镜像

$ docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql //设置 MySQL 服务 root 用户的密码

$ docker exec -it <容器 ID> /bin/bash //进入镜像

$ mysql -h localhost -u root -p //登录mysql

$ ALTER USER 'root'@'%' IDENTIFIED BY '123456'; //修改Root 不能远程登录

$ CREATE USER 'liaozesong'@'%' IDENTIFIED WITH mysql_native_password BY 'Lzslov123!'; //添加远程登录用户

$ GRANT ALL PRIVILEGES ON *.* TO 'liaozesong'@'%'; //给用户所有权限


[Docker Mongo]

$ docker search mongo //查询镜像

$ docker pull mongo:latest //拉取镜像

$ docker run -itd --name mongo -p 27017:27017 mongo --auth //运行容器

$ docker exec -it mongo mongo admin //进入容器

$ db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]}); //创建一个名为 admin,密码为 123456 的用户。

$ db.auth('admin', '123456')

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

提示:

Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大 以 && 符号连接命令,这样执行后,只会创建 1 层镜像]

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz