国内源

镜像加速器

https://yeasy.gitbook.io/docker_practice/install/mirror

  • 查看是否在 docker.service 文件中配置过镜像地址:systemctl cat docker | grep '\-\-registry\-mirror'

安装 docker

  • 安装相关的 docker,docker-ce 为社区版 docker-ee 为企业版
  • 安装前的准备工作

    1
    2
    yum install -y yum-utils
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 安装最新版本的 Docker Engine 和 containerd:yum install -y docker-ce docker-ce-cli containerd.io

  • 安装 docker compose:yum install -y docker-compose-plugin
  • 启动docker:systemctl start docker
  • 查看docker compose版本:docker compose version
  • 设置docker服务开机启动:systemctl enable docker
  • 重启 docker:service docker restart
  • 重启守护进程和 docker
    1
    2
    3
    systemctl daemon-reload
    # 或以信命令
    systemctl restart docker

centos7 docker 镜像

  • 拉取 centos7 的最新版本:docker pull centos:7
    • 不用指定具体的版本号,仅指定大版本号 7 即为 centos7 的最新版本

自定义镜像

官方 centos7 镜像没有 wget 与 curl 命令行工具,可通过自定义镜像的方式添加,Dockerfile 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
# Dockerfile
from centos:7
MAINTAINER "AndyChen<552087293@qq.com>"

RUN sed -i 's|mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum makecache fast

# 安装wget和curl
RUN yum update -y && \
yum install -y wget curl && \
yum clean all

创建并运行自定义镜像

在执行创建命令之前,需要确保已经摘取过 centos7 镜像,拉取命令:docker pull centos:7

1
2
3
4
# 创建镜像
docker build -t centos-wget-curl .
# 以交互方式运行镜像
docker run -it --rm centos-wget-curl

有关自义镜像,可参考我的另外一篇文章:以 docker 方式运行 tomcat 自定义镜像(含应用程序 war 包)

该文章介绍如何创建包含这些元素的自定义镜像:jdk + tomcat + 应用程序 war 包

