Loading

docker笔记

认识Docker

对于常用的CentOS系统,Docker只支持CentOS7以上版本,不支持CentOS6。

CentOS7系统安装Docker的命令:

# 卸载旧版本docker
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  
# 安装依赖工具、配置yum源
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 选择合适的版本安装
yum list docker-ce --showduplicates | sort -r
VERSION_STRING=3:25.0.0-1.el8
sudo yum install docker-ce-$VERSION_STRING docker-ce-cli-$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin

# 启动docker
sudo systemctl enable docker
sudo systemctl start docker

Docker服务安装完毕后,还需要做的一件事情是配置镜像加速;因为docker的官方镜像仓库是在国外,除非kexue上网,否则访问镜像仓库速度会非常慢。下面是配置阿里云镜像加速的方法:

登录阿里云官网,搜索容器镜像服务-镜像工具-镜像加速器;根据操作系统不同进行不同的配置,这里以CentOS为例:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://kv7fep4d.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker命令

帮助文档

使用 docker --help 命令可以查看命令的帮助文档;例如,docker pull --help可以查看pull命令的帮助文档

镜像

搜索镜像

搜索镜像有两种方法;第一种是去dockerhub搜索(推荐使用,可视化)、另一种是使用 docker search mysql 命令

下载镜像

使用 docker pull [镜像仓库地址/]镜像名:镜像版本

# 下载最新版本的镜像
docker pull mysql:latest

# 下载指定版本的镜像
docker pull mysql:5.7

列出镜像信息

使用 docker images [选项] 列出镜像信息

# 列出镜像id
docker images -q

# 列出所有镜像id(包括隐藏的)
docker images -a

# 根据镜像name和tag过滤
docker images -a java:8

# 列出完整的镜像id
docker images --no-trunc

# 列出没有tag的镜像
docker images --filter "dangling=true"

docker images 命令可以配合 docker rmi 实现特殊的删除效果,例如:

docker rmi $(docker images --filter "dangling=true" -q)

docker images --format 可以使输出的内容格式化展示:

Placeholder Description
.ID Image ID
.Repository Image repository
.Tag Image tag
.Digest Image digest
.CreatedSince Elapsed time since the image was created
.CreatedAt Time when the image was created
.Size Image disk size
docker images --format "{{.ID}}:{{.Repository}}"

# 表格形式展示
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

# Json格式展示
docker images --format json

导入导出镜像

通过 docker save/load 指令可以将镜像导入或导出:

  1. docker image save IMAGE -o image.tar.gz: 将docker镜像保存为压缩包
  2. docker image load < archive file: 将压缩包导入为一个镜像
docker image save helloworld:v1 -o hellov1.tar.gz
docker image load < hellov1.tar.gz

容器

列出容器信息

Filter Description
id Container's ID
name Container's name
label An arbitrary string representing either a key or a key-value pair. Expressed as <key> or <key>=<value>
exited An integer representing the container's exit code. Only useful with --all.
status One of created, restarting, running, removing, paused, exited, or dead
ancestor Filters containers which share a given image as an ancestor. Expressed as <image-name>[:<tag>], <image id>, or <image@digest>
before or since Filters containers created before or after a given container ID or name
volume Filters running containers which have mounted a given volume or bind mount.
network Filters running containers connected to a given network.
publish or expose Filters containers which publish or expose a given port. Expressed as <port>[/<proto>] or <startport-endport>/[<proto>]
health Filters containers based on their healthcheck status. One of starting, healthy, unhealthy or none.
isolation Windows daemon only. One of default, process, or hyperv.
is-task Filters containers that are a "task" for a service. Boolean option (true or false)

使用 docker ps 列出的是运行中的容器信息

# 列出容器信息(不论是否运行)
docker ps -a

# 列出退出状态的容器信息id
docker ps --filter "status=exited" -aq

容器创建运行(重点)

容器继续运行的条件:有一个前台进程在运行着

使用 docker run [options] [image] [command] [args] 来运行一个容器

容器运行方式有三种:

  1. 后台运行
  2. 交互式运行
  3. 默认运行方式
# 默认运行
docker run nginx:latest

# 后台运行
docker run -d nginx:latest

# 交互运行
docker run -it nginx:latest

删除容器

