docker使用入门文档

Linux下的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 开、关docker-desktop(非必要,因为docker-desktop集成了docker服务)
systemctl --user start docker-desktop # 启动docker-desktop
systemctl --user enable docker-desktop # 开启自动启动
systemctl --user stop docker-desktop # 关闭docker-desktop

# 开、关docker(docker服务必须开启)
systemctl start docker # 启动docker服务
service docker start # 效果同上
systemctl stop docker # 停止docker服务
service docker stop # 效果同上
systemctl restart docker # 重启docker服务
service docker restart # 效果同上
# docker服务状态
systemctl status docker # 查看docker服务状态

# 系统日志
journalctl -xe # 查看系统日志
# -x 相关目录(如:问题相关的网址)
# -e`从结尾开始看(默认从正序从开头看)
# -r 倒序查看(默认从正序从开头看)

Window下的命令

windows下的docker服务需要运行docker-desktop

1
2
# 查看
wsl -l -v # 查看所有linux子系统的执行状态和版本

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
# 1.版本
docker compose version
docker --version
docker version

# 2.镜像
docker images # 查看所有镜像文件
docker images -a # 或者--all,显示所有镜像文件
docker images -q # 或者--quit,仅显示镜像id

# 3.搜索
docker search 镜像地址名称 [--filter=STARS=3000] # 搜索镜像[搜索出来的镜像就是stars大于3000的]

# 4.拉取
docker pull镜像的仓库源[:tag] # 下载镜像(不指定tag时为latest版本)

# 5.删除镜像
docker rmi -f 镜像id # 删除指定的镜像
docker rmi -f 镜像id 镜像id 镜像id # 删除多个镜像(空格分隔)
docker rmi -f $(docker images -aq) # 删除全部的镜像


------------ 容器 ------------


# 1.创建、启动
docker run [可选参数] 镜像id|镜像名[:tag] [command [args]] # 选择一个镜像,先创建一个容器,再启动该容器(容器运行后可选择执行命令) ★启动的运行方式一经确定,便不可更改(守护模式还是交互模式只能在run时候确定(即使停止了重启也不会改变))
# --name="名字" 指定容器的名称

# -d ★后台方式运行该容器(是守护模式,执行exit后,不会终止容器)(最后不要加上/bin/bash),生成的守护程序是sshd-D(该程序通过docker attach连接时是不可以输入的)
# -it ★使用交互方式运行,并创建一个伪终端,查看容器内容(是交互模式,执行exit后会终止容器)(此时命令最后最好加上/bin/bash),生成的程序是可以交互的bash(该程序通过docker attach连接时是可以输入的)

# -p ip:主机端口:容器端口 配置主机端口映射到容器端口
# -p 主机端口:容器端口 配置主机端口映射到容器端口
# -p 容器端口 配置主机端口映射到容器端口
# -P 大写P,随机分配一个主机的端口
## 例
docker run -d 镜像名 # 后台启动
curl localhost:主机端口 # 容器运行后,本机测试访问

# 2.退出
exit # 容器中有终端未关闭,则退出时仅关闭容器中的终端,不关闭容器;否则退出时,容器也将终止(如果当前是docker attach连接的终端,则退出的是初始终端,所以会将容器也终止)
CTRL+P后CTRL+Q # 不关闭容器中的终端退出容器(容器中的终端不关闭,因此容器也不关闭),仅仅是断开与当前的终端的连接
CTRL+D # 效果同 CTRL+P 后 CTRL+Q

# 3.列表
docker ps # 当前正在运行的容器
# -a # 所有容器的信息
# -n=? # 最近创建的n个容器(default -1)
# -q # 仅显示容器id
# -s # 总文件大小

# 4.删除
docker rm 容器id # 删除容器(只有删除容器,数据才会删除)
docker rm -f $(docker ps -aq) # 删除所有容器
docker ps -a -q | xrags docker rm # 删除所有容器(竖线表示前面的结果作为后面的输入)

# 5.启动
docker start 容器id # 启动已经停止的容器(区别于docker run)
docker restart 容器id # 重启
docker stop 容器id # 停止
docker kill 容器id # 强制停止