docker 指令

  • 列出所有容器(包括运行中和已停止的容器):docker ps -a
    • -a:显示所有状态的容器,而不仅仅是正在运行的容器
    • -l:显示最近创建的容器
    • -n:显示指定数量的最近容器
    • -q:仅显示容器 ID
  • 列出所有容器并筛选出与 “redmine” 相关的行:docker ps -a | grep redmine
    • grep 部分:从 docker ps -a 的输出中筛选包含特定模式(字符串或正则表达式)的行
      • 通过容器名称、镜像名或其他字段快速定位目标容器
      • 支持正则表达式匹配,例如 grep “nginx” 会匹配所有包含 “nginx” 的行
      • 常用选项包括 -i(忽略大小写)、-v(反向匹配)和 -n(显示行号)
  • 删除容器:docker rm id,但不能删除正在运行的容器,否则需要使用 rm -rf 删除
  • 递归删除所有的容器:docker rm -f $(docker ps -aq)
  • 搜索 centos7-tomcat8 镜像,对搜索结果不进行截断显示:docker search centos7-tomcat8 --no-trunc
  • 搜索官方 centos 镜像,不截断描述信息:docker search centos --no-trunc --filter is-official=true
  • 搜索官方 redmine 镜像,不截断描述信息:docker search redmine --no-trunc --filter is-official=true
  • 删除特定镜像及其所有标签的所有版本:docker images | grep tomcat | awk '{print $1":"$2}' | xargs docker rmi -f
  • 删除所有未使用的临时的文件系统:docker system prune -f,建议定期执行该指令以及时释放被临时文件占用的空间

    1
    2
    docker system prune -f
    Total reclaimed space: 26.64GB
  • 删除所有停止的容器:docker container prune

  • 删除所有未使用的镜像(没有容器指向它们,也没有标签指向它们):docker image prune
  • 删除所有停止的容器和未使用的镜像:docker system prune
  • 删除所有未使用的卷(卷可能是由已删除的容器所使用):docker volume prune
  • 清理特定时间前的镜像:-- docker image prune -a --filter "until=168h"
    • 注意:会把基础镜像 centos 7、nginx、redis 都删除。谨慎执行
    • 上面的命令会删除所有创建时间超过168小时(7天)的镜像
  • 清理停止的 docker 容器

    1
    2
    docker rm $(docker ps -qf status=exited)
    docker rm `docker ps -a|grep Exited|awk '{print $1}'`
  • 查询已经退出的容器:docker ps -a|grep Exited|awk '{print $1}'

  • 构建镜像,编辑好 Dockerfile 后,执行构建命令。可参考:以 docker 方式运行 tomcat 自定义镜像(含应用程序 war 包)

    1
    docker build -t centos7-tomcat8:230901 .
  • 进入已经运行的容器:docker attach 容器ID,当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。

  • 删除镜像:docker rmi <镜像ID或名称>

    • 如果被删除的镜像已经有运行过的版本,会提示:image is being used by stopped container,删除(docker rm)这些版本后再删除镜像即可
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      [root@AndyCentOS7Basic ~]# docker rmi 9f0491eaa99f
      Error response from daemon: conflict: unable to delete 9f0491eaa99f (must be forced) - image is being used by stopped container 7fc2417c801a
      [root@AndyCentOS7Basic ~]# docker ps -a
      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
      7fc2417c801a centos7-tomcat8:v1 "bash" 10 minutes ago Exited (0) 5 minutes ago romantic_rubin
      1b60c057e72c centos7-tomcat8:v1 "bash" 18 minutes ago Exited (0) 10 minutes ago vigilant_heisenberg
      1b271063392e centos7-tomcat8:v1 "bash" 22 minutes ago Exited (0) 18 minutes ago bold_hamilton
      36313664fb74 centos:7 "bash" 5 hours ago Exited (0) 43 seconds ago optimistic_banach
      7e2b69fcd47b centos:7 "bash" 2 days ago Exited (127) 2 days ago distracted_hoover
      787fdc6939d3 tomcat:8.5.73-jdk8 "bash" 2 days ago Exited (127) 2 days ago competent_blackwell

      # 通过docker rm [container id]删除停止的容器后,再执行docker rmi [image id]就可以成功删除对应的镜像了。
      [root@AndyCentOS7Basic ~]# docker rm 1b271063392e 1b60c057e72c 7fc2417c801a
      1b271063392e
      1b60c057e72c
      7fc2417c801a
      [root@AndyCentOS7Basic ~]# docker rmi 9f0491eaa99f
      Untagged: centos7-tomcat8:v1
      Deleted: sha256:9f0491eaa99f65da1f5a6232fcd7d1f28556086255f434be5b21aec79f73384b
      [root@AndyCentOS7Basic ~]#
  • 删除镜像,报错:image is referenced in multiple repositories

    • 解决:用IMAGE:tag的方式来删除,如:docker rmi centos7-tomcat8:jd
  • docker search 命令详解:https://blog.csdn.net/redrose2100/article/details/127013458
  • Docker 基本命令:https://blog.csdn.net/ying_521125/article/details/129241479

查看某个镜像的版本

  • centos:curl https://hub-mirror.c.163.com/v2/library/centos/tags/list | python -m json.tool
  • nginx:curl https://hub-mirror.c.163.com/v2/library/nginx/tags/list | python -m json.tool
  • redis:curl https://hub-mirror.c.163.com/v2/library/redis/tags/list | python -m json.tool

  • 用 json 格式化输出,方便查看

  • 后面可以加 | more
  • curl 参数解释

    • -m mod run library module as a script (terminates option list)
    • “mod”是“module”的缩写,即“-m”选项后面的内容是 module(模块),其作用是把模块当成脚本来运行。
    • 只需要一行命令 python -m pydoc -p xxx,就能生成 HTML 格式的官方帮助文档
    • python -m 详解:https://blog.csdn.net/qq_45562973/article/details/122678347
  • 如果没有关闭防火墙,那么 curl 连接可能会失败,这也是我遇见的坑

    • service firewalld status:查看状态
    • service firewalld stop:关闭防火墙

操作容器

