Skip to content

Docker

启动 停止 重启

systemctl start|stop|restart docker

查看 docker 运行状态

systemctl status docker

镜像

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

docker images 查看本地主机上的镜像

docker pull 拉取镜像到本地 docker pull mysql #没有制定版本则默认最新版

docker rmi 镜像名/镜像 ID #若镜像在运行则会报错 docker rmi -f 镜像名/镜像 ID #强制删除一个

Alt text

docker
docker images  #查看镜像


#从服务器拉取镜像拉取镜像
docker pull 镜像名       #拉取最新版本的镜像
docker pull 镜像名:tag   #拉取镜像,指定版本
#推送镜像到服务
docker push 镜像名
docker push 镜像名:tag


docker save -o 保存的目标文件名称 镜像名 #保存镜像为一个压缩包
docker load -i 文件名    #加载压缩包为镜像

#从Docker Hub查找/搜索镜像
docker search [options] TERM
docker search -f STARS=9000 mysql  #搜索stars收藏数不小于10以上的mysql镜像

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

docker image rm 镜像名称/镜像ID  #强制删除镜像

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

Dockerfile 介绍

FROM 格式为 FROM <image>或 FROM <image>:<tag>或<image>@<digest>,该命令用来指定该镜像是基于哪个基础镜像创建的。

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

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

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

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

EXPOSE 作用是容器暴露的端口号,供互联系统使用。格式为 EXPOSE <port> [<port>...]。 在启动容器时需要通过参数 -P 做端口映射。

WORKDIR /path/to/workdir 为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

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

ONBUILD [INSTRUCTION]配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。

docker build

docker build [OPTIONS] PATH | URL | -

PATH: 包含 Dockerfile 的目录路径或 .(当前目录)。

URL: 指向包含 Dockerfile 的远程存储库地址(如 Git 仓库)。

-: 从标准输入读取 Dockerfile。

docker build -t webblog:v1 .

常用选项:

-t, --tag: 为构建的镜像指定名称和标签。

-f, --file: 指定 Dockerfile 的路径(默认是 PATH 下的 Dockerfile)。

--build-arg: 设置构建参数。

--no-cache: 不使用缓存层构建镜像。

--rm: 构建成功后删除中间容器(默认开启)。

--force-rm: 无论构建成功与否,一律删除中间容器。

--pull: 始终尝试从注册表拉取最新的基础镜像。

使用 .dockerignore 文件排除不需要的文件和目录,以减少构建上下文的大小。 在生产环境中,尽量使用精简的基础镜像以减小镜像体积和提高安全性。 避免在 Dockerfile 中暴露敏感信息(如密码、密钥)。

容器

Alt text 进入容器的交互式 Shell

docker exec -it <容器 ID 或名称> /bin/bash

docker
docker ps      #显示正在运行的容器
docker ps -a   #-a,--all  显示全部容器,包括已停止的(默认只显示运行中的容器)

#容器怎么来? docker run 创建并运行一个容器,处于运行状态。
#--name 给要运行的容器起的名字;   -p 将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口;   -d 表示可后台运行容器 (守护式运行)。具体样例见下
docker run --name containerName -p 80:80 -d nginx

# 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 pause 容器名/容器ID    #让一个运行的容器暂停
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 容器名    #杀掉一个或多个运行中的容器
docker rename 容器名 新容器名  #更换容器名

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


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


#进入容器执行命令,两种方式 docker exec 和 docker attach,推荐docker exec
#方式一 docker exec。
docker exec -it 容器名/容器ID bash
#方式二 docker attach,推荐使用docker exec
docker attach 容器名/容器ID

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


#设置容器开机自启动
#法一 创建容器、使用docker run命令时,添加参数--restart=always,表示该容器随docker服务启动而自动启动
docker run --name mysqlLatest -p 3307:3306 --restart=always -d mysql

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

数据卷

docker
#创建数据卷
docker volume create html

#查看所有数据卷
docker volume ls

#查看数据卷详细信息
docker volume inspect html

#创建容器并挂载数据卷到容器内的HTML目录
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
#进入html数据卷所在位置,并修改HTML内容
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data  #数据卷在此处,容器在上面-v右边
# 修改文件
vi index.html

数据卷的作用:

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

docker volume create volumeName:创建数据卷

docker volume ls:查看所有数据卷

docker volume inspect volumeName:查看数据卷详细信息,包括关联的宿主机目录位置

docker volume rm volumeName:删除指定数据卷

docker volume prune:删除所有未使用的数据卷

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

-v volume 名称:容器内目录

-v 宿主机文件:容器内文件

-v 宿主机目录:容器内目录

数据卷挂载与目录直接挂载的

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

docker-compose