# 5.进容器
docker exec [options] container command [args] # 进入正在运行的容器中
# -d 分离模式:在后台运行
# -i 交互模式,如果不加,则无法与用户交互(一般-it一块使用)
# -t 分配一个伪终端,如果不加,则没有终端(一般-it一块使用)
docker exec -it 容器id /bin/bash # 进入容器后开启一个新的终端,在其中操作(是守护模式,执行exit后不会终止容器)(退出以该种方式进入的容器的时候,只会关闭该伪终端,而不会影响容器的原先运行状态)
docker attach [options] container # 进入容器创建时的终端,所以执行exit之后会停止容器(如果容器创建时时-d模式,则创建时的终端程序是sshd-D,该进程不接收输入的;如果创建时候是交互模式,即-it,则执行该命令之后可以顺利进入终端)
# 备注:docker attach再次进入的是容器的主进程的标准输入输出流(即一开始创建容器的时候,创建的伪终端;而不是使用docker exec -it进入的容器而产生的伪终端;即使在退出使用docker exec -it进入容器产生的伪终端,由于使用ctrl+p+q退出而没有消失,docker attach也不会连接到这个伪终端)

# 6.容器中进程
docker top 容器id # 容器中进程信息

# 7.元数据
docker inspect [options] 容器name|镜像name # 容器或者镜像的元数据


------------ 日志 ------------


# 日志
docker logs 参数 容器名/容器id
# --details 显示提供给日志的其他详细信息
# --follow , -f 实时跟踪日志输出
# --since 显示自某个timestamp之后的日志大于等于某个时间,或相对时间,如1h 就是1h)
# --tail n 从末尾显示n条
# -n m或all m数,默认值为all 全部
# --timestamps , -t 日志每行显示日志时间戳
# --until 显示自某个timestamp之前的日志小于等于某个时间,或相对时间,如30m(即30分钟)
## 例
docker logs -tf --tail 10 容器id # 倒序显示指定容器实时10条日志,每条带有时间戳


------------ 其他指令 ------------

# 查看端口号
docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]


# 拷贝
docker cp 容器id:容器内路径 目的主机路径 # 拷贝容器的文件到主机中

# 创建镜像
docker commit [options] container [repository:tag] # 提交指定容器成为一个新的副本
## 例
docker commit -m="描述信息,类似git的提交信息" -a="作者" 容器id 目标镜像名:[TAG]


------------ 添加加速器(使用其他镜像源) ------------


# 编辑 /etc/docker/daemon.json 文件
sudo vim /etc/docker/daemon.json
# 该文件中写入以下内容
{
"registry-mirrors": ["https://yxzrazem.mirror.aliyuncs.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"]
}
# 保存退出后,重启docker服务
systemctl daemon-reload
systemctl restart docker

坑1:启动容器,自动停止

取决于:当前docker是否有前台进程正在运行(没有的话,docker容器会自动停止)

可能1:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用了,就会自动停止 。例如:nginx,容器启动后发现自己没有提供服务,就会立刻停止,就是没有程序了。

可能2docker run -d …最后面加了/bin/bash

解决方案1:一般-it启动的时候后面会有一个/bin/bash

解决方案2:父容器进程可能有一个子进程(即一个容器可能是一组进程)。

例如Nginx容器启动:当我们启动一个nginx服务时,它会启动一个父Nginx进程,然后父进程跨越进它的子进程,比如内存管理器、缓存加载器和工作器。

坑2:执行exit是否终止容器

取决于:当前的终端是不是在创建容器是的初始终端。如果是,则退出容器时,容器也停止;如果不是(例如进入容器时使用-it模式),退出时,仅退出当前的终端,容器继续运行

举例:先进后出:

退出方式 exec进入方式(进入守护模式,同守护模式启动) attach进入方式(进入非守护模式)
exit退出方式 容器还在 容器不在
ctrl+p+q退出方式(一定不终止容器) 容器还在 容器还在

坑3:执行docker attach卡住

取决于:创建容器的时候,是后台运行模式还是交互模式,前者使用的是sshd-D程序(不接收输入),后者使用的是bash(交互型的,接收输入)

先出后进:docker attach能否成功进入容器,取决于容器在run启动时是交互模式还是守护模式启动的

常用Docker工具

1
2
3
4
5
6
7
8
9
10
11
# 1.Docker UI
docker search dockerui
docker pull abh1nav/dockerui
docker run -d --privileged --name dockerui -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock abh1nav/dockerui #放开物理机的9000端口对应Docker容器的9000端口
curl localhost:9000 # 访问地址:http://ip地址:9000

# 2.Portainer
docker search portainer
docker pull portainer/portainer
docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
curl localhost:9000 # 访问地址:http://ip地址:9000

常见容器案例

1.Nginx

1
2
3
4
5
docker search nginx				# 查找镜像
docker pull nginx # 下载镜像
docker run -d --name nginx -p 3344:80 nginx # 创建并在后台运行容器

docker exec -it nginx /bin/bash # 进入容器

2.Tomcat

1
2
3
4
5
6
docker pull tomcat 			# 下载镜像
docker run -d -p 3355:8080 --name tomcat01 tomcat # 后台启动
docker exec -it tomcat01 /bin/bash # 进入容器
# webapps下内容为空,阿里云默认时最小的镜像,所有不必要的都剔除了
# 保证最小运行环境即可
cp -r webapps.dist/* webapps # 网站恢复访问

容器数据卷

作用

  • 数据持久化
  • 容器之间共享数据

特点

  1. 生命周期:数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期分离
  2. 存在形式:目录或文件
  3. 作用域:
    • 容器和数据卷的数据变化实时同步发生。
    • 数据卷的数据变换不影响镜像变化
  4. 挂载时:
    • 数据卷空,容器中目录非空,则容器中数据复制到数据卷中
    • 数据卷不空,容器中目录非空,则显示数据卷内容,容器目录仅显示数据卷中数据,其余被隐藏

挂载

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
------------ 方式1:在docker run基础上,使用命令来挂载 -v ------------


docker run -it -v 主机目录:容器内目录 container [command] [args]
# -v 容器内路径 匿名挂载
# -v 卷名:容器内路径 具名挂载
# -v /宿主机路径:容器内路径 指定路径挂载
# 挂载
docker run -d -P --name nginx01 -v 容器内目录 container [command] [args] # 匿名挂载,只写了容器内的路径,没有写容器外的路径
docker run -d -P --name nginx01 -v [主机目录|主机文件名]:容器内目录 container [command] [args] # 具名挂载

# 数据卷
docker volume ls # 查看所有volume
docker volume inspect [options] volume [volume2…] # 查看指定的数据卷的信息

# 没有指定目录(即使用主机文件名)时,数据在/var/lib/docker/volumes/xxxx/_data


------------ 方式2:使用DockerFile来挂载 ------------


# 第一步准备:创建文件dockerfile1,vim输入内容如下:
from centos
volume ["volume01","volume01"] # ★匿名挂载。在构建镜像时,生成这两个目录,并自动挂载到宿主机的数据卷目录中
cmd echo "-----end-----"
cmd /bin/bash
# 以上一层代表一层镜像

# 第二步:build镜像
docker build -f dockerfile1的文件地址 -t 目标镜像名称[:tag] .
# 结尾的.符号,指的是在构建镜像的过程中的上下文环境的目录(比如在dockerfile文件中使用了copy等指令来操作文件,此处的.就指定了这些指令执行时的上下文环境地址)
#挂载数据卷的目录在dockerfile的volume后面指定


------------ --volumes-from实现容器之间的数据同步 ------------


docker run -it --name container02 --volumes-from container01 镜像:[tag]
# 通过--volumes-from做到两个容器之间的数据同步(同步挂载:son extend father)
# 好处:多个容器时,只需挂载其中一个容器到数据卷,其余容器创建时只需要使用--volumes-from即可

DockerFile详解

构建发布镜像步骤:

  1. 构建一个dockerfile文件
  2. docker build构建成为一个镜像
  3. docker run运行一个镜像
  4. docker push发布镜像(DockerHub、阿里云镜像仓库)

构建Dockerfile文件

关键字 作用 备注
from 指定父镜像 指定dockerfile基于哪个image构建
maintainer 作者信息 表明作者(姓名+邮箱)
label 标签 表明dockerfile的标签,可以使用label代替maintainer,最终都是在docker image基本信息中可以查看
run 执行命令 执行一段命令,默认是/bin/bash
格式:run command 或者 run [“command”, “param1”, “param”]
run对docker容器造成的改变会反映到创建的镜像上
cmd 容器启动命令 提供run容器时候的默认命令,和entrypoint配合使用
格式:cmd command param1 param2 或者cmd [“command”, “param1”, “param2”]
只有最后一个生效(一个dockerfile只有一个cmd)
entrypoint 入口 一般在制作一些执行就关闭的容器中使用
copy 复制文件 build时,复制文件到image中
add 添加文件 build时,添加文件到image中
不仅仅局限于当前build上下文,可以来源于远程服务
env 环境变量 指定build时候的环境变量
可以在启动的容器时,通过-e覆盖
格式:env name=value
arg 构建参数 只在构建时候使用的参数
env相同名字的变量会覆盖arg的同名变量
volume 定义外部可以挂载的数据卷 指定build的image哪些目录可以启动的时候挂载到文件系统中
启动容器时,使用-v绑定
格式:volume [“目录”]
expose 暴露端口 定义容器运行时候监听的端口
启动容器时使用-p来绑定暴露端口
格式:expose 8080或者expose 8080/udp
workdir 工作目录 指定容器内部的工作目录,如果没有创建则自动创建,如果指定/使用的时绝对地址,如果不是/开头那么是在上一条workdir的路径的相对地址
主要为run、cmd、entrypoint、copy、add指定工作目录
user 指定执行用户 指定build或者启动的时候,用户在run cmd entrypoint执行的时候的用户
healthcheck 健康检查 指定监测当前容器的健康监测的命令,基本没用,通常应用本身有健康监测机制
onbuild 触发器 当执行from完成之后会执行onbuild的命令
不影响当前镜像,用处不大
stopsignal 发送信号量到宿主机 该指令设置将发送到容器的系统调用信号以退出
shell 指定执行脚本的shell 指定run cmd entrypoint 执行命令的时候 使用的shell
  • workdir区别于docker build最后的path地址,前者指的时容器内的工作目录,后者是指镜像在构建过程中对主机中的资源操作时的上下文环境
  • cmd和entrypoint区别
    • cmd:指定这个容器启动时候要运行的命令,只有最后一个会生效,可替代
    • entrypoint:指定这个容器启动时候要运行的命令,可以追加命令

Dockerfile案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM centos:7						# 设置镜像使用的基础镜像
MAINTAINER lixingze<lixingzee@gmail.com>

ENV MYPATH /user/local
WORKDIR $MYPATH # docker run之后的工作目录

RUN yum -y install vim # 安装vim到镜像中
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash

Docker网路

容器之间可以互相ping通。

所有容器不指定网络情况下,都是docker0路由的,docker会给我们容器分配一个默认可用ip地址。

1
2
3
4
5
# ip和网卡
ip addr # 查看容器的内部网卡、ip地址(需要iproute2工具)

ifconfig # 查看容器的内部网卡、ip地址(需要net-tools工具)
# 如果命令找不到,安装net-tools、iproute2、iputils-ping(可以使用ping命令)

每个容器带来的网卡都是一对一对的,只要删除容器,对应网桥一对就没了。

docker中所有网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件)

docker使用的时Linux的桥接,宿主机中是一个docker同期的网桥docker0。

docker0特点,默认,容器名不能访问, –link可以打通连接!(单向的,本质上在容器的hosts中增加了一个代理:172.17.0.3 tomcat02 56140c84bab0

所以,需要自定义网络!不使用Docker0!

自定义网络

网络模式:

  • bridge:桥接模式,docker默认方式,自定义的网络也是bridge模式
  • none:不配置网络
  • host:和宿主机共享网络
  • container:容器网络联通(用的很好,局限大)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看
docker network ls # 查看所有网络

## 例
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat # 默认就是bridge,而这个bridge就代表的docker0

# 自定义一个网络
docker network create --driver 网络模式 --subnet 子网的网络号/子网掩码 --gateway 网关设置 网络名称 # 创建一个自定义网络,指定网络模式、网络地址规定、网关地址、网络名称
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

# 启动容器(指定网络)
docker run -d -P --name 容器名称 --net 网络名称 镜像文件 # 启动一个容器,指明自定义的网络名称(若不指定,则默认是docker0),就可以通过容器名字实现容器之间的互相访问

docker network inspect 容器id

等接触到集群的时候再继续更新docker中集群的知识

Contents
  1. 1. Linux下的命令
  2. 2. Window下的命令
  3. 3. Docker命令
    1. 3.1. 坑1:启动容器,自动停止
    2. 3.2. 坑2:执行exit是否终止容器
    3. 3.3. 坑3:执行docker attach卡住
  4. 4. 常用Docker工具
  5. 5. 常见容器案例
    1. 5.1. 1.Nginx
    2. 5.2. 2.Tomcat
  6. 6. 容器数据卷
    1. 6.1. 作用
    2. 6.2. 特点
    3. 6.3. 挂载
  7. 7. DockerFile详解
    1. 7.1. 构建Dockerfile文件
    2. 7.2. Dockerfile案例
  8. 8. Docker网路
    1. 8.1. 自定义网络
|