Docker常用命令汇总

  • 一、Docker启动命令
  • 二、镜像
  • 2.1、列出本地镜像
  • 2.2、查询镜像
  • 2.3、拉取镜像
  • 2.4、查询镜像/容器/数据卷所占空间
  • 2.5、删除镜像
  • 2.6、删除虚悬镜像
  • 三、容器
  • 3.1、启动容器
  • 3.2、查看容器
  • 3.3、退出容器
  • 3.4、启动 / 重启 / 停止 容器
  • ☆ 3.5、删除容器
  • ☆ 3.6、进入正在运行的容器
  • ☆ 3.7、查看容器日志
  • 3.8、查看容器内部信息
  • 3.9、备份容器
  • 四、容器数据卷 volumes
  • 4.1、启动容器并创建数据卷
  • 4.2、继承父类 数据卷 挂载规则
  • 五、DockerFile
  • 5.1、指令
  • 六、Docker网络
  • 6.1、网络常用命令
  • 6.1.1、查看docker网络模式命令
  • 6.1.2、docker network --help
  • 6.2、docker network能干什么
  • 6.3、docker 网络模式
  • 6.3.1、使用host模式启用容器
  • 6.3.2、使用container模式启用容器
  • 6.3.3、使用自定义网络模式
  • 七、Docker-compose容器编排
  • 7.1、下载安装
  • 7.2、compose常用命令
  • 7.3、compose大致流程
  • 7.4、docker-compose.yml文件解析


一、Docker启动命令

# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 开机启动
systemct enable docker
# 查看docker概要信息
docker info

二、镜像

2.1、列出本地镜像

# 列出本地已有镜像
docker images

# 列出所有镜像
docker images -a

# 列出镜像ID
docker images -q

2.2、查询镜像

# 查询mysql镜像  
docker search mysql

# 查询mysql镜像只列出一个  
docker search mysql --limit 1

例子:
$ docker search mysql --limit 1
NAME        DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED
mysql       MySQL is a widely used, open-source relation…   13948     [OK]
  • STARS:点赞数
  • OFFICIAL:官方认证

2.3、拉取镜像

# 拉取最新版本的mysql镜像  
docker pull mysql

# 拉取5.7版本的mysql镜像  
docker pull mysql:5.7

2.4、查询镜像/容器/数据卷所占空间

docker system df

2.5、删除镜像

# 删除镜像名称为redis的镜像
docker rmi redis

# 删除镜像ID为 2f1sd3g32sd 的镜像
docker rmi 2f1sd3g32sd

# 强制删除所有镜像
docker rmi -f $(docker images -qa)

2.6、删除虚悬镜像

仓库名、标签都是<none>的镜像,俗称虚悬镜像 dangling image

# 查看所有虚悬镜像
docker image ls -f dangling=true

# 删除所有虚悬镜像
docker image prune

三、容器

参数

描述

示例

--name

指定容器名称

–name mysql5.7

-d

后台运行容器并返回容器ID,也即启动守护式容器(后台运行)


-i

以交互模式运行容器,通常与-t同时使用


-t

为容器重新分配一个伪输入终端,通常与-i同时使用


-p

指定端口映射

-p 3306:3306

-P

随机端口映射


3.1、启动容器

# 交互式运行最新版本的ubuntu容器,并命名为ubuntuTest
docker run -it --name ubuntuTest ubuntu

# 交互式运行 redis:6.0.8 容器
docker run -it redis:6.0.8

# 后台守护式运行 redis:6.0.8 容器
docker run -d redis:6.0.8

# 启动并设置容器开机自启,并将宿主机与容器的时间进行挂载,直接使用宿主机的时区
docker run -d --restart=always -v /etc/localtime:/etc/localtime redis:6.0.8

容器创建后也可以通过update命令实现容器的开机自启动

如果创建时未指定--restart=always,可通过 update 命令设置:

# docker update --restart=always [容器ID 或 容器名]
docker update --restart=always mysql5.7

--restart 具体参数值详细信息如下:

  • no 默认值,表示容器退出时,docker不自动重启容器
  • on-failure 只有在非0状态退出时才重新启动容器;
  • always 无论退出状态是如何,都重启容器;

3.2、查看容器

-a: 列出当前所有正在运行的容器+历史上运行过的
-l: 显示最近创建的容器
-n: 显示最近n个创建的容器
-q: 静默模式,只显示容器编号

# 查看正在运行容器
docker ps

# 查看正在运行 + 历史运行过的容器
docker ps -a

# 查看正在运行的容器编号
docker ps -q

3.3、退出容器

# 退出并停止容器
exit

# 退出不停止容器
ctrl + p + q

3.4、启动 / 重启 / 停止 容器

docker start [容器ID 或 容器名]

docker restart [容器ID 或 容器名]

docker stop [容器ID 或 容器名]

强制停止容器:docker kill [容器ID 或 容器名]

# 停止所有正在运行的容器
docker stop $(docker ps -q)

☆ 3.5、删除容器

docker rm [容器ID 或 容器名]

# 强制删除名称为ubuntu的容器(慎用!!!!!!)
docker rm -f ubuntu

# 强制删除正在运行的 + 历史创建的所有容器(慎用!!!!!!)
docker rm -f $(docker ps -aq)
docker ps -aq | xargs docker rm

☆ 3.6、进入正在运行的容器

docker exec -it [容器ID 或 容器名] bash

# 交互式进入容器(exit退出不会停止  推荐使用!!!!)
docker exec -it ubuntuTest bash

# 交互式进入容器(exit退出会停止容器)
docker attach -it ubuntuTest bash

☆ 3.7、查看容器日志

# docker logs --tail=行数 容器名称
docker logs --tail=100 mysql5.7

# docker logs --since 10m 容器名称(--since 10m 是查看此容器10分钟之内的日志情况。)
docker logs --since 10m mysql5.7

3.8、查看容器内部信息

# 查看容器内部运行进程
docker top [容器ID 或 容器名]

# 查看容器内部细节
docker inspect [容器ID 或 容器名]

3.9、备份容器

导出容器:docker export [容器ID] > 文件名.tar

导入容器:cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

# 导出ubuntu容器
docker export asfadsfhas1g5 > ubuntu.tar

# 导入容器
cat ubuntu.tar | docker import - orange/ubuntu:14.06

四、容器数据卷 volumes

--privileged=true 扩大容器的权限解决挂载目录没有权限的问题

4.1、启动容器并创建数据卷

docker run -it --privileged=true -v/宿主机绝对路径目录:/容器内目录 [容器ID 或 容器名]

# 启动镜像名为ubuntu的镜像,命名为myUbuntu 并将宿主机的/tmp/ubuntuData目录映射到该容器的/tmp/dockerData目录下 进行数据的共享
docker run -it --privileged=true -v /tmp/ubuntuData:/tmp/dockerData --name=myUbuntu ubuntu

# 设置读写权限
docker run -it --privileged=true -v /tmp/ubuntuData:/tmp/dockerData:ro --name=myUbuntu ubuntu

数据卷读写权限默认为:rw(读写);ro(只读,readonly)

4.2、继承父类 数据卷 挂载规则

docker run -it --privileged=true --volumes-from [父容器] --name=myUbuntu2 ubuntu

docker run -it --privileged=true --volumes-from myUbuntu --name=myUbuntu2 ubuntu

五、DockerFile

大致流程:1、编写DockerFile文件 -> 2、执行docker build产生一个Docker镜像 -> 3、运行镜像

5.1、指令

指令的一般格式为 INSTRUCTION arguments,指令包括 FROMMAINTAINERRUN 等。

5.1.1、FROM

格式为 FROM <image>FROM <image>:<tag>

第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。

5.1.2、MAINTAINER

格式为 MAINTAINER <name>,指定维护者信息。

5.1.3、 RUN

格式为 RUN <command>RUN ["executable", "param1", "param2"]

前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN ["/bin/bash", "-c", "echo hello"]

每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。

5.1.4、EXPOSE

格式为 EXPOSE <port> [<port>...]
告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。

5.1.5、WORKDIR

格式为 WORKDIR /path/to/workdir
为后续的 RUNCMDENTRYPOINT 指令配置工作目录。

5.1.6、USER 【可忽略】

指定该镜像以什么样的用户去执行,如果都不指定,默认是root,一般都不指定;

5.1.7、ENV

格式为 ENV <key> <value>。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
例如:

# 时区设置
ENV TZ Asia/Shanghai

5.1.8、ADD
将宿主机目录下的文件拷贝进镜像,且会自动处理URL和解压tar压缩包
格式为 ADD <src> <dest>

该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。

5.1.9、COPY 【可忽略】

