🚧 Docker
约 7659 字大约 26 分钟
2026-03-28
并不是经常需要安装,所以安装的章节放在最后了。
Docker 架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
相关的概念:
| 概念 | 说明 |
|---|---|
| Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
| Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
| Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/ ) 与 Docker 的守护进程通信。 |
| Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
| Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub(https://hub.docker.com ) 提供了庞大的镜像集合供使用。 一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
| Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
Docker 镜像
显示本地镜像
使用 docker images 来列出本地主机上的镜像。
docker images输出中各个选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为 15.10 的ubuntu系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:15.10 /bin/bash参数说明:
- -i: 交互式操作。
- -t: 终端。
显示镜像信息
返回镜像信息
docker images -q- q - 它告诉docker命令仅返回镜像的ID。
输出将显示有关镜像的详细信息。
docker inspect Repository- Repository - 这是镜像的名称。
下载镜像
使用 docker pull 命令来下载新的镜像。
docker pull查找镜像
可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
docker search httpd输出说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
镜像代理
cat /etc/docker/daemon.json{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://94mv0tmt.mirror.aliyuncs.com"
]
}sudo systemctl daemon-reexecsudo systemctl restart docker删除镜像
删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:
$ docker rmi hello-world创建/更新镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1、从已经创建的容器中更新镜像,并且提交这个镜像
- 2、使用 Dockerfile 指令来创建一个新的镜像
更新镜像
使用镜像来创建一个容器。
docker run -t -i ubuntu:15.10 /bin/bash在运行的容器内使用 apt-get update命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 e218edb10161 的容器,是按需求更改的容器。可以通过命令 docker commit 来提交容器副本。
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2- -m: 提交的描述信息
- -a: 指定镜像作者
- e218edb10161:容器 ID
- runoob/ubuntu:v2: 指定要创建的目标镜像名
可以使用 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2:
docker images使用新镜像 runoob/ubuntu 来启动一个容器
docker run -t -i runoob/ubuntu:v2 /bin/bash创建镜像
使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
runoob@runoob:~$ cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
runoob@runoob:~$ docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
---> Using cache
---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
---> Using cache
---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......参数说明:
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用 docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/centos 6.7 860c279d2fec About a minute ago 190.6 MB我们可以使用新的镜像来创建容器
runoob@runoob:~$ docker run -t -i runoob/centos:6.7 /bin/bash
[root@41c28d18b5fb /]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)从上面看到新镜像已经包含创建的用户 runoob。
设置镜像标签
可以使用 docker tag 命令,为镜像添加一个新的标签(dev)。
docker tag 860c279d2fec runoob/centos:dev- 860c279d2fec 镜像ID
- runoob/centos:dev 用户名称/镜像源名(repository name):新的标签名(tag)。
使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/centos 6.7 860c279d2fec 5 hours ago 190.6 MB
runoob/centos dev 860c279d2fec 5 hours ago 190.6 MB导出/入镜像
docker save -o maven.tar maven:3.9.6-eclipse-temurin-8maven.tar 其实是个路径+文件,没有路径就是当前文件
这会在当前目录生成 maven.tar。
docker load -i maven.tar简而言之:
docker save -o用来 输出镜像到一个 tar 文件。docker load -i用来 输入镜像从 tar 文件加载到 Docker。
Docker 容器
容器流转状态