使用 docker rm 命令可以删除容器,前提容器没有在运行中;若要删除一个运行中的容器,需要使用 docker rm -f命令

# 删除容器
docker rm -f $(docker ps --filter name=nginx -q)

进入容器执行命令

使用 docker exec [options] container-id/name commands [arg...] 进入容器内部执行命令

docker exec -it nginx bash

查看容器日志

使用 docker logs [option] 容器id或容器名称 查看容器日志

# 持续输出日志
docker logs -f nginx

# 显示最新10条日志
docker logs —n 10 nginx

容器文件拷贝

使用 docker cp 命令来实现容器与宿主机之间文件和目录的相互拷贝

宿主机文件拷贝到容器:

docker cp /tmp/a.txt nginx:/tmp

容器文件拷贝到宿主机:

docker cp nginx/tmp/a.txt /tmp

停止容器

使用 docker stop 命令可以停止运行中的容器(一个或多个)

docker stop nginx

启动\暂停容器

使用 docker start 命令可以启动停止的容器

docker start nginx

使用 **docker pause/unpause **命令暂停、恢复暂停的容器

docker pasue 392f303a4f0d
docker unpause 392f303a4f0d

列出容器使用情况

使用 docker stats 可以列出实时的容器资源使用情况,使用 --format 可以指定格式输出

docker stats --format "table {{.ID}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}"

run命令详解(重点)

实际生产环境中docker run命令要比上面记录的要复杂的多,同时,docker run的参数和选项也会影响着启动的容器

发布端口

要让外部能够访问到容器内的端口,就需要使用 -p 选项指定端口映射,将容器端口发布到宿主机端口

用法:doker run -p 宿主机端口:容器端口 -p 宿主机端口2:容器端口2 容器镜像

如果不了解容器需要映射哪些端口,可以通过dockerhub或者dockerfile中的EXPORE获取

docker run -d -p 80:80 nginx:latest

数据卷

将宿主机目录或者文件挂载到容器中,实现宿主机和容器之间的数据共享和持久化。可以通过dockerfile的VOLUME变量查看

用法:docker run -v 宿主机目录:容器目录:rw 镜像名

默认映射权限是rw,也就意味着对宿主机文件的修改会同步到容器内

docker run -d --name=nginx -p 80:80 -v /tmp/index1.html:/usr/share/nginx/html/index.html nginx:latest

列出所有数据卷

用法:docker volumn ls

删除指定数据卷

用法:docker volumn rm 数据卷id

查看数据卷详情

用法:docker volume inspect 数据卷id

环境变量

容器内某些变量不能写死,需要让使用者在创建容器时指定,这种情况镜像中一般是定义环境变量实现的,如MySQL的root用户密码

用法:docker run -e 变量名=变量值 镜像名

docker run -d -p 13306:3306 -v /mnt/data/mysql:/var/lib/mysql:rw -e MYSQL_ROOT_PASSWORD=whx19981027 mysql:5.7

容器命名

为了方便识别各个容器,可以使用 --name 选项自定义容器名

重启策略

如果不设置容器重启策略,当容器挂掉时,默认不会自动重启;就生产环境而言,容器不自动启动意味着服务停止,严重影响业务;所以,设置容器的重启策略至关重要

重启策略有以下几种:

  • no:容器退出时不会自动重启(默认策略)
  • always:容器总是在退出后重启
  • on-failure[:max-retries]:容器仅在非正常退出时重启,可以指定最大重试次数
  • unless-stopped:容器会在退出后自动重启,除非手动停止了容器

用法:docker run --restart always 镜像名

docker run -d --name nginx_demo --restart always -p 10080:80 nginx:latest

其他容器和镜像命令

查看镜像详细信息

用法:docker image inspect [options] 镜像名

查看容器内进程

用法:docker top 容器ID/容器Name

查看容器详细信息

用法:docker inspect [options] 容器ID/容器Name

网络

使用docker network命令可以配置容纳容器网络相关

创建网络

用法:docker network create [网络名称]

查看网络

列出所有的网络使用:docker network ls

查询指定的网络详情:docker network inspect [网络名称]

删除网络

用法:docker network rm [网络名称]

容器加入网络

  1. 已运行的容器加入网络:
    1. docker network disconnect [旧网络] [容器id]
    2. docker network connect [新网络] [容器id]
  2. 容器初次运行加入网络:docker run --network [网络名称]

