一、安装 Docker Compose
Docker Compose 不是通过默认的包管理器(如 yum
)提供的,而是作为一个独立的二进制文件提供。你可以按照以下步骤来安装它,注意docker拉取很多镜像需要梯子:
-
下载最新的 Docker Compose 版本:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.31.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
请注意,这里下载的是x86_64架构的linux版本。
-
给目录增加应用可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
-
验证安装:
docker-compose --version
这条命令会输出已安装的 Docker Compose 的版本信息,确认安装成功。
二、 安装 Docker Registry
Docker Registry 是一个用于存储和分发 Docker 镜像的服务。你可以使用 Docker 官方提供的镜像来运行一个本地的 Registry。
-
拉取 Docker Registry 镜像:
sudo docker pull registry:2
-
运行 Docker Registry:
sudo docker run -d -p 5000:5000 --name myregistry registry:2
这将启动一个本地的 Docker Registry,并将其绑定到主机的 5000 端口上。
-
测试 Docker Registry:
你可以尝试推送一个镜像到这个本地的 Registry 来测试是否一切正常。首先,下载一个公共镜像:sudo docker pull alpine sudo docker images
会看到现有的镜像,输入如下:
REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest 63b790fccc90 2 months ago 7.8MB registry 2 c18a86d35e98 14 months ago 25.4MB
给你的本地镜像打标签:
sudo docker tag alpine localhost:5000/alpine
然后,推送这个镜像到本地 Registry:
sudo docker push localhost:5000/alpine
如果一切顺利,你应该能够看到镜像已经被推送到本地的 Docker Registry 中。
三、Docker Registry常用命令
1、查看 Docker Registry 中的镜像
Docker Registry 提供了一个 RESTful API,你可以使用 curl
命令来查询镜像和标签的信息。
列出所有仓库:
curl -X GET http://localhost:5000/v2/_catalog
输出示例:
{
"repositories": [
"alpine"
]
}
列出特定仓库的所有标签:
curl -X GET http://localhost:5000/v2/alpine/tags/list
输出示例:
{
"name": "alpine",
"tags": [
"latest"
]
}
2、下载(拉取)Docker Registry 中的镜像
拉取镜像:
sudo docker pull localhost:5000/alpine
验证镜像已成功拉取:
sudo docker images
输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:5000/alpine latest 1c6fc209c4dc 2 weeks ago 5.59MB
3、使用docker命令停止 Docker Registry
sudo docker stop myregistry
四、 Docker Registry设置成服务
将 Docker Registry 设置为系统服务,可以确保它在系统启动时自动运行,并且可以通过 systemd
进行管理和控制。以下是具体的步骤:
创建 Docker Registry 的 Systemd 服务文件
-
创建服务文件:
在/etc/systemd/system/
目录下创建一个新的服务文件,例如docker-registry.service
。sudo nano /etc/systemd/system/docker-registry.service
-
编辑服务文件:
在文件中添加以下内容:[Unit] Description=Docker Registry After=network.target [Service] Restart=always ExecStart=/usr/bin/docker run --rm -p 5000:5000 -v /path/to/registry/data:/var/lib/registry --name myregistry registry:2 ExecStop=/usr/bin/docker stop myregistry [Install] WantedBy=multi-user.target
-v /path/to/registry/data:/var/lib/registry
参数将主机上的/path/to/registry/data
目录挂载到容器的/var/lib/registry
目录,用于存储 Registry 数据。这里注意当你使用 docker run 命令启动 Docker Registry 而不指定任何数据卷挂载(即 -v 参数),Docker 会在容器内部使用默认的存储路径来保存镜像数据。具体来说,Docker Registry 默认会将数据存储在容器内的 /var/lib/registry 目录中。然而,这种做 法有一个明显的缺点:当容器停止或删除时,存储在容器内部的数据将会丢失。为了持久化数据,通常建议将宿主机的一个目录挂载到容器内的 /var/lib/registry 目录。防火墙设置:确保防火墙允许访问 5000 端口。
sudo firewall-cmd --zone=public --add-port=5000/tcp --permanent sudo firewall-cmd --reload
-
重新加载 Systemd 配置:
保存并关闭文件后,重新加载systemd
配置以使新的服务文件生效。sudo systemctl daemon-reload
启动和管理 Docker Registry 服务
-
启动服务:
sudo systemctl start docker-registry
-
检查服务状态:
sudo systemctl status docker-registry
这条命令会显示服务的当前状态,包括是否正在运行以及最近的日志信息。
-
设置服务开机自启:
sudo systemctl enable docker-registry
-
停止服务:
sudo systemctl stop docker-registry
-
重启服务:
sudo systemctl restart docker-registry
如果启动报错使用下面命令查看日志,我的就是存在myregistry同名镜像,删除重启就好了。
sudo journalctl -u docker-registry.service -e
同名报错是这样的:
11月 29 11:07:57 localhost.localdomain systemd[1]: Failed to start Docker Registry. 11月 29 11:11:52 localhost.localdomain systemd[1]: Started Docker Registry. 11月 29 11:11:52 localhost.localdomain docker[7960]: docker: Error response from daemon: Conflict. The container name "/myregistry" is already in use by container "964d4e92949760 a5e29421f6c4369b814934d83d7fd01> 11月 29 11:11:52 localhost.localdomain docker[7960]: See 'docker run --help'.
五、 Docker Compose集合性部署
我们可以使用 Docker Compose 配合Dockrdile实现项目部署,这里基础使用Ubuntu 20.04作为基础镜像,并安装JDK 11的。
Dockerfile 文件名simple.Dockerfile
# 使用Ubuntu 20.04作为基础镜像
FROM ubuntu:20.04
# 设置环境变量以避免交互式配置
ENV DEBIAN_FRONTEND=noninteractive
# 更新包列表并安装必要的工具
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y software-properties-common curl vim
# 安装OpenJDK 11
RUN apt-get update && \
apt-get install -y openjdk-11-jdk
# 验证Java安装
RUN java -version
# 设置JAVA_HOME环境变量
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
ENV PATH=$JAVA_HOME/bin:$PATH
# 创建工作目录
RUN mkdir -p /app
WORKDIR /app
# 暴露端口(可选,根据需要)
# EXPOSE 8080
# 默认命令(可选,根据需要)
CMD ["java", "-version"]
docker-compose.yml
接下来,创建一个名为 docker-compose.yml
的文件,内容如下:
version: '3.8'
services:
jdk11:
build:
context: .
dockerfile: simple.Dockerfile
container_name: jdk11-container
image: my-jdk11
ports:
- "8080:8080" # 如果您的应用需要暴露端口,可以在这里配置
volumes:
- ./app:/app # 将本地的app目录挂载到容器的/app目录
environment:
- JAVA_OPTS=-Xmx512m -Xms256m # 可以在这里设置Java启动参数
command: ["java", "-version"] # 默认命令
构建和运行
-
构建镜像:
在包含Dockerfile
和docker-compose.yml
文件的目录中,运行以下命令来构建镜像:sudo docker compose build
成功后输出:
[liuruifeng@localhost dockercomplex]$ sudo docker compose build WARN[0000] /home/dockercomplex/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion [+] Building 8.8s (11/11) FINISHED docker:default => [jdk11 internal] load build definition from simple.Dockerfile 0.0s => => transferring dockerfile: 805B 0.0s => [jdk11 internal] load metadata for docker.io/library/ubuntu:20.04 8.8s => [jdk11 internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [jdk11 1/6] FROM docker.io/library/ubuntu:20.04@sha256:8e5c4f0285ecbb4ead070431d29b576a530d3166df73ec44affc1cd27555141b 0.0s => CACHED [jdk11 2/6] RUN apt-get update && apt-get upgrade -y && apt-get install -y software-properties-common curl vim 0.0s => CACHED [jdk11 3/6] RUN apt-get update && apt-get install -y openjdk-11-jdk 0.0s => CACHED [jdk11 4/6] RUN java -version 0.0s => CACHED [jdk11 5/6] RUN mkdir -p /app 0.0s => CACHED [jdk11 6/6] WORKDIR /app 0.0s => [jdk11] exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:17b65fb330f6557b8bc52ee3203b06fee3c0fa1318c6f0561013e6b1deb66130 0.0s => => naming to docker.io/library/my-jdk11 0.0s => [jdk11] resolving provenance for metadata file
-
运行容器:
使用以下命令来启动容器:sudo docker compose up -d
成功后输出:
[liuruifeng@localhost dockercomplex]$ sudo docker compose up -d WARN[0000] /home/dockercomplex/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion [+] Running 2/2 ✔ Network dockercomplex_default Created 0.2s ✔ Container jdk11-container Started
-
查看日志:
如果您想查看容器的日志,可以使用以下命令:sudo docker compose logs jdk11
-
验证服务状态
你可以使用以下命令来验证服务的状态:
sudo docker compose ps
-
停止和删除容器:
如果您想停止并删除容器,可以使用以下命令:sudo docker compose down
解释
-
Dockerfile:
- 基础镜像:使用
ubuntu:20.04
。 - 更新包列表并安装必要的工具。
- 安装OpenJDK 11。
- 设置
JAVA_HOME
环境变量。 - 创建工作目录并设置默认命令。
- 基础镜像:使用
-
docker-compose.yml:
- 定义一个名为
jdk11
的服务。 - 指定构建上下文和Dockerfile路径。
- 设置容器名称和镜像名称。
- 暴露端口(如果需要)。
- 挂载本地目录到容器中。
- 设置环境变量和默认命令。
- 定义一个名为
以上就是如何在 CentOS Stream 上安装 Docker Compose 和 Docker Registry 的基本步骤。后续会提供安装更强大的企业级镜像仓库harbor