国内源
- 可以选择国内的一些源地址
- 阿里云:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 清华大学源:https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
镜像加速器
https://yeasy.gitbook.io/docker_practice/install/mirror
- 查看是否在 docker.service 文件中配置过镜像地址:
systemctl cat docker | grep '\-\-registry\-mirror'
安装 docker
- 安装相关的 docker,docker-ce 为社区版 docker-ee 为企业版
安装前的准备工作
1
2yum 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
3systemctl 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(显示行号)
- grep 部分:从 docker ps -a 的输出中筛选包含特定模式(字符串或正则表达式)的行
- 删除容器:
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
2docker 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
2docker 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
2docker 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
2docker 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`
- 用 json 压
- 删除:
docker volume rm my-vol
- 未使用的数据卷可能会占据很多空间,清理命令:
docker volume prune
docker 匿名卷
https://tkstorm.com/docker-doc/image/dockerfile/volume.html
格式为:1
2VOLUME ["路径1", "路径2"...]
VOLUME 路径
- 运行时可以覆盖这个挂载设置,加 -v 参数
- Docker 匿名卷、命名卷与绑定挂载:http://www.inspinia.net/a/13946.html
修改匿名卷的权限
$ 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
2docker update --restart=always redis
docker update --restart=always nginx
- 修改后需重启 Docker 服务(systemctl restart docker)或等待下次 Docker 启动生效
关于
--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 | { |
针对 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 | docker network ls |
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