Docker基础
Docker 基础
Docker是一个开源的应用容器引擎,而一个容器containers其实是一个虚拟化的独立的环境,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 的局限性之一,它只能用在 64 位的操作系统上。
官方安装教程
https://docs.docker.com/engine/install/centos/
安装一些必要的系统工具
1 | sudo yum install -y yum-utils device-mapper-persistent-data lvm2 |
添加软件源信息
1 | # docker 官方源 |
可选:启用 edge
和 test
存储库。
这些存储库包含在上面的 docker.repo
文件中,但默认情况下处于禁用状态。您可以将它们与稳定存储库一起启用。
1 | $ sudo yum-config-manager --enable docker-ce-edge |
您可以通过使用 --disable
标志运行
yum-config-manager
命令来禁用边缘或测试存储库。
要重新启用它,请使用 --enable
标志。 以下命令禁用
edge
存储库:
1 | $ sudo yum-config-manager --disable docker-ce-edge |
安装 Docker-ce
1 | # 安装前可以先更新 yum 缓存: |
如果你想安装特定 docker-ce
版本,先列出 repo
中可用版本,然后选择安装
1 | $ yum list docker-ce --showduplicates | sort -r |
启动 Docker 后台服务
1 | $ sudo systemctl start docker |
通过运行 hello-world
镜像,验证是否正确安装了
docker
。
1 | $ docker run hello-world |
旧版本安装
1 | yum install docker # CentOS 中安装 |
命令介绍
1 | $ docker --help |
Docker 是一个开源的容器化平台,旨在帮助开发者和运维人员更容易地创建、部署和运行应用程序。它通过将应用程序和它们的依赖打包在一起来简化这些过程。Docker 提供了一组命令来管理容器、镜像和网络。
管理命令
这些命令用于管理不同的 Docker 资源,例如容器、镜像和网络。
- container: 管理容器,包括启动、停止、删除容器等操作。
- image: 管理镜像,包括拉取、删除和列出镜像等操作。
- network: 管理网络,包括创建、删除和列出网络等操作。
常用命令
attach: 介入到一个正在运行的容器,允许你访问容器的标准输入、输出和错误流。相当于连接到容器的控制台。
1
docker attach <container_id>
build: 根据 Dockerfile 构建一个镜像。你可以在 Dockerfile 中定义镜像的构建步骤。
1
docker build -t <image_name> <path_to_dockerfile>
commit: 根据容器的更改创建一个新的镜像。
1
docker commit <container_id> <new_image_name>
cp: 在本地文件系统与容器中复制文件/文件夹。
1
2docker cp <container_id>:<container_path> <local_path>
docker cp <local_path> <container_id>:<container_path>create: 创建一个新容器,但不启动它。
1
docker create <image_name>
exec: 在容器中执行一条命令。
1
docker exec <container_id> <command>
images: 列出所有本地存储的镜像。
1
docker images
kill: 杀死一个或多个正在运行的容器。
1
docker kill <container_id>
logs: 取得容器的日志。
1
docker logs <container_id>
pause: 暂停一个或多个容器的所有进程。
1
docker pause <container_id>
ps: 列出所有容器。
1
docker ps
pull: 从 registry 拉取一个镜像或仓库。
1
docker pull <image_name>
push: 推送一个镜像或仓库到 registry。
1
docker push <image_name>
rename: 重命名一个容器。
1
docker rename <old_name> <new_name>
restart: 重新启动一个或多个容器。
1
docker restart <container_id>
rm: 删除一个或多个容器。
1
docker rm <container_id>
rmi: 删除一个或多个镜像。
1
docker rmi <image_name>
run: 在一个新的容器中执行一条命令。
1
docker run <image_name> <command>
search: 在 Docker Hub 中搜索镜像。
1
docker search <image_name>
start: 启动一个或多个已经停止运行的容器。
1
docker start <container_id>
stats: 显示一个容器的实时资源占用情况。
1
docker stats <container_id>
stop: 停止一个或多个正在运行的容器。
1
docker stop <container_id>
tag: 为镜像创建一个新的标签。
1
docker tag <image_name> <new_image_name>
top: 显示一个容器内的所有进程。
1
docker top <container_id>
unpause: 恢复一个或多个容器内所有被暂停的进程。
1
docker unpause <container_id>
Docker 服务管理命令
启动 Docker 服务
1
service docker start
- 解释: 启动 Docker 守护进程,使 Docker 服务开始运行。启动后,你可以使用 Docker 命令来管理容器和镜像。
停止 Docker 服务
1
service docker stop
- 解释: 停止 Docker 守护进程,使 Docker 服务停止运行。这会停止所有正在运行的容器。
查看 Docker 服务状态
1
service docker status
- 解释: 查看 Docker 服务的当前状态,显示服务是否正在运行以及相关信息。如果 Docker 服务正在运行,会显示服务的 PID(进程 ID)和运行状态。
设置 Docker 服务为开机启动
1
chkconfig docker on
- 解释: 将 Docker 服务设置为系统启动时自动启动。这样,当系统重启时,Docker 服务会自动启动,无需手动启动。
示例
假设你正在一台新安装的 Linux 服务器上配置 Docker 服务,并希望在系统启动时自动启动 Docker 服务。你可以按以下步骤操作:
启动 Docker 服务:
1
sudo service docker start
- 这将启动 Docker 守护进程。
验证 Docker 服务已启动:
1
sudo service docker status
- 这将显示 Docker 服务的运行状态。
设置 Docker 服务为开机自动启动:
1
sudo chkconfig docker on
- 这将确保 Docker 服务在每次系统启动时自动启动。
验证 Docker 配置是否正确:
- 重新启动系统,并使用
service docker status
验证 Docker 服务是否自动启动并正在运行。
- 重新启动系统,并使用
补充说明
service
命令: 用于启动、停止和查看系统服务的状态。适用于大多数基于 SysV init 的 Linux 发行版,如 CentOS 6。chkconfig
命令: 用于管理系统启动时哪些服务应该自动启动。适用于基于 SysV init 的系统。
在较新的基于 systemd 的系统(如 CentOS 7 及更高版本、Ubuntu 16.04
及更高版本)中,service
和 chkconfig
命令通常被 systemctl
命令替代:
启动 Docker 服务:
1
sudo systemctl start docker
停止 Docker 服务:
1
sudo systemctl stop docker
查看 Docker 服务状态:
1
sudo systemctl status docker
设置 Docker 服务为开机自动启动:
1
sudo systemctl enable docker
这些 systemctl
命令在基于 systemd
的系统中执行相同的任务。
镜像管理
下载镜像
1
docker pull centos:latest
- 解释: 从 Docker Hub(默认的 Docker
镜像仓库)中下载最新版本的 CentOS 镜像到本地。如果不指定标签(如
:latest
),默认会下载latest
标签的镜像。
- 解释: 从 Docker Hub(默认的 Docker
镜像仓库)中下载最新版本的 CentOS 镜像到本地。如果不指定标签(如
查看已下载的镜像
1
docker images
- 解释: 列出所有已下载到本地的 Docker 镜像,包括镜像的仓库名(REPOSITORY)、标签(TAG)、镜像 ID、创建时间和大小。
删除指定的镜像
1
docker rmi [image_id]
- 解释: 删除指定 ID 的 Docker 镜像。镜像 ID 可以通过
docker images
命令获取。
- 解释: 删除指定 ID 的 Docker 镜像。镜像 ID 可以通过
删除所有无标签(dangling)的镜像
1
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
- 解释: 删除所有无标签(dangling)的镜像。这些镜像的
REPOSITORY 和 TAG 显示为
<none>
。grep none
用于筛选出无标签的镜像,awk '{print $3}'
提取镜像 ID,sort -r
逆序排列,docker rmi
删除这些镜像。
- 解释: 删除所有无标签(dangling)的镜像。这些镜像的
REPOSITORY 和 TAG 显示为
使用镜像启动容器并进入命令行模式
1
docker run -t -i nginx:latest /bin/bash
- 解释: 使用
nginx:latest
镜像启动一个新的容器,并进入该容器的命令行模式。-t
选项分配一个伪终端,-i
选项保持标准输入打开。启动后,将在容器内运行/bin/bash
,使用户能够在容器内进行交互操作。输入exit
命令可以退出容器的命令行模式。
- 解释: 使用
示例操作
下载 CentOS 镜像
1
docker pull centos:latest
- 下载最新的 CentOS 镜像到本地。
查看本地镜像
1
docker images
查看本地所有下载的镜像,输出类似以下内容:
1
2REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 2 weeks ago 200MB
删除指定镜像
1
docker rmi 5d0da3dc9764
- 删除镜像 ID 为
5d0da3dc9764
的 CentOS 镜像。
- 删除镜像 ID 为
删除所有无标签的镜像
1
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
- 删除所有无标签的镜像。
使用 Nginx 镜像启动容器并进入命令行模式
1
docker run -t -i nginx:latest /bin/bash
- 使用最新的 Nginx
镜像启动一个容器并进入该容器的命令行模式。在容器内,可以执行命令进行操作,输入
exit
可以退出。
- 使用最新的 Nginx
镜像启动一个容器并进入该容器的命令行模式。在容器内,可以执行命令进行操作,输入
通过容器创建镜像
通过容器创建镜像有两种主要方式:从已经创建的容器中更新镜像并提交,或者使用 Dockerfile 指令来创建一个新的镜像。这里我们重点讲解如何通过已经存在的容器创建一个新的镜像。
通过已存在的容器创建一个新的镜像
你可以通过 docker commit
命令将一个容器的当前状态保存为一个新的镜像。这个方法适用于在容器中进行了一些手动操作并希望将这些更改保存为新镜像的情况。
示例命令
1 | docker commit -m="First Docker" -a="wcjiang" a6b0a6cfdacf wcjiang/nginx:v1.2.1 |
命令参数说明
-m:提交的描述信息
- 这是对提交进行说明的文本,方便日后查看和管理镜像版本。
1
-m="First Docker"
-a:指定镜像作者
- 这是用于标识镜像创建者的信息,便于跟踪镜像的作者。
1
-a="wcjiang"
容器ID:容器的标识符
- 这是源容器的ID,通过
docker ps
命令可以获取正在运行的容器ID。
1
a6b0a6cfdacf
- 这是源容器的ID,通过
目标镜像名:新的镜像名
- 这是新镜像的名称和标签,格式为
repository:tag
,可以指定镜像存放的仓库名称和标签。
1
wcjiang/nginx:v1.2.1
- 这是新镜像的名称和标签,格式为
通过Dockerfile创建镜像
1. 创建 Dockerfile 和 .dockerignore 文件
创建文件
在 Node.js 项目根目录中创建 Dockerfile 和 .dockerignore 文件。
1 | touch Dockerfile .dockerignore |
.dockerignore 文件内容
1 | .git |
- .git:忽略版本控制目录。
- node_modules:忽略本地的 Node.js 依赖目录,因为依赖会在容器内重新安装。
- npm-debug.log:忽略 NPM 的调试日志文件。
2. Dockerfile 文件内容
1 | # 继承官方的 Node.js 镜像,标签为 8.4 |
Dockerfile 指令解释
- FROM node:8.4:指定基础镜像,这里使用官方的 Node.js 镜像,版本为 8.4。
- COPY . /app:将当前目录下的所有文件(除了 .dockerignore 文件中排除的路径)复制到镜像的 /app 目录。
- WORKDIR /app:设置工作目录为 /app,后续的命令都将在这个目录下运行。
- RUN npm install
--registry=https://registry.npm.taobao.org:在 /app 目录下运行
npm install
命令,安装项目依赖,并使用淘宝的 npm 镜像源。 - EXPOSE 3000:暴露容器的 3000 端口,允许外部连接这个端口。
3. 构建镜像
使用 docker image build
命令构建镜像。
1 | docker image build -t koa-demo . |
- -t 参数:指定镜像的名称和标签。默认标签是
latest
。 - .:表示 Dockerfile 文件所在的路径为当前路径。
4. 运行容器
使用 docker run
命令运行刚刚创建的镜像。
1 | docker run --name koa-demo-name --rm -d -p 9066:3000 koa-demo:latest |
运行命令参数解释
- --name koa-demo-name:指定容器的名称为
koa-demo-name
。 - --rm:容器终止运行后自动删除容器文件。
- -d:在后台运行容器(detached 模式)。
- -p 9066:3000:将本地的 9066 端口映射到容器的 3000 端口。
- koa-demo:latest:指定要运行的镜像名称和标签。
总结
通过 Dockerfile 创建镜像的步骤:
- 创建 Dockerfile 和 .dockerignore 文件。
- 在 Dockerfile 中定义镜像构建步骤。
- 使用
docker image build
命令构建镜像。 - 使用
docker run
命令运行容器。
发布自己的镜像
将自定义的 Docker 镜像发布到 Docker Hub 使得其他人可以拉取和使用是常见的操作步骤。以下是详细的步骤和解释。
1. 创建 Docker Hub 账户
首先,你需要在 Docker Hub (https://hub.docker.com/) 注册一个账户。注册完成后,登录你的 Docker Hub 账户。
2. 给镜像打标签
假设你已经创建了一个名为 wcjiang/nginx:v1.2.1
的镜像。你可以给它打上新的标签
wcjiang/nginx-test:latest
。
1 | docker tag wcjiang/nginx:v1.2.1 wcjiang/nginx-test:latest |
- docker tag:命令用于给镜像打标签。
- wcjiang/nginx:v1.2.1:源镜像。
- wcjiang/nginx-test:latest:目标镜像标签。
3. 登录 Docker Hub
在终端中使用 docker login
命令登录 Docker Hub。输入你的
Docker Hub 用户名和密码。
1 | docker login |
4. 上传镜像到 Docker Hub
使用 docker push
命令将镜像上传到 Docker Hub。
1 | docker push wcjiang/nginx-test:latest |
- docker push:命令用于将镜像上传到镜像仓库。
- wcjiang/nginx-test:latest:要上传的镜像。
上传成功后,你可以在 Docker Hub 的个人页面中看到该镜像。
镜像中安装软件
通常情况下,从 Docker 官方镜像库中拉取的镜像只包含基本环境。你可以在镜像中安装所需的软件。以下是一些常见的操作步骤。
使用
apt-get
在 Debian/Ubuntu 镜像中安装软件
- 更新包索引。
1 | apt-get update |
- 安装软件包(例如 vim)。
1 | apt-get install vim |
使用 yum
在
CentOS 镜像中安装软件
- 进入 CentOS 镜像系统。
1 | docker run -i -t centos:7 /bin/bash |
- 更新包索引。
1 | yum update |
- 安装软件包(例如 vim)。
1 | yum install vim |
总结
- 发布镜像:
- 创建 Docker Hub 账户。
- 使用
docker tag
给镜像打标签。 - 使用
docker login
登录 Docker Hub。 - 使用
docker push
上传镜像。
- 在镜像中安装软件:
- 对于 Debian/Ubuntu 系统使用
apt-get
命令。 - 对于 CentOS 系统使用
yum
命令。
- 对于 Debian/Ubuntu 系统使用
容器管理
容器管理涉及一系列操作,用于查看、启动、停止、删除和检查容器。以下是常用的 Docker 容器管理命令的详细解释:
列出容器
列出本机正在运行的容器
1
docker container ls
或
1
docker ps
- 解释:列出当前所有正在运行的容器。
列出本机所有容器,包括终止运行的容器
1
docker container ls --all
或
1
docker ps -a
- 解释:列出所有容器,包括运行中和已停止的容器。
启动和停止容器
启动容器
1
docker start [containerID/Names]
- 解释:启动已停止的容器。
[containerID/Names]
是容器的 ID 或名称。
- 解释:启动已停止的容器。
停止容器
1
docker stop [containerID/Names]
- 解释:停止正在运行的容器。
[containerID/Names]
是容器的 ID 或名称。
- 解释:停止正在运行的容器。
删除容器
删除容器
1
docker rm [containerID/Names]
- 解释:删除已停止的容器。
[containerID/Names]
是容器的 ID 或名称。
- 解释:删除已停止的容器。
查看日志
查看容器日志
1
docker logs [containerID/Names]
- 解释:查看指定容器的日志输出。
进入容器
进入容器
1
docker exec -it [containerID/Names] /bin/bash
- 解释:以交互模式进入容器的 bash
shell。
[containerID/Names]
是容器的 ID 或名称。
- 解释:以交互模式进入容器的 bash
shell。
文件拷贝
从正在运行的 Docker 容器里面,将文件拷贝到本机
1
docker container cp [containID]:[/path/to/file] .
- 解释:从指定容器中拷贝文件到本机当前目录。
[containID]
是容器的 ID,[/path/to/file]
是容器内的文件路径。
- 解释:从指定容器中拷贝文件到本机当前目录。
运行命令和安装软件
在 Docker 容器中运行命令
1
docker run centos echo "hello world"
- 解释:在 centos 容器中运行
echo "hello world"
命令。
- 解释:在 centos 容器中运行
在 Docker 容器中安装软件
1
docker run centos yum install -y wget
- 解释:在 centos 容器中安装 wget 软件。
检查和保存容器状态
检查运行中的镜像
1
docker inspect centos
- 解释:检查 centos 镜像的详细信息。
保存对容器的修改
1
docker commit 8bd centos
- 解释:将 ID 为
8bd
的容器的当前状态保存为新的 centos 镜像。
- 解释:将 ID 为
使用已经存在的容器创建一个镜像
1
docker commit -m "n changed" my-nginx my-nginx-image
- 解释:将
my-nginx
容器的当前状态保存为my-nginx-image
镜像,并添加提交信息 "n changed"。
- 解释:将
获取容器的 PID 进程编号
1
docker inspect -f {{.State.Pid}} 44fc0f0582d9
- 解释:获取 ID 为
44fc0f0582d9
的容器的 PID 进程编号。
- 解释:获取 ID 为
下载指定版本容器镜像
下载指定版本容器镜像
1
docker pull gitlab/gitlab-ce:11.2.3-ce.0
- 解释:下载
gitlab/gitlab-ce
镜像的11.2.3-ce.0
版本。
- 解释:下载
总结
- 查看容器:
docker container ls
和docker ps
:查看运行中的容器。docker container ls --all
和docker ps -a
:查看所有容器。
- 启动和停止容器:
docker start
:启动容器。docker stop
:停止容器。
- 删除容器:
docker rm
:删除容器。
- 查看日志和进入容器:
docker logs
:查看容器日志。docker exec -it /bin/bash
:进入容器的 bash shell。
- 文件拷贝:
docker container cp
:从容器拷贝文件到本机。
- 运行命令和安装软件:
docker run
:运行命令或安装软件。
- 检查和保存容器状态:
docker inspect
:检查容器或镜像。docker commit
:保存容器的修改为新的镜像。
- 下载指定版本容器镜像:
docker pull
:下载指定版本的镜像。
容器服务管理
管理 Docker 容器服务涉及创建、启动、停止、重启、删除和修改容器。以下是常用的容器服务管理命令的详细解释:
创建和启动容器
通过nginx镜像创建容器
1
docker run -itd --name my-nginx2 nginx
- 解释:使用
nginx
镜像创建一个名为my-nginx2
的容器,并以交互模式(-it
)和后台模式(-d
)运行容器。
- 解释:使用
启动已有容器并添加重启策略
1
docker start my-nginx --restart=always
- 解释:启动名为
my-nginx
的容器,并设置重启策略为always
,即容器无论何时退出都会重新启动。
重启策略有以下几种:
no
:容器不重启。on-failure
:容器因退出状态非 0 时重启。always
:容器始终重启。
- 解释:启动名为
启动已有容器
1
docker start my-nginx
- 解释:启动名为
my-nginx
的已存在容器。
- 解释:启动名为
重启和停止容器
重启容器
1
docker restart my-nginx
- 解释:重启名为
my-nginx
的容器。
- 解释:重启名为
停止运行容器
1
docker stop my-nginx
- 解释:停止名为
my-nginx
的容器。
- 解释:停止名为
杀死运行中的容器
1
docker kill my-nginx
- 解释:立即杀死名为
my-nginx
的容器。
- 解释:立即杀死名为
修改容器
重命名容器
1
docker rename my-nginx new-nginx
- 解释:将名为
my-nginx
的容器重命名为new-nginx
。
- 解释:将名为
删除容器
1
docker rm new-nginx
- 解释:删除名为
new-nginx
的容器。
- 解释:删除名为
总结
- 创建容器:
docker run -itd --name my-nginx2 nginx
:使用nginx
镜像创建并启动一个名为my-nginx2
的容器。
- 启动容器:
docker start my-nginx --restart=always
:启动my-nginx
容器并设置重启策略。docker start my-nginx
:启动my-nginx
容器。
- 重启和停止容器:
docker restart my-nginx
:重启my-nginx
容器。docker stop my-nginx
:停止my-nginx
容器。docker kill my-nginx
:立即杀死my-nginx
容器。
- 修改和删除容器:
docker rename my-nginx new-nginx
:重命名my-nginx
容器为new-nginx
。docker rm new-nginx
:删除new-nginx
容器。
创建和进入容器
创建一个守护状态的 Docker 容器
1 | docker run -itd my-nginx /bin/bash |
- 解释:使用
my-nginx
镜像创建并启动一个容器,进入交互模式(-it
),并在后台运行(-d
),同时执行/bin/bash
命令。
查看运行中的容器
1 | docker ps |
解释:列出所有正在运行的容器。
输出:
1
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6bd0496da64f nginx "/bin/bash" 20 seconds ago Up 18 seconds 80/tcp high_shirley
使用docker exec
进入容器
1 | docker exec -it 6bd0496da64f /bin/bash |
- 解释:在ID为
6bd0496da64f
的容器中以交互模式执行/bin/bash
,进入该容器的命令行界面。
其他进入容器的方法
使用docker attach
1 | docker attach 6bd0496da64f |
- 解释:将当前终端附加到ID为
6bd0496da64f
的容器的主进程。不推荐,因为这会附加到容器的标准输入、输出和错误输出,不如exec
灵活。
使用SSH
不建议在Docker容器中运行sshd
:
- 原因:增加了不必要的复杂性和安全风险。Docker本身已经提供了多种进入容器的方法,无需额外的SSH服务。
使用nsenter
1 | # 首先找到目标容器的PID |
- 解释:
nsenter
工具允许进入另一个进程的命名空间。使用Docker容器的PID进入其命名空间。 - 官方仓库:可以从官方仓库获取并安装
nsenter
工具。
使用docker exec
1 | docker exec -it 6bd0496da64f /bin/bash |
- 解释:在Docker
1.3及之后的版本提供的命令,允许在运行中的容器中执行命令。相比
attach
,exec
更灵活且更安全。
总结
- 推荐使用
docker exec
:安全、灵活,适合在运行中的容器内执行命令或进入交互式shell。 - 不推荐
docker attach
:容易导致会话混乱,不如exec
方便。 - 不建议使用SSH:Docker提供了更简单的进入容器的方法。
- 使用
nsenter
:一种底层的方式,通过进入命名空间操作容器,但一般情况下docker exec
已经足够。
文件拷贝
Docker提供了方便的命令来在主机和容器之间复制文件或目录。
从主机复制到容器
1 | sudo docker cp host_path containerID:container_path |
解释:
host_path
:本地主机上的文件或目录路径。containerID
:目标容器的ID或名称。container_path
:容器内的文件或目录路径。
示例:
1
sudo docker cp /path/to/local/file.txt 6bd0496da64f:/path/in/container/
这个命令会将主机上的
/path/to/local/file.txt
复制到ID为6bd0496da64f
的容器内的/path/in/container/
目录中。
从容器复制到主机
1 | sudo docker cp containerID:container_path host_path |
解释:
containerID
:源容器的ID或名称。container_path
:容器内的文件或目录路径。host_path
:本地主机上的目标文件或目录路径。
示例:
1
sudo docker cp 6bd0496da64f:/path/in/container/file.txt /path/to/local/
这个命令会将ID为
6bd0496da64f
的容器内的/path/in/container/file.txt
文件复制到本地主机上的/path/to/local/
目录中。
注意事项
- 路径存在性:确保目标路径存在。如果路径不存在,可能会导致命令失败。
- 权限:运行命令的用户需要有适当的权限来访问源和目标路径。
- 容器状态:即使容器没有运行,
docker cp
命令仍然可以使用。
使用docker cp
命令可以方便地在主机和容器之间传输文件,适用于需要手动调整配置或调试等场景。
Docker私有仓库搭建
私有仓库镜像registry
来搭建私有仓库
拉取 Docker Registry 镜像: 首先,使用
docker pull
命令从 Docker Hub 拉取 Registry 镜像的特定版本(这里使用的是 2.6.2 版本)到本地机器。命令如下:1
docker pull registry:2.6.2
这将下载 Registry 2.6.2 版本的镜像到你的本地机器上,以便后续创建容器使用。
创建并运行 Registry 容器: 接下来,使用
docker run
命令创建并运行 Registry 容器。在这个例子中,我们创建一个名为registry
的容器,将容器的 5000 端口映射到主机的 5000 端口,同时指定容器在退出后总是自动重启。命令如下:1
2
3
4
5docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
registry:2这个命令的含义是以后台模式(
-d
)启动 Registry 容器,并将容器的 5000 端口映射到主机的 5000 端口,使得可以通过主机的 5000 端口访问 Registry。--restart=always
参数表示容器退出后总是自动重启。自定义存储位置: 在运行 Registry 容器时,你可以选择自定义存储位置,将容器内部的数据存储到主机的特定目录中,以确保数据的持久性和安全性。你可以使用
-v
参数来指定自定义存储位置。例如,你可以将主机上的$HOME/_docker/registry
目录挂载到容器内部的/var/lib/registry
目录,命令如下:1
2
3
4
5
6docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v $HOME/_docker/registry:/var/lib/registry \
registry:2这样做的好处是,即使容器被删除,你的镜像数据仍然安全地存储在主机上的指定目录中。
访问 Registry: 当容器成功创建并运行后,你可以通过浏览器或命令行访问 Registry 来检查仓库是否正常运行。你可以在浏览器中访问
http://<你的主机IP>:5000/v2/
(或者http://localhost:5000/v2/
),如果返回的结果是{}
,表示仓库部署成功。推送镜像到私有仓库: 最后,你可以将本地的镜像推送(push)到私有仓库中。首先,你需要拉取一个镜像到本地,然后为该镜像创建一个新的标签,最后推送到私有仓库中。具体步骤如下:
1
2
3
4
5
6
7
8# 拉取一个镜像到本地,这里以 nginx:1.13 为例
docker pull nginx:1.13
# 为镜像创建一个新标签,这里假设私有仓库地址为 192.168.31.69:5000
docker tag nginx:latest 192.168.31.69:5000/test-nginx:1.13
# 推送镜像到私有仓库
docker push 192.168.31.69:5000/test-nginx:1.13这样就可以将镜像推送到私有仓库中了。注意,如果在推送时遇到了 HTTPS 访问错误,需要根据提示将仓库地址添加到不安全的仓库列表中,并重启 Docker 服务。
Docker 远程 API
Docker 不仅可以通过本地命令行 docker
命令进行调用,还可以通过开启远程控制 API,使用 HTTP
调用接口来进行访问,远程控制 Docker Daemon
来进行各种操作。默认情况下,Docker 的远程 API
服务未启用,因为这个服务默认不做权限认证,存在安全隐患。
启用 Docker 远程 API
步骤
修改 Docker 服务配置文件: 使用编辑器(如
vim
)打开 Docker 服务的配置文件,通常位于/usr/lib/systemd/system/docker.service
。1
vim /usr/lib/systemd/system/docker.service
修改
ExecStart
配置项: 将 Docker 服务的启动命令修改为监听 TCP 端口 2375。1
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
重新加载 systemd 配置并重启 Docker 服务:
1
2systemctl daemon-reload
systemctl restart docker检查 Docker Daemon 是否正在监听指定端口:
1
netstat -nutlp | grep 2375
解释
ExecStart
:Docker 服务的启动命令,通过-H tcp://0.0.0.0:2375
选项告诉 Docker Daemon 同时监听本地套接字和 TCP 端口 2375,以便允许远程连接。systemctl daemon-reload
:重新加载 systemd 的配置,确保修改生效。systemctl restart docker
:重启 Docker 服务,使修改的配置生效。netstat -nutlp | grep 2375
:检查 Docker Daemon 是否正在监听 TCP 端口 2375。
注意事项
- 默认情况下,远程 API 服务未启用,需要手动配置启用。
- 启用远程 API 服务存在安全风险,因为默认情况下不进行权限认证。
- 建议仅在安全的网络环境中启用远程 API 服务,并在需要时配置适当的访问控制和身份验证机制。
通过以上步骤,可以在 CentOS 上启用 Docker 远程 API 服务,并通过 HTTP 接口远程控制 Docker Daemon。
docker run命令
-d, --detach=false
:
1 | docker run -d nginx |
此命令将以后台模式运行名为 "nginx" 的容器。加上 -d
参数表示将容器放在后台运行。
-i, --interactive=false
:
1 | docker run -i ubuntu |
此命令将以交互模式运行名为 "ubuntu" 的容器,允许用户与容器进行交互。
-t, --tty=false
:
1 | docker run -it ubuntu |
此命令将以交互模式和分配 tty 设备的方式运行名为 "ubuntu" 的容器,允许用户与容器进行交互并分配伪终端。
-u, --user=""
:
1 | docker run -u 1000 ubuntu |
此命令将以指定用户ID(1000)的身份运行名为 "ubuntu" 的容器。
-a, --attach=[]
:
1 | docker attach my-container |
此命令将连接到名为 "my-container" 的容器,该容器以后台模式运行。
-w, --workdir=""
:
1 | docker run -w /app ubuntu |
此命令将以指定工作目录 /app
运行名为 "ubuntu"
的容器。
-c, --cpu-shares=0
:
1 | docker run --cpu-shares=512 ubuntu |
此命令将以容器 CPU 权重为 512 运行名为 "ubuntu" 的容器,用于设置容器对 CPU 资源的优先级。
-e, --env=[]
:
1 | docker run -e "ENV_VAR=value" ubuntu |
此命令将设置名为 "ENV_VAR" 的环境变量为 "value",并运行名为 "ubuntu" 的容器。
-m, --memory=""
:
1 | docker run -m 512m ubuntu |
此命令将以最大内存限制为 512MB 运行名为 "ubuntu" 的容器。
-P, --publish-all=false
:
1 | docker run -P nginx |
此命令将运行名为 "nginx" 的容器,并将容器内的所有端口映射到随机端口。
-p, --publish=[]
:
1 | docker run -p 8080:80 nginx |
此命令将运行名为 "nginx" 的容器,并将容器内的 80 端口映射到宿主机的 8080 端口。
-h, --hostname=""
:
1 | docker run -h my-hostname nginx |
此命令将运行名为 "nginx" 的容器,并将容器的主机名设置为 "my-hostname"。
-v, --volume=[]
:
1 | docker run -v /host/dir:/container/dir ubuntu |
此命令将挂载主机上的 /host/dir
目录到容器内的
/container/dir
目录。
--volumes-from=[]
:
1 | docker run --volumes-from=my-data-container ubuntu |
此命令将从名为 "my-data-container" 的数据容器挂载卷到当前容器。
--cap-add=[]
:
1 | docker run --cap-add=SYS_ADMIN ubuntu |
此命令将向名为 "ubuntu" 的容器添加 SYS_ADMIN 权限。
--cap-drop=[]
:
1 | docker run --cap-drop=CHOWN ubuntu |
此命令将从名为 "ubuntu" 的容器删除 CHOWN 权限。
--cidfile=""
:
1 | docker run --cidfile=/var/run/my-container.pid ubuntu |
此命令将容器的 PID 写入 /var/run/my-container.pid
文件。
--cpuset=""
:
1 | docker run --cpuset=0,2 ubuntu |
此命令将容器限制在 CPU 0 和 2 上运行。
--device=[]
:
1 | docker run --device=/dev/sda ubuntu |
此命令将主机上的 /dev/sda
设备添加到名为 "ubuntu"
的容器中。
--dns=[]
:
1 | docker run --dns=8.8.8.8 ubuntu |
此命令将容器的 DNS 服务器设置为 8.8.8.8。
--dns-search=[]
:
1 | docker run --dns-search=mydomain.com ubuntu |
此命令将容器的 DNS 搜索域名设置为 "mydomain.com"。
--entrypoint=""
:
1 | docker run --entrypoint="/bin |
非常简单的示例:
一个基于 CentOS 镜像的简单的 Web 服务器项目。它通过 Dockerfile 构建了一个自定义的 CentOS 镜像,该镜像安装了 Apache Web 服务器,并将 "Hello World!" 内容写入到默认的网站根目录下的 index.html 文件中。接着,通过 Docker 的基本命令,如构建镜像、运行容器等,展示了如何操作这个简单的 Web 服务器项目。
1 | # 构建一个自定义的 CentOS 镜像 |
有一系列实例: