文章

02.Docker 命令

02.Docker 命令

Docker 命令图

Docker 常用命令

帮助命令

1
2
3
4
5
docker version	# docker 版本信息
docker info		# 显示 docker 系统信息
docker --help	# 帮助命令
docker stats	# 查看 docker 资源占用情况命令
docker system df # 查看镜像、容器、数据卷所占用的空间

Docker 进程相关命令

1
2
3
4
5
6
systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl status docker #查看Docker服务状态
systemctl enable docker #设置开机自启
# 需要Root权限,前面加sudo

images 镜像相关命令

镜像名

  • 镜像名称一般分两部分组成:[repository]:[tag]
  • 在没有指定 tag 时,默认是 latest,代表最新版本的镜像

查看本机中所有镜像 docker images

1
2
3
docker images	# 列出本地所有镜像
	-a			# 列出所有镜像(包含中间映像层)
	-q			# 只显示镜像id
![image.png500](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/20240321095943.png)
  • REPOSITORY # 镜像的仓库
  • TAG # 镜像的标签
  • IMAGE ID # 镜像的 ID
  • CREATED # 镜像的创建时间
  • SIZE # 镜像的大小
1
2
3
docker search [options] 镜像名	# 去dockerhub上查询当前镜像
	--filter stars=20		# 列出收藏数不少于20的镜像
	--no-trunc	  # 显示完整的镜像信息
![image.png700](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/20240321100700.png)
![image.png500](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/20240321102004.png)

从仓库下载镜像 docker pull

1
2
3
docker pull 镜像名[:TAG|@DIGEST] 
# 示例
docker pull nginx

加载镜像

1
docker load -i nginx.tar

导出镜像 docker save

1
2
3
docker save -o
# 示例
docker save -o nginx.tar nginx:latest
![600](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412130041910.png)

删除镜像 docker rmi

1
2
3
4
5
6
docker rmi 镜像名 # 删除镜像
	-f		# 强制删除
# 如:删除最新的nginx镜像
docker rmi nginx:latest

docker rmi `docker images -q` # 删除所有本地镜像

实操

操作 redis 镜像

![500](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412130044216.png)

  • 拉取 redis 镜像
1
docker pull redis
![600](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412130048028.png)
  • 查看 redis 镜像
![600](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412130049215.png)
  • 打包最新的 redis 镜像为 redis.tar
1
sudo docker save -o redis.tar redis:latest
![600](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412130050790.png)
  • 删除镜像
1
2
docker rmi redis:latest
docker iamges
![600](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412130052435.png)
  • 加载镜像
1
docker load -i redis.tar
![600](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412130053529.png)

contrainer 容器相关命令

![600](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412130818264.png)
  • docker ps # 查看所有正在运行的容器和状态
    • docker ps –a # 查看所有容器
  • docker run 参数
  • docker exec 参数 # 进入容器
  • docker stop 容器名称
  • docker start 容器名称镜像名 /bin/bash
  • docker rm 容器名称 运行状态删除失败
  • docker inspect 容器名称 # 查看容器信息
  • docker logs 查看容器运行日志
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
# 1.运行容器
docker run 镜像名	# 镜像名新建并启动容器
    --name 					# 别名为容器起一个名字
    -d						# 启动守护式容器(在后台启动容器)
    -p 						# 映射端口号:原始端口号 指定端口号启动

# 例:docker run -it --name myTomcat -p 8888:8080 tomcat
# docker run -d --name myTomcat -P tomcat

# 2.查看运行的容器
docker ps	    	# 列出所有正在运行的容器
	-a			# 正在运行的和历史运行过的容器
	-q			# 静默模式,只显示容器编号

# 3.停止|关闭|重启容器
docker start  容器名字或者容器id # 开启容器
docker restart 容器名或者容器id  # 重启容器
docker stop  容器名或者容器id  # 正常停止容器运行
docker kill  容器名或者容器id   # 立即停止容器运行

# 4.删除容器
docker rm -f 容器id和容器名     
docker rm -f $(docker ps -aq)	# 删除所有容器

# 5.查看容器内进程
docker top 容器id或者容器名 # 查看容器内的进程

# 6.查看查看容器内部细节
docker inspect 容器id  # 查看容器内部细节