格式为 COPY <src> <dest>
复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>
当使用本地目录为源目录时,推荐使用 COPY

5.1.10、VOLUME

格式为 VOLUME ["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

# 将本地文件夹挂在到当前容器
VOLUME /tmp

5.1.11、CMD

指定容器启动后要做的事情,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

支持三种格式

  • CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
  • CMD command param1 param2/bin/sh 中执行,提供给需要交互的应用;
  • CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;

5.1.12、ENTRYPOINT
RUN 命令相似,但是他不会被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
当指定了 ENTRYPOINT 参数时, CMD 的含义就发生了变化,不再是直接运行其命令,而是将 CMD 的内容作为参数传递给 ENTRYPOINT 指令,他们两个组合会变成 ENTRYPOINT "CMD"

两种格式:

  • ENTRYPOINT ["executable", "param1", "param2"]
  • ENTRYPOINT command param1 param2(shell中执行)。

六、Docker网络

Docker启动后会产生一个名为 docker0 的虚拟网桥,这个网桥可以理解成是一个交换机,用于容器间的网络通讯

$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:76ff:feef:7f5a  prefixlen 64  scopeid 0x20<link>
        ether 02:42:76:ef:7f:5a  txqueuelen 0  (Ethernet)
        RX packets 113  bytes 35860 (35.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 121  bytes 13004 (12.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

6.1、网络常用命令

6.1.1、查看docker网络模式命令
$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
ddb5b13b536d   bridge    bridge    local
b2cdb89b153c   host      host      local
f7b58e236559   none      null      local

其中前两个比较常用:bridge 和 host
- bridge 网桥模式【默认】:
6.1.2、docker network --help
$ docker network --help

Usage:  docker network COMMAND
Manage networks
Commands:
  connect     Connect a container to a network
  create      Create a network //创建一个网络
  disconnect  Disconnect a container from a network // 中断
  inspect     Display detailed information on one or more networks // 查看网络数据源信息
  ls          List networks // 列出所有网络
  prune       Remove all unused networks // 删除所有未使用的网络
  rm          Remove one or more networks // 删除一个或多个网络

6.2、docker network能干什么

  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响

6.3、docker 网络模式

查看IP地址:ip addr

网络模式

简介

bridge

为每一个容器分配、设置P等,并将容器连接到一个docker0的虚拟网桥【默认为网桥模式】

host

容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

none

容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等。

container

新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等

6.3.1、使用host模式启用容器
# -p 8083:8080 参数可以不加,因为使用宿主机的IP和端口 加这个配置就没有意义了
docker run -d --network host --name tomcat83 tomcat
6.3.2、使用container模式启用容器
# 创建第一个alpine容器
docker run -it --name alpine1 alpine /bin/sh
# 创建第二个容器,并共用上一个容器的IP和端口
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh

当第一个容器停掉之后,第二个容器就没有IP和端口了
6.3.3、使用自定义网络模式

因为docker容器内部的ip是有可能发生变化的
因此使用自定义网络可以解决:当容器Ip变动的时候可以通过服务名直接进行网络通信 而不受ip变化的影响

# 1、新建自定义网络(默认为bridge网桥模式)
docker network create orange_network

# 2、新建两个容器,并加入上一步自定义的网络
docker run -d -p 8081:8080 --network orange_network --name tomcat81 tomcat
docker run -d -p 8082:8080 --network orange_network --name tomcat82 tomcat

# 3、分别进入容器
docker exec -it tomcat81 bash
docker exec -it tomcat82 bash

# 4、互相通过服务名ping测试
ping tomcat81
ping tomcat82

当第一个容器停掉之后,第二个容器就没有IP和端口了

七、Docker-compose容器编排

ComposeDocker 公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件 docker-compose.yml ,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器

7.1、下载安装

官方文档:https://docs.docker.com/compose/compose-file/compose-file-v3/
官方下载:https://docs.docker.com/compose/install/

【如果是新装的docker版本,其中自带了 docker-compose 无需安装】
# 查看是否有自带 docker-compose,没有则进行后续安装
docker compose version

-----------------------------------------------------

# 安装扩展源 及 python-pip模块
sudo yum -y install epel-release
sudo yum install python-pip

# 1、官方下载,github可能下载不太稳定,可以使用下面的方式下载
curl -SL https://github.com/docker/compose/releases/download/v2.17.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
# 高速安装 Docker Compose(`uname -s` 及 `uname -m` 为参数拼接)
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.17.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# 2、添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 3、创建软连接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 4、测试安装是否成功
$ docker compose version
Docker Compose version v2.16.0

# 5、卸载
sudo rm /usr/local/bin/docker-compose

7.2、compose常用命令

# 查看帮助
docker compose -h
# 启动所有docker-compose服务
docker compose up
# 启动所有docker-compose服务并后台运行
docker compose up -d
# 停止并删除容器、网络、卷、镜像。
docker compose dkwn
# 进入容器实例内部docker--compose exec docker-compose.yml文件中写的服务id/bin/bash
docker compose exec yml里面的服务id
# 展示当前docker--compose编排过的运行的所有容器
docker compose ps
# 展示当前docker-compose编排过的容器进程
docker compose top
# 查看容器输出日志
docker compose logs yml里面的服务id
# 检查配置
dokcer compose config
# 检查配置,有问题才有输出
dokcer--compose config -q
# 重启服务
docker compose restart
# 启动服务
docker-compose start
# 停止服务
docker compose stop

7.3、compose大致流程

  • 1、保证部署的java镜像已经生成
  • 需要保证配置中调用服务的方式以docker服务名的方式调用;比如访问 mysql的Ip使用 mysql服务名代替
  • 2、编写 docker-compose.yml
  • 3、在有 docker-compose.yml 文件的目录下执行 docker compose ** 命令

7.4、docker-compose.yml文件解析

基于若依的docker-compose.yml文件解析;
若依Gitee网址:https://gitee.com/y_project/RuoYi-Cloud/blob/master/docker/docker-compose.yml
解析参考:Docker Compose 配置文件 docker-compose.yml 详解 :

# compose使用3以后的版本
version : '3'

# 代表有几个服务容器
services:
  # 自定义的服务名,也就是docker内部可以互相访问的服务名,可以代替IP
  ruoyi-nacos:
    # 要执行的镜像名称
    image: nacos/nacos-server
    # 指定运行时的容器名称,不指定docker会在镜像名称基础上拼接一些随机值
    container_name: ruoyi-nacos
    # 在构建时应用的配置项。一般直接指定Dockerfile所在文件夹路径,可以是绝对路径,或者相对于Compose配置文件的路径。
    build:
      context: ./nacos
    # 设置环境变量。可以使用数组或字典两种格式。
    environment:
      - MODE=standalone
    # 指定所挂载的主机路径或数据卷名称。
    volumes:
      - ./nacos/logs/:/home/nacos/logs
      - ./nacos/conf/application.properties:/home/nacos/conf/application.properties
    # 指定使用的网络。多个服务都需指定同一个网络,与最下面的networks相呼应
    networks:
      - ruoyi-network
    # 端口映射
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    # 指定服务之间的依赖关系,解决服务启动先后顺序问题。表示依赖于ruoyi-mysql服务
    depends_on:
      - ruoyi-mysql
  ruoyi-mysql:
    container_name: ruoyi-mysql
    image: mysql:5.7
    build:
      context: ./mysql
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/logs:/logs
      - ./mysql/data:/var/lib/mysql
    command: [
          'mysqld',
          '--innodb-buffer-pool-size=80M',
          '--character-set-server=utf8mb4',
          '--collation-server=utf8mb4_unicode_ci',
          '--default-time-zone=+8:00',
          '--lower-case-table-names=1'
        ]
    environment:
      MYSQL_DATABASE: 'ry-cloud'
      MYSQL_ROOT_PASSWORD: password
  ruoyi-redis:
    container_name: ruoyi-redis
    image: redis
    build:
      context: ./redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/conf/redis.conf:/home/ruoyi/redis/redis.conf
      - ./redis/data:/data
    command: redis-server /home/ruoyi/redis/redis.conf
  ruoyi-nginx:
    container_name: ruoyi-nginx
    image: nginx
    build:
      context: ./nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx/html/dist:/home/ruoyi/projects/ruoyi-ui
      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/logs:/var/log/nginx
      - ./nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - ruoyi-gateway
    links:
      - ruoyi-gateway
  ruoyi-gateway:
    container_name: ruoyi-gateway
    build:
      context: ./ruoyi/gateway
      dockerfile: dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - ruoyi-redis
    links:
      - ruoyi-redis

# 这一行相当于创建一个网络 名为ruoyi-network
networks:
  ruoyi-network: