Docker命令大全

一、 Docker 简介

二、Docker 基础命令

2.1 docker 服务基础命令

1
2
3
4
5
6
7
8
9
docker version                   # 查看docker版本号信息
docker info                      # 查看docker相关信息,包括版本信息、镜像和容器数量等
systemctl start docker           # 启动docker 服务引擎
systemctl stop docker            # 关闭docker 服务引擎
systemctl restart docker         # 重启docker 服务引擎
systemctl enable docker          # 设置开机自启动 服务引擎
systemctl status docker          # 查看docker 服务引擎运行状态
systemctl status docker.service  # 查询Docker 服务引擎服务状态
docker --help                    # docker命令提示

2.2 docker镜像命令

镜像的名称组成:

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

mysql:5.7 为例,mysql 就是 repository,5.7 就是 tag,合一起就是镜像名称,代表 5.7 版本的 MySQL 镜像。

docker 常见的镜像操作命令如图:

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
docker images                   # 查看本地镜像列表

docker build Dockerfile         # 创建本地镜像

# 从服务器拉取镜像到本地
docker pull imageName           # 从镜像源(服务器)拉取最新版本的镜像
docker pull imageName:tag       # 从镜像源(服务器)拉取指定版本的镜像

# 将本地镜像推送到服务
docker push imageName
docker push imageName:tag

# 将本地镜像保存到 tar 包 / 从 tar 包加载 镜像到本地镜像
docker save -o output.tar image1:tag1 [image2:tag2 image3:tag3] # 保存镜像为一个压缩包
docker load -i object_imageName.tar             # 加载压缩包为镜像

# 从镜像源(服务器, 默认为 Docker Hub)查找/搜索镜像
docker search [options] TERM
docker search -f STARS=9000 mysql               # 搜索 stars 收藏数不小于10以上的mysql镜像

# 删除本地镜像,仅当当前镜像没有被任何容器使用 才可以删除
docker rmi imageName/imageID                    # 删除镜像 
docker rmi -f imageName/imageID                 # 强制删除
docker rmi -f imageName1 imageName2 imageName3  # 删除多个 其镜像ID或镜像用用空格隔开即可 
docker rmi -f $(docker images -aq)              # 删除全部镜像,-a 意思为显示全部, -q 意思为只显示ID

docker image rm imageName                       # 强制删除镜像

# 给镜像打标签【有时候根据业务需求 需要对一个镜像进行分类或版本迭代操作,此时就需要给镜像打上标签】
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

2.3 docker容器命令

docker容器 是由 docker镜像 启动运行的 容器实例。

docker 容器操作的命令如图:

容器由三个状态:

  • 运行:进程正常运行
  • 暂停:进程暂停,CPU不再运行,并不释放内存
  • 停止:进程终止,回收进程占用的内存、CPU等资源
 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
docker ps               # 显示正在运行的容器
docker ps -a            # -a,--all  显示全部容器,包括已停止的(默认只显示运行中的容器)
docker stats            # 查看 docker 运行中的容器, 类似 linux 的 top 命令

# 容器是由 docker run images 命令创建并运行实例
# --name 给要运行的容器起的名字;
# -p 将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口;
# -d 表示可后台运行容器 (守护式运行)。
# 如下示例:
docker run --name containerName -p 80:80 -d nginx 
#设置容器开机自启动
#法一 创建容器、使用docker run命令时,添加参数--restart=always,表示该容器随docker服务启动而自动启动
docker run --name mysqlLatest -p 3307:3306 --restart=always -d mysql

#若容器已启动,希望设置开机自启动
docker update containerName/containerID --restart=always

docker pause containerName/containerID      # 让一个运行的容器暂停
docker unpause name                         # 让一个容器从暂停状态恢复运行
docker stop name                            # 停止一个或多个运行的容器(杀死进程、回收内存,仅剩文件系统)
docker start name                           # 让一个停止的容器再次运行
docker start mysql redis rabbitmq nginx     # 启动多个容器
docker restart name                         # 重启一个或多个容器
# docker stop与docker kill的区别:都可以终止运行中的docker容器。类似于linux中的kill和kill -9这两个命令,docker stop与kill相似,docker kill与kill -9类似

docker kill containerName                                   # 杀掉一个或多个运行中的容器
docker rename containerName new_containerName               # 更换容器名

# 删除容器
docker rm containerName/containerID                         # 删除容器  
docker rm -f CONTAINER                                      # 强制删除
docker rm -f containerName containerName2 containerName3    # 删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f $(docker ps -aq)                               # 删除全部容器


docker inspect containerName                                # 获取容器更多信息 
docker ps -l                                                # 最后一次运行的容器
docker port containerName/containerID                       # 查看端口的映射情况
docker logs containerName                                   # 查看容器运行日志         
docker logs -f containerName                                # 持续跟踪日志
docker logs -f --tail=20 containerName                      # 查看末尾多少行
docker diff containerName                                   # 查看容器的改动

# docker 网络
docker network ls                                           # 查看所有docker网络
docker network rm <network_name>                            # 删除 docker网络