Dockerfile

docker file的存在主要是为了自定义镜像;使用docker build命令可以编译自定义dockerfile的镜像。如:

docker build -t //镜像名// -f //dockerfile存在的路径//

指令

LABEL

为镜像添加元数据描述,Label是key=value的形式;可以一次性描述多个元数据,比如:LABEL auther=dalianxia version=1.0

FROM

表示构建自定义镜像用到的基础镜像;用法:FROM 镜像名:镜像版本

CMD

用于容器运行时的默认命令,可以在docker run的时候覆盖掉;多个CMD只有最后一个生效。

用法:

CMD ["命令", "参数..."] 或者 CMD 命令(可以解析环境变量)

ENV

设置环境变量;用法: ENV Content=Java

FROM Centos:7
ENV Content=Java
CMD ["sh", "-c", "echo $Content"]

WORKDIR

设置当前工作目录;如果目录不存在,则自动创建;WORKDIR后支持变量,支持层次递进

RUN

构建过程中执行命令;与CMD指令不同,RUN指令作用域是在镜像构建过程中。

如果RUN后要接多条命令,需要使用 && 连接起来,如:RUN npm install --production --silent && mv node_modules ../

当RUN指令后跟多条语句并且语句冗长时,推荐使用 \ 反斜杠来增加docker file的阅读性

ADD

作用:把构建中的文件、目录或者网络文件复制到镜像当中的指定目录下

注意:

  1. 如果文件是一个压缩文件,ADD指令会自动将其解压;如果文件是一个网络文件中的压缩包,则不会解压
  2. ADD指令后所跟的文件要同dockerfile放置在同一目录下,ADD后用./install/xxx.tgz的命令格式
  3. ADD指令同样支持正则表达式
FROM nginx:1.25
WORKDIR /tmp
ADD ./content.tgz .
RUN cat ./contents.txt
CMD ["nginx", "-g", "daemon off;"]

COPY

作用同ADD基本一致;区别在于COPY不会对压缩文件做解压操作

几个重要参数: --from、--chown、--chmod、--parent

COPY [--from=<image|stage|context>] <src> ... <dest>   # --from允许从其他镜像、上下文等复制文件
COPY [--chown=<user>:<group>] [--chmod=<perms> ...] <src> ... <dest>  # 复制的同时改变文件或目录属主、权限
COPY [--parents[=<boolean>]] <src> ... <dest>  # --parent允许复制父级目录

EXPOSE

作用:暴露需要发布的端口,让镜像使用者知晓哪些端口需要发布;如果不指定协议类型,默认为TCP。

EXPOSE 80/tcp

ENTRYPOINT

作用:指定镜像的默认入口命令;与CMD相似,但是ENTRYPOINT命令无法覆盖

  1. 运行容器追加命令
  2. 容器主进程启动前做的准备工作:比如数据库启动前的初始化工作,Redis启动前的用户身份切换等
ENTRYPOINT ["ls", "-a"]
或
ENTRYPOINT ["redis-user-check.sh"]

Docker Compose

docker compose是一个用于定义和运行多个容器的工具;一个使用docker容器的应用,通常由多个容器组成。compose使用一个配置文件来管理多个容器,容器通过services来定义,使用docker compose脚本来启动、停止和重启应用和应用中的服务以及所有依赖服务的容器,适合多个容器进行开发的场景。

新版本的docker已经集成了docker compose,无需单独下载。

命令说明

build

用法:docker compose build [options] [SERVICE...];用于构建或重新构建项目中的服务容器

选项包括:

  • --force-rm 删除构建过程中的临时容器
  • --no-cache 构建镜像过程不使用cache
  • --pull 始终尝试通过pull来获取更新版本的镜像

config

用于验证compose 文件格式是否正确;若是正确则显示配置,否则显示错误原因

down

停止 up 命令启动的容器,并移除网络

exec

进入指定的容器

images

列出compose文件包含的所有镜像

kill

通过发送 SIGKILL 信号来强制停止服务容器;格式为: docker compose kill [options] [SERVICE...]

支持通过 -s 参数来指定发送的停止信号

logs

用法:docker compose logs [options] [SERVICE...];查看服务容器的输出

pause\unpause

暂停一个服务容器\恢复暂停状态中的容器

port

作用:列出某个容器端口所映射的公共端口