Docker-compose 常用命令

命令说明
build重新构建服务
ps列出容器
up创建和启动容器
exec在容器里面执行命令
scale指定一个服务容器启动数量
top显示正在运行的容器进程
logs查看服务容器的输出
down删除容器、网络、数据卷和镜像
stop/start/restart停止/启动/重启服务
  1. docker-compose up [options] 命令 创建并启动服务(容器)
docker-compose -f docker-compose.yml up -d  //-f调用文件。-d:开启守护进程
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
  • 如果服务尚未创建,docker-compose up -d 会根据 docker-compose.yml 文件中的定义创建并启动这些服务。
  • 如果配置文件中指定了 build 指令,docker-compose up -d 会先构建所需的 Docker 镜像。
  • 如果服务已经存在且正在运行,docker-compose up -d 会先停止并删除现有的容器,然后重新创建并启动新的容器。
  • 后台运行:-d 参数表示“detached”模式,即以分离模式运行,服务会在后台运行,不会占用当前终端。
  1. docker-compose down [options] 命令 适用于彻底清理环境,例如在开发过程中需要重置环境或者测试不同配置时。
  • docker-compose down -v 命令用于停止并移除使用 docker-compose.yml 文件定义的所有容器、网络、卷(通过 -v 参数指定的数据卷)以及默认的网络桥接。
  • 使用 -v 参数会删除所有命名的数据卷。这可能会导致数据丢失,因此在执行前请确保已经做好了必要的备份

选项:

--rmi <type>:删除镜像。type 可以是以下值之一:

all:删除所有服务的镜像。

local:仅删除那些不带有 :(表示镜像标签)或 latest 标签的镜像(通常是构建时创建的镜像)。

-v 或 --volumes:移除所有为服务定义的卷(包括默认卷和命名卷)。

--rmi-all:等同于 --rmi all,删除所有服务的镜像。

-h, --help:显示帮助信息。

#停止并移除容器、网络、卷以及镜像
docker-compose down --volumes --rmi all
  1. docker-compose stop 命令

停止 Compose 应用相关的所有容器,但不会删除它们。

被停止的应用可以很容易地通过 docker-compose restart 命令重新启动。

  1. docker-compose start 命令

docker-compose start 命令用于启动之前已经创建但已停止的容器。

  1. docker-compose restart 命令

重启已停止的 Compose 应用。

如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。

  1. docker-compose ps 命令

用于列出 Compose 应用中的各个容器。

输出内容包括当前状态、容器运行的命令以及网络端口。

  1. docker-compose rm 命令

用于删除已停止的 Compose 应用。它会删除容器和网络,但是不会删除卷和镜像。

docker-compose rm [OPTIONS] [SERVICE...]

选项:

  • -f, --file FILE:指定使用的 Compose 配置文件,默认为 docker-compose.yml。
  • -v, --volumes:删除容器的同时删除由 docker-compose.yml 文件定义的卷(如果它们存在并且是容器专用的)。
  • -a, --all:删除所有服务容器,而不仅仅是停止的容器。默认情况下,docker-compose rm 只删除停止的容器。
  • --rmi TYPE:删除镜像。这个选项会删除构建镜像时产生的中间镜像和构建缓存。TYPE 可以是 all(删除所有镜像)、local(只删除本地镜像)或 built(只删除通过 docker-compose 构建的镜像)。
  • -s, --stop:在删除容器之前先停止它们。这是默认行为,可以通过添加 --no-stop 标志来覆盖。
  • --no-stop:在删除容器之前不停止它们(通常与 -f 一起使用)。

docker-compose.yml 配置项

version 定义了版本信息

services 定义了服务的配置信息

networks 定义了网络信息,提供给 services 中的 具体容器使用

volumes 定义了卷信息,提供给 services 中的 具体容器使用

注意:挂载数据卷,若不是写的宿主机绝对路径,要在下面写上定义目录。 若使用自定义数据卷,还有通过 external,来表示为 true,并提前创建好目录

version: '3'
services:
  webapp:
    image: webblog:v1
    ports:
      - "8000:80"
    volumes:
      - html:/usr/share/nginx/html
volumes:
  html:
    external: true

volumes: #定义目录 在之前加入项目名字
	tomcat:
		external: #使用自定义卷名 提前创建目录
			true
- [SOURCE:]TARGET[:MODE]

SOURCE 可以是主机系统上的命名卷或(相对或绝对)路径。 TARGET 是容器中的绝对路径。 MODE 是一个挂载选项,可以是只读或读写。这个参数是可选的。ro(readonly 只读) 或 rw(默认:readwrite 可读可写) 改变读写权限

模版