# 进入容器执行命令有两种方式 docker exec 和 docker attach,推荐docker exec
# 方式一: docker exec
docker exec -it containerName/containerID bash

# 方式二: docker attach,推荐使用docker exec
docker attach containerName/containerID

# 从容器退到自己服务器中(不能用ctrl+C)
exit            # 直接退出。未添加-d(持久化运行容器)时,执行此参数 容器会被关闭
ctrl+p+q        # 优雅退出。无论是否添加 -d 参数,执行此命令容器都不会被关闭

docker run 常用启动参数说明:

  • -it 输出容器命令行的内容 即容器的自身的程序输出在控制台 有点类似前台运行
  • -d 和it相反 隐藏后台运行
  • -p 端口映射 [外部(宿主机)端口]:[容器里面运行的端口], 示例:9000:9000 将宿主机9000端口映射到镜像里面的9000端口
  • –restart 重启方式:–restart=always 表示该容器跟随docker服务引擎自动启动
  • –name 启动后的容器名称
  • -v 挂载容器数据卷
  • –network 连接到某个网络(例如:–network test_net)
  • –network-alias 容器的网络名称(例如:–network-alias portainer)

三、docker 数据卷(volume)

3.1 docker 数据卷(volume)简介

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

  • 可供容器使用的特殊目录,可以在容器之间共享和重用;
  • 对数据卷的修改会立即生效,对数据卷的更新不会影响镜像;
  • 卷会一直存在,直到没有容器使用;

一旦完成数据卷挂载,在容器里对挂载的目录/文件的一切操作(增、删、改)都会作用在数据卷对应的宿主机目录/文件里。同样的,在宿主机上对目录/文件的一切操作(增、删、改),容器中也实时体现出来。二者实际是共享 目录/文件。

这样,操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了。

两个文件挂载同一个数据卷,数据共享;升级 容器删了,但数据卷没删、硬盘目录还在。

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

3.2 数据卷操作命令

  1. 数据卷操作的基本语法
1
docker volume [COMMAND]

根据命令后跟随的command来确定下一步的操作:

  • create volumeName 创建一个volume,一般关联宿主机/var/lib/docker/volumes/目录下
  • inspect volumeName 显示一个或多个volume的信息
  • ls 列出所有的volume
  • prune 删除未使用的volume
  • rm volumeName 删除一个或多个指定的volume

注意:

  • docker inspect volumeName 查询到的 Mountpoint 表示该数据卷在宿主机哪个目录(一般无需设置),数据卷 <——> 宿主机目录
  • docker run 中的 -v 表示将该容器内某个目录挂载到数据卷,数据卷 <——> 容器内目录
  1. 将容器挂载到本地目录

容器不仅可以挂载数据卷,也可以直接挂载到宿主机目录下,关联关系如下:

  • 带数据卷模式:宿主机目录 <——> 数据卷 <——> 容器内目录
  • 直接挂载到宿主机模式:宿主机目录 <——> 容器内目录

目录/文件挂载 与 数据卷挂载的语法是类似的(之前数据卷挂载是 -v volumeName:/targetContainerPath,而且可挂载文件 宿主机文件内容可直接覆盖容器内文件),语法如下:

1
2
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]

数据卷挂载与目录直接挂载的优缺点:

  • 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找(自动化 隐藏细节)
  • 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看(细节自己管理实现 没有自动化)

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 通过docker pull mysql:5.7.25 拉取需要的 mysql 镜像
# 创建data目录 /data/mysql/data
# 创建目录/data/mysql/conf,并在该目录下新建文件h my.cnf,写入如下内容:
cat /data/mysql/conf/my.cnf
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000

# 创建并运行MySQL容器
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123 -p 3307:3306 -v /data/mysql/conf/my.cnf:/etc/mysql/conf.d/hmy.cnf -v /data/mysql/data:/var/lib/mysql -d mysql:5.7.25

# 挂载 /data/mysql/data 到 mysql 容器内数据存储目录 /var/lib/mysql
# 挂载 /data/mysql/conf/my.cnf 到 mysql 容器的配置文件 /etc/mysql/conf.d/hmy.cnf
# -e 设置环境变量, MYSQL_ROOT_PASSWORD=123 设置 MySQL root 密码

3.3 数据卷/目录/文件 的挂载

docker run的命令中通过 -v 参数 用于声明挂载数据卷、文件或目录到容器中:

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

四、Docker Compose 容器编排

4.1 Docker Compose 概述

Docker Compose 是 Docker 官方的开源项目,负责实现对 Docker容器集群的快速编排。Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。通过定义一个 YAML 格式的配置文件 docker-compose.yml,编写好多个容器之间的调用关系,然后,只要一个命令,就能同时 启动 / 关闭 这些容器。

在使用 Docker 的时候,通过定义 Dockerfile 文件,然后使用 docker build 创建本地镜像(或 docker pull 拉取远程镜像到本地)、 使用 docker run 命令创建容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。Docker Compose 可以基于 Compose文件 帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器, Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。

docker-compose 用来在单机上编排容器(定义和运行多个容器,使容器能互通)。

Docker Compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及 容器(containner)。