# 7.查看容器的运行日志
docker logs [OPTIONS] 容器id或容器名	# 查看容器日志
    -t			 加入时间戳
    -f			 跟随最新的日志打印
    --tail 	 数字	显示最后多少条

# 8.进入容器内部
docker exec [options] 容器id 容器内命令 # 进入容器执行命令
	-i		以交互模式运行容器,通常与-t一起使用
    -t		分配一个伪终端    shell窗口   bash 

# 9.容器和宿主机之间复制文件
docker cp 文件|目录 容器id:容器路径          #  将宿主机复制到容器内部
docker cp 容器id:容器内资源路径 宿主机目录路径  #  将容器内资源拷贝到主机上

# 10.数据卷(volum)实现与宿主机共享目录
docker run -v 宿主机的路径|任意别名:/容~器内的路径 镜像名
	#注意: 
	#1.如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
	#2.如果是别名则会在docker运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中

# 11.打包镜像
docker save 镜像名 -o  名称.tar

# 12.载入镜像
docker load -i   名称.tar

# 13.容器打包成新的镜像
docker commit -m "描述信息" -a "作者信息"   #(容器id或者名称)打包的镜像名称:标签

docker run

作用: 创建并启动容器

run 参数说明:

  • -i: 保持容器运行。通常与 -t 同时使用。加入 it 这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用。
  • -d: 以守护 (后台) 模式运行容器。创建一个容器在后台运行,需要使用 docker exec 进入容器。退出后,容器不会关闭。
  • -it: 创建的容器一般称为交互式容器,-id: 创建的容器一般称为守护式容器
  • --name: 为创建的容器命名。

示例:

1
2
3
 docker run -it --name=c1 centos:7 /bin/bash # 创建交互式容器
 docker run -id --name=c2 centos:7 # 创建守护式容器
 # 注意:交互式容器,exit后容器自动关闭,守护式容器会在后台执行

docker exec 进入容器

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

停止、启动、删除、查看容器

1
2
3
4
5
6
7
8
9
10
11
12
# 停止容器
docker stop 容器名称

# 启动容器
docker start 容器名称

# 删除容器 如果容器是运行状态则删除失败,需要停止容器才能删除
docker rm 容器名称 
docker -f rm 容器名称(强制删除)

# 查看容器信息
docker inspect 容器名称

Docker 数据卷

数据卷概述

数据卷概念和作用

数据卷 (Volume) 是一个虚拟目录,指向宿主机文件系统中的某个目录。

![800](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412132336729.png)

数据卷作用: 将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全。

数据卷命令

数据卷基本命令

docker volume 命令是数据卷操作,根据命令后跟随的 command 来确定下一步的操作:

  • create 创建一个 volume
  • inspect 显示一个或多个 volume 的信息
  • ls 列出所有的 volume
  • prune 删除未使用的 volume
  • rm 删除一个或多个指定的 volume
  • --hlep 查看帮助文档

示例: 创建数据卷 html:

1
sudo docker volume create html

查看所有数据卷:

1
sudo docker volume ls

查看指定数据卷详细信息 html

1
sudo docker volume inspect html

删除未使用的数据卷:

1
 docker volume prune

删除指定的数据卷:

1
docker volume rm html

数据卷挂载到容器中

在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录

1
docker run ... -v 宿主机目录(文件):容器内目录(文件) ...

注意:

  • 容器目录必须是绝对路径
  • 如果目录不存在,会自动创建
  • 可以挂载多个数据卷

示例1

1
2
3
4
5
docker run \ # 创建并运行容器
--name mn \ # 给容器起名叫mn
-v html:/root/html \ # 把html数据卷挂载到容器内的/root/html这个目录
-p 8080:80 \ # 将宿主机8080端口映射到容器内的80端口
nginx  # 镜像名称

示例2: 创建 c1 挂载 /root/data –>到 /root/data_container

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash

# 关闭容器,可以看到数据卷数据文件还在
docker stop c1 # 宿主机目录还在

# 删除容器c1,宿主机目录还在
docker rm c1

# 重新恢复c1
docker run -it --name=c1 -v ~/data:/root/data_container centos:7 /bin/bash
# 注意在容器中不能写~