用法:docker compose port [options] SERVICE PRIVATE_PORT

选项:

  • --protocol=tcp 指定端口协议
  • --index=1 如果一个服务存在多个容器,则指定容器序号

ps

作用:列出项目中目前所有容器

用法:docker compose ps [options] [SERVICE]

使用 -q 则只打印容器的ID信息

pull\push

拉取服务依赖的镜像\推送服务依赖的镜像到镜像仓库

rm

删除所有(停止状态下)的服务容器,需要先使用 docker compose stop 来停止容器

选项:

  • -f 强制直接删除,包括非停止状态的容器
  • -v 删除容器所挂载的数据卷

restart

作用:重启项目中的服务;通过 -t timeout 参数指定重启前停止容器的超时时间(默认10s)

run

用法:docker compose run [options] [-p PORT] [-e KEY=VAL] SERVICE [COMMAND] [ARGS...]

默认情况下,如果存在关联,则所有关联的服务都会自动被启动;

start\stop

作用:启动已经存在的服务容器\停止正在运行的服务容器,但不删除

top

作用:查看服务容器内运行的进程,同Linux上的top命令相似

up

用法:docker compose up [options] [SERVICE...]

该命令尝试自动完成包括构建镜像,重新构建镜像,启动服务,并关联服务相关容器的一系列操作

模板文件

docker compose通过模板文件来管理运行容易,格式为yaml

version: "3.8"
services:
  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints:
          - "node.role==manager"
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - "5000:80"
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints:
          - "node.role==manager"

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - "node.role==manager"

networks:
  frontend:
  backend:

volumes:
  db-data:

Docker Swarm

Docker Swarm是Docker的集群管理工具,作用是把Docker主机抽象成一个整体,通过一个入口管理Docker主机上的Docker资源。Swarm由管理节点和工作节点组成

常用命令

docker swarm init

作用:初始化一个swarm集群;后面常跟参数 --advertise-addr 指定管理节点ip

[root@hcss-ecs-1b32 etc]# docker swarm init --advertise-addr 192.168.99.199
Swarm initialized: current node (sy80xt3pc7v7rwdxx23hv467n) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-444rkbey52jy1yeayhf49dfod9g708bqc0j80bmc7v0rjo4qqs-09ke5dj8nfkx1vuduydpd61qt 192.168.99.199:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

docker swarm join-tocken manager

作用:查看manager节点的 ”入群认证“

docker swarm join-tocken worker

作用:查看worker节点的 ”入群认证“;和docker swarm init 提示的命令一致

docker swarm join --token ...

作用:加入swarm集群,默认是以worker身份(docker swarm join-tocken worker的结果);如果要以manager节点身份加入swarm集群,需要先通过 docker swarm join-tocken manager 查看”入群认证“。

docker node ls

查看集群中的节点;docker swarm集群模式下,对于节点的操作通过docker node来控制,对于网络操作通过docker network来控制,对于运行的服务通过docker service来控制

docker node inspect xxx

查看集群中指定节点的信息

docker node inspect sy80xt3pc7v7rwdxx23hv467n

docker node update

更新节点信息,主要用于对node节点添加\删除标签、角色转变(manager->worker 或者 worker->manager)、节点可用性配置

docker node update --role worker sy80xt3pc7v7rwdxx23hv467n  # 将管理节点变为工作节点

docker node update --role manager sy80xt3pc7v7rwdxx23hv467n  # 将工作节点变为管理节点

docker node update --availability pause sy80xt3pc7v7rwdxx23hv467n  # 标明该节点不可分配新任务

docker node update --availability active sy80xt3pc7v7rwdxx23hv467n  # 标明该节点可分配新任务

docker node update --availability drain sy80xt3pc7v7rwdxx23hv467n  # 标明该节点不可分配新任务,该节点上运行的服务都会被关闭并在其他节点被安排

docker swarm leave -f

将节点移除集群,如果是manager节点,需要加-f选项强制执行

docker swarm leave -f sy80xt3pc7v7rwdxx23hv467n

docker network inspect $(docker network ls | grep swarm | cut -d ' ' -f 1)

组合命令。查看docker swarm集群的网络信息;展示结果为json字符串

posted @ 2024-05-29 15:33  生命是一团火  阅读(14)  评论(0)    收藏  举报