docker-compose.yml组成一个project,project里包括多个service,每个service定义了容器运行的镜像(或构建镜像)、网络端口、文件挂载、参数、依赖等,每个service可包括同一个镜像的多个容器实例。即 project 包含 service ,service 包含 container

Docker Compose 使用步骤:

  1. 编写 Dockerfile 定义各个微服务应用并构建出对应的镜像。
  2. 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
  3. 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线。

4.2 Docker Compose 下载安装和卸载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 下载安装
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 开启可执行权限
chmod +x /usr/local/bin/docker-compose

# 或 使用包管理工具:
apt install docker-compose

# 查看版本
docker-compose --version
# docker-compose version 1.29.2, build 5becea4c

# 如果使用curl方式安装的,这样卸载即可
rm /usr/local/bin/docker-compose

4.3 Docker Compose 常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
docker --version                        # 查看版本
docker-compose -h                       # 查看帮助
docker-compose up                       # 启动所有docker-compose服务
docker-compose up -d                    # 启动所有docker-compose服务并后台运行
docker-compose down                     # 停止并删除容器、网络、卷、镜像。
docker-compose exec  yml里面的服务id     # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps                       # 展示当前docker-compose编排过的运行的所有容器
docker-compose top                      # 展示当前docker-compose编排过的容器进程
docker-compose logs  yml里面的服务id     # 查看容器输出日志
docker-compose logs -f nginx            # 查看nginx的实时日志
docker-compose config                   # 检查配置
docker-compose config -q                # 检查配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
docker-compose restart                  # 重启服务
docker-compose start                    # 启动服务
docker-compose stop                     # 停止服务
docker-compose build --no-cache nginx   # 不带缓存的构建
docker-compose events --json nginx      # 以json的形式输出nginx的docker日志
docker-compose pause nginx              # 暂停nignx容器
docker-compose unpause nginx            # 恢复ningx容器
docker-compose rm nginx                 # 删除容器

4.4 编写docker-compose.yml

官网地址:https://docs.docker.com/compose/compose-file/ 参考文档:https://blog.csdn.net/weixin_42907150/article/details/136314795

示例:

 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
version: '3'
services:
  back:
    image: backService:1.0
    container_name: back
    environment:
      - name=tom
      - DB_PATH=jdbc:sqlite:/data/ns.db
    restart: always
    privileged: true
    ports:
      - "9000:9000"
    networks:
      - "net"
    volumes:
      - "/root/k3s.kube.config:/k3s.kube.config"
      - "/root/data:/data"
      - "/etc/network/interfaces:/etc/network/interfaces"
  front:
    image: front:1.0
    container_name: front
    restart: always
    ports:
      - "10087:80"
    networks:
      - "net"
    volumes:
      - "/root/nginx.conf:/etc/nginx/nginx.conf"
networks:
  net:
    driver: bridge
  • version:指定 docker-compose.yml 文件的写法格式

  • services

    • environment: 多个容器environment:环境变量配置,可以用数组或字典两种方式
1
2
3
4
5
6
7
8
services:
  environment:
    RACK_ENV: "development"
    SHOW: "ture"
# -------------------------
  environment:
    - RACK_ENV="development"
    - SHOW="ture"
  • image:指定服务所使用的镜像
1
2
3
services:
  redis:
    image: redis:alpine
  • expose:定义容器用到的端口(一般用来标识镜像使用的端口,方便用ports映射)
1
2
3
4
services:
  expose:
    - "3000"
    - "8000"
  • ports:定义宿主机端口和容器端口的映射,可使用宿主机IP+宿主机端口进行访问 宿主机端口 容器端口
1
2
3
ports:          # 暴露端口信息  - "宿主机端口:容器暴露端口"
- "5000"        # 仅指定容器端口时,宿主机将会随机选择端口
- "8081:8080"
  • volumes:卷挂载路径,定义宿主机的目录/文件和容器的目录/文件的映射 宿主机路径:容器路径
1
2
3
4
volumes:
  - "/var/lib/mysql"
  - "hostPath:containerPath"
  - "root/configs:/etc/configs"
  • depend_on: 规定service加载顺序,例如数据库服务需要在后台服务前运行
  • extra_hosts:类似于docker里的–add-host参数 配置DNS域名解析(域名和IP的映射)
1
2
3
4
5
6
7
extra_hosts:
 - "googledns:8.8.8.8"
 - "dockerhub:52.1.157.61"

# 相当于在容器种的/etc/hosts文件里增加
8.8.8.8 googledns
52.1.157.61 dockerhub
  • restart: always :配置重启,docker每次启动时会启动该服务
  • privileged: true :开启特权模式
  • user: root :指定容器运行的用户名
  • networks:
 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
# 可参考:https://www.cnblogs.com/jsonhc/p/7823286.html
version: "3"
services:
  front:
    image: front
    container_name: front
    depends_on:
      - php
    ports:
      - "80:80"
    networks:
      - "net1"
    volumes:
      - "/www:/usr/local/nginx/html"

  back:
    image: back
    container_name: back
    expose:
      - "9000"
    networks:
      - "net1"
    volumes:
      - "/www:/usr/local/nginx/html"

networks:
    net1:
        driver: bridge