# 两个容器挂载同一个数据卷
docker run -it --name=c3 -v /root/data:/root/data_container centos:7 /bin/bash
docker run -it --name=c4 -v /root/data:/root/data_container centos:7 /bin/bash
#  在一个容器中修改文件,看到另一个容器也跟着

多容器挂载同一个数据卷

多容器进行数据交换,多个容器挂载同一个数据卷容器,完成数据交互

示例:

1
2
3
4
5
6
7
8
9
10
# 创建启动c3数据卷容器,使用 –v 参数 设置数据卷
docker run -it --name=c3 -v /volume centos:7 /bin/bash
## 这里没有指定宿主机目录,默认生成一个宿主机目录

docker inspect c3 #查看c3

# 创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash 
## 使用 c3数据卷容器创建c1,c2,这时即使c3关闭不影响c3,c4交互

数据卷挂载和目录挂载

![1000](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412140041334.png)

docker run 的命令中通过 -v 参数挂载文件或目录到容器中:

  • -v volume名称: 容器内目录
  • -v 宿主机文件: 容器内文件
  • -v 宿主机目录: 容器内目录

数据卷挂载与目录挂载区别:

  • 数据卷挂载耦合度低,由 docker 来管理目录,但是目录较深,不好找
  • 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

数据卷示例

创建并运行一个 MySQL 容器,将宿主机目录直接挂载到容器

目录挂载与数据卷挂载的语法是类似的:

  • -v[宿主机目录]:[容器内目录]
  • -v[宿主机文件]:[容器内文件]
1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建目录
mkdir -p /tmp/mysql/conf
mkdir -p /tmp/mysql/data

# 挂载命令
docker run \
--name mysql \
-e root=123456 \
-p 3306:3306 \
-v /tmp/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25

示例

创建 nginx 容器

创建运行一个 nginx 容器

1
docker run --name my_nginx3 -p 8011:80 -d nginx
  • docker run 创建并运行一个容器;如果镜像不存在,会先拉取镜像
  • --name 给容器起一个名字
  • -p 主机端口:容器端口 将宿主主机端口与容器端口映射,左侧是宿主主机端口,右侧是容器端口
  • -d 后台运行容器
  • nginx 镜像名称

容器创建产生唯一 ID:

查看容器状态:docker ps

 访问页面:http://hacket.me:8011/

 查看容器日志:docker logs my_nginx3

 持续日志输出:docker logs -f my_nginx3

进入 nginx 容器,修改 HTML 文本内容

  • 进入容器
1
docker exec -it my_nginx3 bash
  • 查看 html 文件位置
1
cd /usr/share/nginx/html

  • 修改 index.html 内容
1
2
vim index.html
# vim 命令不存在,这是由于docker 镜像只保留必要的命令
  • 关闭容器:
1
docker stop my_nginx3
  • -a 查看关闭的容器:
1
docker ps -a
  • 重新启动容器:
1
docker start my_nginx3
  • 删掉容器:不能直接关掉运行中的容器:
1
docker rm my_nginx3
  • -f 强制关闭容器:
1
docker rm -f my_nginx3

创建一个 nginx 容器,映射数据卷,修改容器内的 html 目录的 index.html

1
2
3
4
5
6
7
8
9
10
# nginx的html目录在容器内的/usr/share/nginx/html,需要把这个目录挂载到html这个数据卷上,方便操作其中的内容,创建运行容器时使用-v参数挂载数据卷
## 创建容器并挂载数据卷到容器内的html目录  如果没有数据卷会自动创建数据卷:
docker run --name mn -v html:/usr/share/nginx/html -p 8123:80 -d nginx
## 进入html数据卷所在位置,修改html内容
### 查看html数据卷在宿主机的位置
docker volume inspect html
### 进入该目录
cd /var/lib/docker/volumes/html/_data
### 修改文件
vim index.html

redis

创建并运行一个 redis 容器,并且支持数据持久化

1
docker run --name my_redis -p 6379:6379 -d redis redis-server --appendonly yes

 进入容器:

1
2
docker exec -it my_redis bash
redis-cli
![900](https://raw.githubusercontent.com/hacket/ObsidianOSS/master/obsidian/202412132324672.png)

一步到位:

1
docker exec -it my_redis redis-cli
本文由作者按照 CC BY 4.0 进行授权