参考:https://yeasy.gitbook.io/docker_practice/container

  • 启动容器:docker run -i -t -v /root/software/:/mnt/software/ 80e46367f846 /bin/bash
  • 解释:这条命令比较长,我们稍微分解一下,其实包含以下三个部分:docker run <相关参数> <镜像 ID> <初始命令>,其中,相关参数包括:
    -i:表示以“交互模式”运行容器
    -t:表示容器启动后会进入其命令行
    -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>

  • 以交互方式运行容器,最简单的命令:docker run -it tomcat:8.5.73-jdk8 bash

  • 查看当前容器的 linux 版本:cat /etc/os-release
  • 输出 centos 版本号

    • cat /etc/issue
      • cat /etc/redhat-release
        1
        2
        [root@7e2b69fcd47b /]# cat /etc/redhat-release
        CentOS Linux release 7.9.2009 (Core)
  • 输出内核版本号

    • cat /proc/version
    • uname -a
    • uname -r
  • 将文件复制到 docker 镜像:docker cp .\catalina.sh tomcat:/usr/local/tomcat/bin/catalina.sh

临时修改容器内文件

  • 把文件复制到 docker 容器内,反之亦然
    1
    2
    docker cp /root/soft/apache-tomcat-8.5.92/conf/server.xml 774b10be76da:/usr/local/apache-tomcat-8.5.92/conf/
    docker cp /root/soft/apache-tomcat-8.5.92/bin/catalina.sh c2298e50810b:/usr/local/apache-tomcat-8.5.92/bin/

目录挂载

通过docker inspect 容器 id 命令查看是否挂载成功,如果出现 Mounts 属性则挂载成功

  • 使用 python 的 json 模块美化输出,推荐

    1
    2
    docker ps -a | grep taoban-cn
    docker inspect --format="{{json .Mounts}}" 5bb41a794597 | python -m json.tool
  • 查看所有:docker inspect containerID

    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
    "HostConfig": {
    "Binds": [
    "/root/app/webapps/taoban-jd-luck-client-1.0/:/usr/local/apache-tomcat-8.5.92/webapps/app/",
    "/root/app/tomcat-logs:/usr/local/apache-tomcat-8.5.92/logs",
    "/root/app/app-logs:/opt/tomcat/custom-logs",
    "/root/app/config.properties:/opt/tomcat/conf/config.properties",
    "/root/app/webapps/:/usr/local/apache-tomcat-8.5.92/webapps/"
    ],

    "Mounts": [
    {
    "Type": "bind",
    "Source": "/root/app/webapps",
    "Destination": "/usr/local/apache-tomcat-8.5.92/webapps",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
    },
    {
    "Type": "bind",
    "Source": "/root/app/webapps/taoban-jd-luck-client-1.0",
    "Destination": "/usr/local/apache-tomcat-8.5.92/webapps/app",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
    },
    {
    "Type": "bind",
    "Source": "/root/app/tomcat-logs",
    "Destination": "/usr/local/apache-tomcat-8.5.92/logs",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
    },
    {
    "Type": "bind",
    "Source": "/root/app/app-logs",
    "Destination": "/opt/tomcat/custom-logs",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
    },
    {
    "Type": "bind",
    "Source": "/root/app/config.properties",
    "Destination": "/opt/tomcat/conf/config.properties",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
    }
    ],

数据券

Dockerfile 在创建镜像时通过 VOLUME 命令生成匿名卷,需要说明的是,以后两种方式进行挂载的,是不能自己指定目录位置的,一般是 docker 会在安装目录下的指定目录下面生成一个目录来绑定容器的匿名卷(这个指定目录不同版本的docker会有所不同),我当前的目录为:/var/lib/docker/volumes/{容器ID}

  • 创造一个数据卷: docker volume create volumeName
  • 查看所有数据卷: docker volume ls
  • 查看这个数据卷的信息: docker volume inspect volumeName
  • dockerfile 方式挂载
  • 匿名挂载:VOLUME ["镜像内部的路径1","镜像内部的路径2","镜像内部的路径3",.......]
  • 匿名卷位置:/var/lib/docker/volumes
  • 查看匿名卷挂载信息:
    • 用 json 压缩显示:docker inspect –format ‘‘ container_id`,可显示创建时间以及具体的目录
    • 使用 python 的 json 模块美化输出,推荐:docker inspect –format=”“ container_id | python -m json.tool`
  • 删除:docker volume rm my-vol
  • 未使用的数据卷可能会占据很多空间,清理命令:docker volume prune

docker 匿名卷

https://tkstorm.com/docker-doc/image/dockerfile/volume.html
格式为:

1
2
VOLUME ["路径1", "路径2"...]
VOLUME 路径

修改匿名卷的权限

$ sudo chmod -R 777 /var/lib/docker/volumes/0940bc8a288293798a53c0ec05d22dd1c787dafe32d36e178a39a2fa15f0cd8a/_data

查看本地镜像

docker images

删除镜像,报错:image is referenced in multiple repositories

解决:用IMAGE:tag的方式来删除,如:docker rmi centos7-tomcat8:jd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@AndyCentOS7Basic soft]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7-tomcat8 jd de6c972ad276 21 hours ago 562MB
wxjx-cn-east-2.jcr.service.jdcloud.com/centos7-tomcat8 jd de6c972ad276 21 hours ago 562MB
centos 7 eeb6ee3f44bd 23 months ago 204MB