运行一个容器内的应用程序
例如 Hello World:
docker run ubuntu:15.10 /bin/echo "Hello world"- ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo "Hello world": 在启动的容器里执行的命令。
Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
通过 docker 的两个参数 -i -t,让 docker 运行的容器实现交互式的能力:
docker run -i -t ubuntu /bin/bash- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。
创建一个以进程方式运行的容器
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"docker ps 来查看是否容器有在运行。
docker psdocker ps默认列出正在运行的容器,docker ps -a会显示所有状态的容器。
输出详情介绍:
- CONTAINER ID: 容器 ID。
- IMAGE: 使用的镜像。
- COMMAND: 启动容器时运行的命令。
- CREATED: 容器的创建时间。
- STATUS: 容器状态。
状态有7种:
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
- PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
- NAMES: 自动分配的容器名称。
在宿主主机内使用 docker logs 命令,查看容器内的标准输出:
docker logs 2b1b7a428627使用 docker stop 命令来停止容器:
docker stop 2b1b7a428627docker history ImageID
使用此命令,您可以通过容器查看通过映像运行的所有命令。
docker history ImageID输出的内容包含以下属性:
- IMAGE - 镜像
- CREATED - 构建的时间
- CREATED BY - 构建时候运行的命令
- SIZE - 大小
- COMMENT - 注释
Docker 使用容器
查看容器
查看所有的容器命令如下:
docker ps -a使用 docker top 命令,您可以查看容器中的顶级进程。
docker top ContainerID输出的内容包含以下属性:
- UID - 运行容器的用户
- PID - 进程id
- PPID - 父进程id
- C -
- STIME - 上次运行的时刻
- TTY - 运行的终端
- TIME -
- CMD - 运行的命令
命令 docker stats 用于提供正在运行的容器的统计信息。
docker rm ContainerID成功运行输出:容器运行时候内存和 CPU 使用率等信息
- CONTAINER ID - 容器id
- NAME - 名称
- CPU % - CPU使用率
- MEM USAGE / LIMIT - 内存使用/内存限制
- MEM % - 内存使用率
- NET I/O - 网络IO情况
- BLOCK I/O - 硬盘IO情况
- PIDS - 进程id数
启动容器
docker start mysql8以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
docker run -it ubuntu /bin/bash- -i: 交互式操作。
- -t: 终端。
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:
exit启动已经停止的容器
docker start b750bbbcfd88- b750bbbcfd88 是容器的 ID
后台运行容器
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
docker run -itd --name ubuntu-test ubuntu /bin/bash注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec
暂停容器
命令 docker pause 用于暂停正在运行的容器。
docker pause ContainerID命令 docker unpause 用于取消暂停的容器。
docker unpause ContainerID停止容器
停止容器的命令如下:
docker stop <容器 ID>停止的容器可以通过 docker restart 重启:
docker restart <容器 ID>看容器日志
docker logs 基本用法
docker logs [OPTIONS] CONTAINER- CONTAINER:容器名或容器ID
常用参数总结
| 参数 | 功能 |
|---|---|
-f, --follow | 实时跟踪日志输出(类似 tail -f) |
--since <时间> | 显示指定时间之后的日志,例如 --since 1h表示最近1小时 |
--until <时间> | 显示指定时间之前的日志 |
--tail <行数> | 只显示最近 N 行日志,例如 --tail 100 |
-t, --timestamps | 显示日志时间戳 |
--details | 显示附加的容器日志元信息(一般少用) |
示例
# 实时跟踪容器日志
docker logs -f my_container
# 查看最近 50 行日志
docker logs --tail 50 my_container
# 查看最近 2 小时的日志
docker logs --since 2h my_container
# 查看日志并带时间戳
docker logs -t my_container💡 小技巧:
- 可以组合参数:
docker logs -f --tail 100 -t my_container表示:实时跟踪容器,显示最近 100 行,并带时间戳。
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker attachdocker exec -it [ID] bash推荐使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
导入/导出容器
导出
如果要导出本地某个容器,可以使用 docker export 命令。
docker export 1e560fca3906 > ubuntu.tar导出容器 1e560fca3906 快照到本地文件 ubuntu.tar
导入
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
cat docker/ubuntu.tar | docker import - test/ubuntu:v1也可以通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo删除容器
删除容器使用 docker rm 命令:
docker rm -f 1e560fca3906下面的命令可以清理掉所有处于终止状态的容器。
docker container prune终止容器中的进程
docker kill ContainerID容器生命周期
- 最初,Docker容器将处于创建状态。
- 然后,当使用
docker run命令时,Docker容器进入运行状态。 docker kill命令用于终止现有的Docker容器。docker pause命令用于暂停现有的Docker容器。docker stop命令用于暂停现有的Docker容器。docker run命令用于将容器从停止状态恢复到运行状态。
Web 应用容器
创建 web 容器
在docker容器中运行一个 Python Flask 应用来运行一个 web 应用。
docker pull training/webappdocker run -d -P training/webapp python app.py- -d:让容器在后台运行。
- -P:将容器内部使用的网络端口随机映射到我们使用的主机上。
查看 web 容器
使用 docker ps 来查看我们正在运行的容器:
runoob@runoob:~# docker ps
CONTAINER ID IMAGE COMMAND ... PORTS
d3d5e39ed9d3 training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp这里多了端口信息。0.0.0.0:32769->5000/tcp。可在浏览器中通过32769端口访问。
查询最后一次创建的容器:
docker ps -l设置端口号
也可以通过 -p 参数来设置不一样的端口:
docker run -d -p 5000:5000 training/webapp python app.py使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
docker port <容器ID/容器名字>查看日志
docker logs <容器ID/容器名字>查看 web 应用中的进程
docker top <容器ID/容器名字>检查 web 程序
使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker inspect <容器ID/容器名字>停止 web 容器
docker stop <容器ID/容器名字>重启 web 容器
已停止的容器
docker start <容器ID/容器名字>正在运行的容器
docker restart <容器ID/容器名字>删除 web 容器
docker rm <id>删除容器时,容器必须是停止状态,否则会报如下错误
Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force removedocker rm -f <id>Docker 网络
列出所有Docker网络
docker network ls检查 Docker网络
如果要查看与Docker关联的网络的更多详细信息,可以使用 docker network inspect 命令。
docker network inspect networkname- networkname - 需要检查的网络的名称。
创建新网络
可以在启动容器之前在Docker中创建网络。这可以使用以下命令完成
docker network create --driver drivername name- drivername - 这是用于网络驱动程序的名称。
- name - 这是给网络的名称。
返回值:该命令将输出新网络的长ID。
网络端口映射
使用 -P 绑定端口号,也可以使用 -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
- -P :是容器内部端口随机映射到主机的端口。
- -p : 是容器内部端口绑定到指定的主机端口。
使用 docker ps 来查看我们正在运行的容器,即可检查。
另外,可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py这样就可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口。
上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.pyDocker 容器连接
容器命名
当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 标识来命名容器,例如:
docker run -d -P --name runoob training/webapp python app.py容器连接
【例 1】
- 创建 Docker 网络
-d:参数指定 Docker 网络类型,有 bridge、overlay。
其中 overlay 网络类型用于 Swarm mode。 - 连接容器
运行一个容器并连接到新建的 test-net 网络:
docker run -itd --name test1 --network test-net ubuntu /bin/bash打开新的终端,再运行一个容器并加入到 test-net 网络:
docker run -itd --name test2 --network test-net ubuntu /bin/bash- 通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。
如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping(即学即用:可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)。
apt-get updateapt install iputils-ping**如果你有多个容器之间需要互相连接,推荐使用 ****Docker Compose**
【例 2】
Container Linking允许多个容器相互链接。这是比暴露端口更好的选择。
- 使用
pull命令下载 Jenkins 镜像。
docker pull jenkins- 运行容器
docker run --name=jenkinsa -d jenkins- 启动目标容器
docker run --name=reca --link=jenkinsa:alias-src -it ubuntu:latest /bin/bashCtrl+P然后 Ctrl+Q 退出目标容器,然后 sudo docker ps 可以看到有两个容器正在运行。
- 连接到接收容器
docker attach reca然后运行env命令。您会注意到与源容器链接的新变量(以ALIAS_SRC_为前缀的变量)。
Docker 仓库管理
公共仓库 Docker Hub
仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
登录/退出
登录
docker login退出
docker logout搜索镜像
docker search <镜像名>拉取镜像
docker pull <镜像名>推送镜像
docker push Repositoryname镜像标记
docker tag imageID Repositoryname私有仓库【registry】
您可能需要拥有自己的私有存储库。您可能不想在Docker Hub上托管存储库。为此,Docker中有一个存储库容器。让我们看看如何下载和使用容器进行注册。
- 使用
docker run命令下载私有注册表。这可以使用以下命令完成。
sudo docker run -d -p 5000:5000 --name registry registry:2关于上述命令需要注意以下几点:
- **registry** 是Docker管理的容器,可用于托管私有存储库。
- 容器公开的端口号是5000.因此,使用-p命令,我们将相同的端口号映射到本地主机的5000端口号。
- 我们只是将registry容器标记为“2”,以便在Docker主机上区分它。
- **-d** 选项用于运行分离模式的容器。这样容器可以在后台运行
参数介绍
-d
全称 --detach,意思是 后台运行容器。
容器启动后不会占用你的终端,可以继续做其他操作。
-p 5000:5000
映射端口,把 宿主机的 5000 端口 映射到 容器的 5000 端口。
格式:宿主机端口:容器端口
这样你可以通过 http://虚拟机IP:5000 访问容器里的服务。
--name registry
给这个容器取一个名字叫 registry,方便后续用名字管理(停止、重启、查看日志等)。
registry:2
指定容器镜像,这里是官方的 Docker Registry 镜像,版本是 2。
Docker 会先在本地找这个镜像,如果没有,会从 Docker Hub 下载。
为什么是版本 2
- Docker 官方 Registry 镜像从一开始有 v1、v2 两个版本。
- v2 是目前推荐使用的版本,功能更完善,也更安全。
- 官方文档和 Docker Hub 上,
registry镜像明确标注最新稳定版是2,所以大家通常写registry:2。可以在 Docker Hub 上看到:
- 地址:https://hub.docker.com/_/registry
- 页面里就有
Tags列表,其中2就是官方提供的 v2 版本镜像。
- 标记一个现有镜像,以便我们可以将它推送到我们的本地存储库。以 Ubuntu 为例。将其标记为私有存储库并添加标记名称ubantu。
sudo docker tag 3556258649b2 localhost:5000/ubuntu关于上述命令需要注意以下几点
- 3556258649b2指的是centos图像的镜像ID 。
- localhost:5000是我们的私有存储库的位置。
- 我们在我们的私有存储库中将存储库名称标记为ubuntu。
- 用
docker push命令将存储库推送到我们的私有存储库。
sudo docker push localhost:5000/ubuntu- 查看私有仓库内容
Registry 自带 API,可以这样查看:
curl http://localhost:5000/v2/_catalog- 这个命令会返回私有仓库里有哪些镜像,例如:
{"repositories":["ubuntu"]}- 查看某个镜像的 tag:
curl http://localhost:5000/v2/ubuntu/tags/list输出可能是:
{"name":"ubuntu","tags":["latest"]}docker rmi命令删除 Ubuntu 设置的本地镜像。
sudo docker rmi ubuntusudo docker rmi 3556258649b2- 现在我们的本地机器上没有任何 Ubuntu 镜像,现在我们可以使用以下
docker pull命令从我们的私有存储库中提取 Ubuntu 镜像。
sudo docker pull localhost:5000/ubuntu启动
docker ps -a | grep registrydocker start registry非 HTTPS 访问
默认 push 是 https
vim /etc/docker/daemon.json{
"insecure-registries" : ["172.16.30.131:5000"]
}加密
最简单的给 本地 Docker Registry 加账号密码 的方法。
1️⃣ 安装 htpasswd 工具
htpasswd 用来生成用户名密码文件:
sudo dnf install httpd-tools -y2️⃣ 创建认证文件
假设我们创建一个用户名 admin,密码 Fxsd1100:
mkdir -p /home/rocky/registry_auth
htpasswd -Bc /home/rocky/registry_auth/htpasswd admin-B→ 使用 bcrypt 加密-c→ 创建新文件(第一次用,之后再加用户不要用-c)- 会提示输入密码
生成的文件内容类似:
admin:$2y$05$xxxxxxxxxxxxxxxxxxxxxx3️⃣ 重启 Registry 并挂载认证文件
假设你原来的命令是:
sudo docker run -d -p 5000:5000 --name registry registry:2修改为:
sudo docker stop registry
sudo docker rm registry
sudo docker run -d \
-p 5000:5000 \
--name registry \
-v /home/rocky/registry_auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
registry:2解释:
-v /home/rocky/registry_auth:/auth→ 挂载认证文件到容器里REGISTRY_AUTH=htpasswd→ 开启 htpasswd 认证REGISTRY_AUTH_HTPASSWD_REALM→ 认证域名,可随意写REGISTRY_AUTH_HTPASSWD_PATH→ htpasswd 文件路径
4️⃣ 测试
- 用 curl 拉取镜像:
curl -u admin:Fxsd1100 http://localhost:5000/v2/_catalog- 如果认证成功,会看到仓库列表;不输入用户名密码会 401 报错。
✅ 现在 TeamCity 配置 Registry 时:
- Registry address:
http://<虚拟机IP>:5000 - Username:
admin - Password:
Fxsd1100
就可以推镜像了。
Docker volumes(卷)
docker volume create my_dataDocker 卷默认存储在宿主机的路径(具体路径取决于 Docker 的存储驱动):
/var/lib/docker/volumes/<卷名>/_data例如,创建了一个卷 mongodb_data,数据实际存储在:
/var/lib/docker/volumes/mongodb_data/_data可以通过宿主机直接查看:
sudo ls /var/lib/docker/volumes/mongodb_data/_datadocker volume lsdocker volume inspect mongodb_data[
{
"Name": "mongodb_data",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/mongodb_data/_data",
"Labels": {},
"Scope": "local"
}
]输出中 "Mountpoint" 就是宿主机上的实际路径。
在容器里查看数据
docker exec -it mongodb bashls /data/db这里就是 MongoDB 数据库存储的位置(对应卷挂载的路径)。
挂载到自定义宿主机路径
如果希望卷的数据直接存放在宿主机某个目录(比如 /opt/data/mongodb),可以在创建容器时指定
docker run -d \
--name mongodb \
-v /opt/data/mongodb:/data/db \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=your_password \
mongo:latest-v 的基本格式:
-v <宿主机路径>:<容器路径>[:选项]🚧 Docker Dockerfile
Docker Compose
Docker 和 Docker Compose 的关系
- Docker:相当于一个“单机容器引擎”,你可以用它来运行一个容器,比如
docker run mysql:8就能跑一个 MySQL。 - Docker Compose:是 Docker 的编排工具,可以把多个容器写在一个配置文件里(一般是
docker-compose.yml),一条命令就能把它们全部启动起来。
装了 docker 只需要安装就好。
docker compose versionsudo dnf install docker-compose-plugin -y注意
注意:新版本 Docker(Docker CLI v23+)已经集成 compose,命令是 docker compose 而不是 docker-compose。
案例
编写 docker-compose.yml
根据你提供的镜像和依赖顺序(假设依赖顺序:mysql/mongo/rabbitmq/redis/minio → web-server-1),可以写成:
version: "3.9"
services:
mysql:
image: mysql:8
container_name: mysql8
environment:
MYSQL_ROOT_PASSWORD: Fxsd1100
ports:
- "3306:3306"
restart: always
mongodb:
image: mongo:latest
container_name: mongodb
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: Fxsd1100
ports:
- "27017:27017"
restart: always
rabbitmq:
image: rabbitmq:management
container_name: rabbitmq
ports:
- "5672:5672"
- "15672:15672"
restart: always
redis:
image: redis:latest
container_name: redis
ports:
- "6379:6379"
restart: always
minio:
image: minio/minio:RELEASE.2025-04-22T22-12-26Z
container_name: minio-dev
command: server /data --console-address ":9001"
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: Fxsd1100
restart: always
web-server-1:
image: 172.16.30.131:5000/web-server-1:28
container_name: web-server-1
ports:
- "8080:8080"
depends_on:
- mysql
- mongodb
- rabbitmq
- redis
- minio
restart: always使用 docker-compose 启动
在 docker-compose.yml 所在目录执行:
docker compose up -d-d表示后台启动- 启动后可以查看状态:
docker compose ps- 查看日志:
docker compose logs -f web-server-1docker compose pull web-server-1
docker compose up -d就能更新容器。
🚧 Docker Machine
🚧 Swarm 集群管理
Docker 安装
Docker For MacOS
警告
Docker Desktop 并不是商业免费的工具,建议用 Linux 版本的 Docker Desktop
直接在官网安装桌面版本就好了。
Docker For Linux
Docker For CentOS
相关信息
2023.12.9
目前最新的 docker 社区版叫 docker-ce
安装方式如下
sudo yum install yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce
sudo systemctl enable docker
sudo systemctl start docker命令执行默认为 root,如果没有请切换或加 sudo
安装 Docker
- 查看 CentOS 内核 版本
Linux 内核:官方建议 3.10 以上。 - 使用 root 权限更新 yum 包(生产环境中此步操作需慎重,看自己情况,学习的话随便搞)
这个命令不是必须执行的,看个人情况,后面出现不兼容的情况的话就必须update了
注意
yum -y update:升级所有包同时也升级软件和系统内核;
yum -y upgrade:只升级所有包,不升级软件和系统内核- 卸载旧版本(如果之前安装过的话)
yum remove docker docker-common docker-selinux docker-engine- 安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2- 设置 yum 源(阿里仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo- 安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:
yum install docker-ce docker-ce-cli containerd.io- 查看可用版本有哪些
yum list docker-ce --showduplicates | sort -r- 通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io例如:
yum install docker-ce-20.10.3 docker-ce-cli-20.10.3 containerd.io- 启动 Docker 并设置开机自启
systemctl start dockersystemctl enable docker- 通过运行 hello-world 映像来验证。
run hello-world卸载 Docker
- 删除安装包:
yum remove docker-ce- 删除镜像、容器、配置文件等内容:
rm -rf /var/lib/docker参考:
- centos7安装Docker详细步骤(无坑版教程) - 云+社区 - 腾讯云 (tencent.com)
- CentOS Docker 安装 | 菜鸟教程 (runoob.com)
- Docker for CentOS 安装 - 蝴蝶教程 (jc2182.com)
Docker For Ubuntu
- 卸载旧版本
apt-get remove docker docker-engine docker.io containerd runc- 使用 Docker 仓库进行安装,使用 Docker 仓库进行安装。
更新 apt 包索引。
apt-get update- 安装 apt 依赖包,用于通过HTTPS来获取仓库:
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common- 添加 Docker 的官方 GPG 密钥:
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥。
apt-key fingerprint 0EBFCD88- 使用以下指令设置稳定版仓库
add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable"- 安装 Docker Engine-Community
更新 apt 包索引。
apt-get update- 安装最新版本的 Docker Engine-Community 和 containerd ,或者转到下一步安装特定版本:
apt-get install docker-ce docker-ce-cli containerd.io- 要安装特定版本的 Docker Engine-Community,请在仓库中列出可用版本,然后选择一种安装。列出您的仓库中可用的版本:
apt-cache madison docker-ce使用第二列中的版本字符串安装特定版本,例如 5:18.09.13-0ubuntu-xenial。
apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io- 测试 Docker 是否安装成功,输入以下指令,打印出以下信息则安装成功:
docker run hello-worldDocker for Windows
警告
Docker Desktop 并不是商业免费的工具,建议用 Linux 版本的 Docker Desktop
在 Windows 中安装,需要开启虚拟化(一般为默认开启)和 Hyper-V 功能。
在 Docker 官网中下载安装包。下载地址:
如果出现了 WSL 2 的错误,参见:旧版 WSL 的手动安装步骤 | Microsoft Docs
Docker 加速
原文见:Docker 镜像加速 | 菜鸟教程 (runoob.com)
Ubuntu/CentOS
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://94mv0tmt.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker相关资源
Docker 资源
- Docker 官方主页: https://www.docker.com
- Docker 官方博客: https://blog.docker.com/
- Docker 官方文档: https://docs.docker.com/
- Docker Store: https://store.docker.com
- Docker Cloud: https://cloud.docker.com
- Docker Hub: https://hub.docker.com
- Docker 的源代码仓库: https://github.com/moby/moby
- Docker 发布版本历史: https://docs.docker.com/release-notes/
- Docker 常见问题: https://docs.docker.com/engine/faq/
- Docker 远端应用 API: https://docs.docker.com/develop/sdk/
Docker 国内镜像
阿里云的加速器:https://help.aliyun.com/document_detail/60750.html
网易加速器:http://hub-mirror.c.163.com
官方中国加速器:https://registry.docker-cn.com
ustc 的镜像:https://docker.mirrors.ustc.edu.cn
daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)
版权所有
版权归属:FelixJY