version: '3.7' # 指定 compose 文件的版本
services: # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称
  aaa: #服务aaa
    build: # 与image二选一,指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值
      context: .               # context: 指定 Dockerfile 文件所在的路径
      dockerfile: Dockerfile            # dockerfile: 指定 context 指定的目录下面的 Dockerfile 的名称(默认为 Dockerfile)
      args: # args: Dockerfile 在 build 过程中需要的参数 (等同于 docker container build --build-arg 的作用)
        JAR_FILE: service.jar
      cache_from:            # v3.2中新增的参数, 指定缓存的镜像列表 (等同于 docker container build --cache_from 的作用)
      labels:                # v3.3中新增的参数, 设置镜像的元数据 (等同于 docker container build --labels 的作用)
      shm_size:              # v3.5中新增的参数, 设置容器 /dev/shm 分区的大小 (等同于 docker container build --shm-size 的作用)
    #ports:
    #  - "80:80"
    #  - "443:443"
    ports: # 建立宿主机与容器间的端口映射关系,上面是短语法写法,下面是长语法写法
      - target: 80     # 容器端口
        published: 80  # 宿主机端口
        protocol: tcp  # 协议类型
        mode: host     # host在每个节点上发布主机端口,ingress 对于集群模式端口进行负载均衡
      - target: 443
        published: 443
        protocol: tcp
        mode: host
    command:               # 覆盖容器启动后默认执行的命令, 支持 shell 格式和 [] 格式
    configs:               # 不知道怎么用
    cgroup_parent:         # 为容器指定父 cgroup 组,意味着将继承该组的资源限制。
    container_name:        # 指定容器的名称 (等同于 docker run --name 的作用)
    deploy: # v3 版本以上, 指定与部署和运行服务相关的配置, deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm
      endpoint_mode: vip      # v3.3 版本中新增的功能, 指定服务暴露的方式
      #      vip                  # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址
      #      dnsrr               # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表, 客户端直接访问其中的一个地址
      labels:                # 指定服务的标签,这些标签仅在服务上设置
      mode: replicated                  # 指定 deploy 的模式
      #      global              # 每个集群节点都只有一个容器
      #      replicated           # 用户可以指定集群中容器的数量(默认)
      placement:
        constraints:
          - node.role==manager             # 不知道怎么用
      replicas: 1              # deploy 的 mode 为 replicated 时, 指定容器副本的数量
      resources: # 资源限制
        limits: # 设置容器的资源限制
          cpus: "0.5"           # 设置该容器最多只能使用 50% 的 CPU
          memory: 50M           # 设置该容器最多只能使用 50M 的内存空间
        reservations: # 设置为容器预留的系统资源(随时可用)
          cpus: "0.2"           # 为该容器保留 20% 的 CPU
          memory: 20M           # 为该容器保留 20M 的内存空间
      restart_policy: # 定义容器重启策略, 用于代替 restart 参数
        condition: on-failure             # 定义容器重启策略(接受三个参数)
        #          none:                    # 不尝试重启
        #          on-failure:              # 只有当容器内部应用程序出现问题才会重启
        #          any  :                   # 无论如何都会尝试重启(默认)
        delay: 10s                  # 尝试重启的间隔时间(默认为 0s)
        max_attempts: 6           # 尝试重启次数(默认一直尝试重启)
        window: 120s              # 检查重启是否成功之前的等待时间(即如果容器启动了, 隔多少秒之后去检测容器是否正常, 默认 0s)
      update_config: # 用于配置滚动更新配置
        parallelism: 1          # 一次性更新的容器数量
        delay: 10s                 # 更新一组容器之间的间隔时间
        order: stop-first                 # v3.4 版本中新增的参数, 回滚期间的操作顺序
        #      stop-first            #旧任务在启动新任务之前停止(默认)
        #      start-first           #首先启动新任务, 并且正在运行的任务暂时重叠
        failure_action: continue       # 定义更新失败的策略
        #      continue              # 继续更新
        #      rollback              # 回滚更新
        #      pause                 # 暂停更新(默认)
        #      monitor               # 每次更新后的持续时间以监视更新是否失败(单位: ns|us|ms|s|m|h) (默认为0)
        max_failure_ratio: 0     # 回滚期间容忍的失败率(默认值为0)
      rollback_config: # v3.7 版本中新增的参数, 用于定义在 update_config 更新失败的回滚策略
        parallelism: 1         # 一次回滚的容器数, 如果设置为0, 则所有容器同时回滚
        delay: 0           # 每个组回滚之间的时间间隔(默认为0)
        failure_action: continue # 定义回滚失败的策略
        #          continue             # 继续回滚
        #          pause             # 暂停回滚
        monitor: 10s           # 每次回滚任务后的持续时间以监视失败(单位: ns|us|ms|s|m|h) (默认为0)
        max_failure_ratio: 0     # 回滚期间容忍的失败率(默认值0)
        order: stop-first            # 回滚期间的操作顺序
    #          stop-first            # 旧任务在启动新任务之前停止(默认)
    #          start-first            # 首先启动新任务, 并且正在运行的任务暂时重叠
    devices:             # 指定设备映射列表 (等同于 docker run --device 的作用)
    depends_on: #依赖容器
      - db
      - redis
    dns:                 # 设置 DNS 地址(等同于 docker run --dns 的作用)
    dns_search:           # 设置 DNS 搜索域(等同于 docker run --dns-search 的作用)
    tmpfs:               # v2 版本以上, 挂载目录到容器中, 作为容器的临时文件系统(等同于 docker run --tmpfs 的作用, 在使用 swarm 部署时将忽略该选项)
    entrypoint:          # 覆盖容器的默认 entrypoint 指令 (等同于 docker run --entrypoint 的作用)
    env_file: # 从指定文件中读取变量设置为容器中的环境变量, 可以是单个值或者一个文件列表, 如果多个文件中的变量重名则后面的变量覆盖前面的变量, environment 的值覆盖 env_file 的值
      RACK_ENV=development
    volumes: #  定义容器和宿主机的数据卷映射关系
      - "/u01:/u01"   # 映射容器内的 /u01 到宿主机的 /u01目录
    environment: # 设置环境变量, environment 的值可以覆盖 env_file 的值 (等同于 docker run --env 的作用)
      - TZ=Asia/Shanghai
      - PORT_TO_EXPOSE=80
      - LOG_PATH=/opt/proj/logs
      - PROFILES_ACTIVE=prod

    expose:              # 暴露端口, 但是不能和宿主机建立映射关系, 类似于 Dockerfile 的 EXPOSE 指令
    external_links:      # 连接不在 docker-compose.yml 中定义的容器或者不在 compose 管理的容器(docker run 启动的容器, 在 v3 版本中使用 swarm 部署时将忽略该选项)
    extra_hosts:         # 添加 host 记录到容器中的 /etc/hosts 中 (等同于 docker run --add-host 的作用)
    healthcheck: # v2.1 以上版本, 定义容器健康状态检查, 类似于 Dockerfile 的 HEALTHCHECK 指令
      test: NONE # 检查容器检查状态的命令, 该选项必须是一个字符串或者列表, 第一项必须是 NONE, CMD 或 CMD-SHELL, 如果其是一个字符串则相当于 CMD-SHELL 加该字符串
      #        NONE                  # 禁用容器的健康状态检测
      #        CMD                   # test: ["CMD", "curl", "-f", "http://localhost"]
      #        CMD-SHELL             # test: ["CMD-SHELL", "curl -f http://localhost || exit 1"] 或者 test: curl -f https://localhost || exit 1
      interval: 1m30s       # 每次检查之间的间隔时间
      timeout: 10s          # 运行命令的超时时间
      retries: 3            # 重试次数
      start_period: 40s     # v3.4 以上新增的选项, 定义容器启动时间间隔
      disable: true         # true 或 false, 表示是否禁用健康状态检测和 test: NONE 相同
    image:              # 指定 docker 镜像, 可以是远程仓库镜像、本地镜像
    init:               # v3.7 中新增的参数, true 或 false 表示是否在容器中运行一个 init, 它接收信号并传递给进程
    isolation:            # 隔离容器技术, 在 Linux 中仅支持 default 值
    labels:             # 使用 Docker 标签将元数据添加到容器, 与 Dockerfile 中的 LABELS 类似
    links:              # 链接到其它服务中的容器, 该选项是 docker 历史遗留的选项, 目前已被用户自定义网络名称空间取代, 最终有可能被废弃 (在使用 swarm 部署时将忽略该选项)
    logging: # 设置容器日志服务
      driver:              # 指定日志记录驱动程序, 默认 json-file (等同于 docker run --log-driver 的作用)
      options: # 指定日志的相关参数 (等同于 docker run --log-opt 的作用)
        max-size:             # 设置单个日志文件的大小, 当到达这个值后会进行日志滚动操作
        max-file:            # 日志文件保留的数量
    network_mode:       # 指定网络模式 (等同于 docker run --net 的作用, 在使用 swarm 部署时将忽略该选项)
networks: # 将容器加入指定网络 (等同于 docker network connect 的作用), networks 可以位于 compose 文件顶级键和 services 键的二级键
  aliases:              # 同一网络上的容器可以使用服务名称或别名连接到其中一个服务的容器
  ipv4_address          # IP V4 格式
  ipv6_address          # IP V6 格式