[root@AndyCentOS7Basic soft]# docker rmi de6c972ad276
Error response from daemon: conflict: unable to delete de6c972ad276 (must be forced) - image is referenced in multiple repositories

[root@AndyCentOS7Basic soft]# docker rmi centos7-tomcat8:jd
Untagged: centos7-tomcat8:jd
[root@AndyCentOS7Basic soft]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wxjx-cn-east-2.jcr.service.jdcloud.com/centos7-tomcat8 jd de6c972ad276 21 hours ago 562MB
centos 7 eeb6ee3f44bd 23 months ago 204MB

docker镜像开机启动

  • docker run 指令中加入 --restart=always 就行,docker run --restart=always .....
  • 需注意资源消耗‌:若容器因配置错误持续崩溃,always 策略可能导致频繁重启循环,需结合日志排查问题
  • unless-stopped 的区别‌:unless-stopped 会忽略用户手动停止的容器,更适合需要临时停机的场景
  • 如果创建时未指定 --restart=always ,可通过 update 命令设置

    • 修改后需重启 Docker 服务(systemctl restart docker)或等待下次 Docker 启动生效
      1
      2
      docker update --restart=always redis
      docker update --restart=always nginx
  • 关于 --restart= 等号后面的参数

    • no:容器退出时,不重启容器;
    • on-failure:只有在非 0 状态退出时才从新启动容器;
    • always:无论容器因何原因退出(正常或异常),Docker 都会自动重新启动该容器;
    • unless-stopped:类似 always,但忽略 Docker 守护进程启动前已停止的容器

阿里云镜像服务,个人版

Docker客户端登录时使用的用户名为阿里云账户全名,密码为当前设置的密码
8-32位,必须包含字母、符号或数字中的至少两项

加速文档:https://help.aliyun.com/document_detail/60750.html?spm=a2c4g.348824.0.0.742fa42dEeTNYo

1
2
3
4
5
6
7
8
9
10
11
12
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://x8byeoyx.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}

重启 docker:systemctl daemon-reload && systemctl restart docker
查看运行状态:systemctl status docker

针对 docker 实例的操作

假设容器实例 id 是:5613e4d67d67

挂载目录查看

  • 查看相关的 docker 实例:docker ps -a | grep k8s_main_wxjx
  • 用实例 id 查看目录挂载情况,比如通过上述命令查到的其中一个实例的 id 是 5613e4d67d67:docker inspect --format="" 5613e4d67d67 | python -m json.tool

查容器 ip

docker exec -it 5613e4d67d67 cat /etc/hosts

查看网络详细信息

docker network inspect 5613e4d67d67

进入容器客户端

docker exec -it 5613e4d67d67 /bin/bash

获取网络名

1
2
3
4
5
6
7
docker network ls

[root@k8s-node-vmoprs-0hxbh344bh _data]# docker network ls
NETWORK ID NAME DRIVER SCOPE
bafa69edc41d bridge bridge local
4dd18997c1bf host host local
039004a8f227 none null local

docker 相关教程参考

docker 安装 tomcat,挂载目录,发布项目
https://blog.csdn.net/qq_34324703/article/details/130369493

使用dockerfile构建javaweb环境(jdk8+tomcat8)
https://www.jianshu.com/p/f6d432dc0cd1

基于Docker构建CentOS7_Java8_Tomcat8.5 的镜像及Web应用的部署
https://cloud.tencent.com/developer/article/2200230

idea快速部署项目到Docker-详细版
https://blog.csdn.net/qq_41257365/article/details/107512085

相关文章

docker 相关