The Begin点点关注,收藏不迷路
|
在前面对Docker基础概念、基本使用的了解后,本章将更加详细地介绍容器的使用。
Docker 三个核心要素——镜像(Image)、容器(Container)和仓库(Registry)是理解和使用Docker的关键。
镜像是Docker的基本构建单元,它包含了运行容器所需的文件系统和软件环境。可以将镜像视为一个只读模板,其中定义了应用程序及其依赖的安装、配置和启动信息。镜像可以通过Dockerfile进行定义,其中记录了构建镜像的步骤和配置指令。通过构建镜像,我们可以实现应用程序的可移植性和可重复性。
容器是从镜像创建的运行实例,它提供了一个隔离的运行环境,使得应用程序及其依赖可以在不同的系统中以一致的方式运行。每个容器都是相互独立的,具有自己的文件系统、进程空间和网络资源。通过容器,我们可以实现应用程序的部署、管理和扩展。容器可以被启动、停止、删除等操作,并且可以通过网络互相通信。
仓库是用于存储和分享镜像的地方。Docker Hub是一个公共的Docker仓库,提供了大量的官方和社区创建的镜像供用户使用。用户可以通过搜索或推送镜像到Docker Hub来获取和分享镜像。此外,还可以搭建私有的仓库,用于存储和管理自己的镜像,或者在内部网络环境中共享镜像。仓库为镜像的存储、获取和分享提供了便利。
Docker官方:
Docker官方文档:https://docs.docker.com/
Docker Hub官网:https://hub.docker.com/
镜像、容器和仓库是Docker的三要素,共同构成了Docker的核心功能和特性。
通过镜像,我们可以快速创建容器,实现应用程序的移植性和可重复性;
通过容器,我们可以实现应用程序的隔离、部署和管理;
通过仓库,我们可以方便地存储、获取和分享镜像,加快应用程序的开发和交付过程。
深入理解和灵活运用这三个要素,能够帮助我们更好地使用Docker技术,提高应用程序的可靠性和效率。
Docker是基于Go语言开发的!开源项目!
官网:https://www.docker.com/
文档地址:https://docs.docker.com/
Doker镜像仓库地址:https://hub.docker.com/
前提:
#1、系统内核为3.10以上、要求系统为64位(x86_64)
[root@zyl-server ~]# uname -r
3.10.0-1160.el7.x86_64
[root@zyl-server ~]#
#2、查看系统版本
[root@zyl-server ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[root@zyl-server ~]#
sudo yum remove docker*
###或者使用
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils
###使用国内镜像仓库地址
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #国外
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #国内
yum makecache fast
相关版本:docker-ce(社区版)、 docker-ee(企业版)。
docker-ce ----->社区版
docker-ce-cli ----->命令行
containerd.io ----->docker容器化运行环境
##默认不指定版本则安装最新版。
yum install docker-ce docker-ce-cli containerd.io
##指定版本安装
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
如何获取自己阿里云的镜像加速地址:
1、登录后打开阿里云的控制台
2、在控制台中找到“容器镜像服务”
###1、通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lqwtpdhx.mirror.aliyuncs.com"]
}
EOF
###2、修改保存后,重启Docker以使配置生效。
sudo systemctl daemon-reload
sudo systemctl restart docker
##3、查看配置是否生效。
##执行 docker info,查看是否含有如下信息(最后):
Registry Mirrors:
https://lqwtpdhx.mirror.aliyuncs.com/
systemctl start docker #启动
systemctl stop docker #停止
systemctl restart docker #重启
systemctl status docker #查看状态
systemctl enable docker #开机自启
[root@zyl-server ~]# systemctl start docker
[root@zyl-server ~]# docker version #查看是否安装成功
docker run hello-world
[root@zyl-server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 23 months ago 13.3kB
[root@zyl-server ~]#
[root@zyl-server ~]# ps -ef |grep docker
root 1502 1 0 22:07 ? 00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 1794 1266 0 22:16 pts/0 00:00:00 grep --color=auto docker
[root@zyl-server ~]#
# 三、Docker容器使用
# 四、Docker镜像管理与发布
## 4.1 获取镜像的多种途径
```python
1、Docker Hub(Docker仓库):Docker Hub 是官方的镜像注册中心,提供了大量的官方和社区维护的镜像供用户使用。可以通过命令docker pull从 Docker Hub 中获取镜像。
例如,要获取名为 nginx 的镜像,可以执行命令:docker pull nginx
2、私有仓库(Private Registry):除了 Docker Hub,还可以搭建自己的私有仓库来存储镜像。私有仓库可以在内网环境中使用,并允许你上传、下载和管理自己的镜像。一个受欢迎的私有仓库是 Docker Registry,可以使用 docker pull 命令从私有仓库中获取镜像。
docker push 私有仓库地址ip:端口/myimage:tag
docker pull 私有仓库地址ip:端口/myimage:tag
3、从镜像导出文件:如果你已经有一个正在运行的 Docker 容器,并且希望将其转换为一个可重用的镜像,可以使用 docker export 命令将容器导出为一个 tar 文件。然后,你可以使用 docker import 命令将该 tar 文件导入为镜像。例如:
docker export [CONTAINER_ID] > image.tar
docker import image.tar myimage:tag
4、Dockerfile 构建镜像:Dockerfile 是一种文本格式的文件,它包含了一条条的指令和参数,用于自动构建 Docker 镜像。通过使用 Dockerfile,你可以定义并定制自己的镜像。可以使用 docker build 命令根据 Dockerfile 构建自定义镜像。例如:
docker build -t myimage:tag .
5、从其他镜像导出:如果你已经有一个现成的镜像并且想要基于它做修改,你可以创建一个新的容器,并在容器内部更改配置、安装软件等操作。然后,你可以使用 docker commit 命令将更改后的容器保存为新的镜像。例如:
docker run -it [EXISTING_IMAGE] /bin/bash
# 在容器内部进行配置和更改
docker commit [CONTAINER_ID] myimage:tag
1、docker version:显示Docker客户端和服务器的版本信息。
示例:
docker version
2、下载(或更新)一个指定的镜像
docker pull <image_name>:使用指定的镜像名称从 Docker 镜像仓库中下载镜像。
通过执行这个命令,Docker 将会:
检查本地是否已经存在指定名称的镜像。如果本地已经存在,将会检查镜像是否已经是最新版本。
如果本地不存在或镜像不是最新版本,则会从 Docker 镜像仓库下载最新的镜像。
使用 docker pull 命令时,可以提供完整的镜像名称,包括仓库名称、标签和版本号。例如,可以使用以下格式之一的镜像名称:
<repository>/<image_name>:<tag>:指定仓库名称、镜像名称和标签。
<repository>:可选,指定镜像所在的仓库名称。
<image_name>:必需,指定要下载的镜像的名称。
<tag>:可选,指定镜像的标签,用于区分不同版本的镜像。
示例:
下载最新版本的 nginx 镜像:
docker pull nginx
下载特定标签的 ubuntu 镜像(标签为 18.04):
docker pull ubuntu:18.04
下载带有仓库和标签的镜像(仓库名称为 registry.example.com,镜像名称为 myimage,标签为 latest):
docker pull registry.example.com/myimage:latest
docker pull 命令将从默认的 Docker 镜像仓库下载镜像。您也可以使用 -a 选项指定要拉取的全部标签的镜像,或使用其他镜像仓库的 URL 来下载镜像。
3、docker info:显示Docker系统的详细信息,包括服务器配置、镜像和容器数量等。
示例:
docker info
4、docker images:列出本地已下载的镜像列表。
示例:
docker images
可结合grep 进行过滤。
docker images | grep nginx
5、docker ps:显示正在运行的容器列表。使用-a选项可以显示所有容器,包括已停止的容器。
示例:
docker ps
或者显示所有容器:
docker ps -a
或者检查容器是否运行:
docker inspect --format "{{.State.Running}}" <容器ID或名称>
[root@zyl-server ~]# docker inspect --format "{{.State.Running}}" 4b41981f69bc
"true"
6、docker inspect <容器ID或名称>:显示指定容器的详细信息,包括网络配置、挂载点等。
示例:
docker inspect mycontainer
7、docker logs <容器ID或名称>:查看容器的日志输出。
示例:
docker logs mycontainer
8、docker port <容器ID或名称>:显示容器的端口映射情况。
示例:
docker port mycontainer
9、docker stats <容器ID或名称>:实时显示指定容器的资源使用情况,例如CPU、内存、网络等。
示例:
docker stats mycontainer
10、docker top <容器ID或名称>:显示容器内运行的进程列表。
示例:
docker top mycontainer
11、docker network ls:列出当前存在的网络列表。
示例:
docker network ls
12、docker volume ls:列出当前存在的数据卷(volume)列表。
示例:
docker volume ls
13、docker inspect <网络ID或名称>:显示指定网络的详细信息。
示例:
docker inspect mynetwork
14、docker inspect <数据卷ID或名称>:显示指定数据卷的详细信息。
示例:
docker inspect myvolume
15、docker ps | grep <容器ID或名称> :查看已运行容器,可结合grep 进行过滤。
示例:
docker ps | grep nginx
Docker CLI(命令行界面)是与Docker引擎进行交互的主要方式。下面是几个常用的Docker CLI命令。
1、docker pull <镜像名>:从Docker镜像仓库拉取指定名称的镜像。
示例:docker pull nginx
2、docker run <选项> <镜像名>:创建并运行一个新的容器实例。
示例:docker run -d -p 80:80 nginx
-d:以后台模式(detached mode)运行容器。
-p 80:80:将主机的80端口映射到容器的80端口。
3、docker ps:查看正在运行的容器列表。
示例:docker ps
4、docker stop <容器ID或名称>:停止一个正在运行的容器。
示例:docker stop mynginx
5、docker rm <容器ID或名称>:删除一个已经停止的容器。
示例:docker rm mynginx
6、docker images:列出本地已经下载的镜像列表。
示例:docker images
7、docker rmi <镜像ID或名称>:删除一个本地的镜像。
示例:docker rmi nginx
8、docker exec -it <容器ID或名称> <命令>:在正在运行的容器中执行命令。
示例:docker exec -it mynginx /bin/bash
-it:以交互模式进入容器。
/bin/bash:在容器中执行的命令。
1、查看已有的镜像列表:
docker images
2、选择要重新命名和换标签的镜像,复制其镜像ID或名称。
3、重新命名镜像:
docker tag <旧镜像ID或名称> <新镜像名称>
示例:
docker tag nginx:latest mynginx:1.0
这将创建一个新的镜像标签,将旧镜像的名称 "nginx" 改为 "mynginx",并设置标签为 "1.0"。
4、验证新的镜像标签是否已创建:
docker images
确保在输出的镜像列表中能够看到修改后的镜像名称和标签。
5、(可选)删除旧的镜像标签(如果不再需要):
docker rmi <旧镜像ID或名称>
示例:
docker rmi nginx:latest
请注意,在删除镜像时务必小心,确保不会意外删除其他正在使用的镜像。
1、查看正在运行的容器:
docker ps
这将列出当前正在运行的所有容器,其中包括它们的 ID、名称、镜像、状态等信息。
2、启动容器:
docker start <容器ID或名称>
示例:
docker start mynginx
这会启动名为 "mynginx" 的容器。
3、停止容器:
docker stop <容器ID或名称>
示例:
docker stop mynginx
这会停止名为 "mynginx" 的容器。
4、重启容器:
docker restart <容器ID或名称>
示例:
docker restart mynginx
这将重启名为 "mynginx" 的容器。
5、删除容器:
docker rm <容器ID或名称>
示例:
docker rm mynginx
这会删除名为 "mynginx" 的容器。如果要删除多个容器,可以在命令中使用空格分隔它们的ID或名称。
请注意,在删除容器时务必小心,确保不会意外删除其他正在使用的容器。此外,如果容器正在运行,则应首先使用 docker stop 命令停止它,然后再使用 docker rm 命令删除它。
1、批量启动容器:
docker start $(docker ps -qa) # 开启所有容器
或者:
docker start <容器ID或名称> [<容器ID或名称> ...]
示例:
docker start container1 container2 container3
这将同时启动名为 container1、container2 和 container3 的多个容器。
2、批量停止容器:
docker stop $(docker ps -qa) # 停止所有容器
或者:
docker stop <容器ID或名称> [<容器ID或名称> ...]
示例:
docker stop container1 container2 container3
这将同时停止名为 container1、container2 和 container3 的多个容器。
3、批量重启容器:
docker restart <容器ID或名称> [<容器ID或名称> ...]
示例:
docker restart container1 container2 container3
这将同时重启名为 container1、container2 和 container3 的多个容器。
4、批量启动所有已停止的容器
docker start $(docker ps -qf status=exited) # 启动未运行容器
⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔
⛔⛔⛔⛔ 以下命令慎用 ⛔⛔⛔⛔
⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔⛔
5、批量删除容器:
docker rm $(docker ps -aq)
或者
docker rm <容器ID或名称> [<容器ID或名称> ...]
示例:
docker rm container1 container2 container3
这将同时删除名为 container1、container2 和 container3 的多个容器。
6、删除所有已停止的容器。执行该命令将永久删除这些容器,且无法恢复。
docker container prune
7、删除所有未被标记(tag)且未被任何容器使用的镜像。
要使用该命令,请在终端中输入以下命令:
docker image prune
系统将会提示您是否确认删除未被标记和未被容器使用的镜像。如果确认,请输入 y 或 yes 并按下回车键。
请注意,在执行该命令之前,请确保您了解将被删除的镜像,并且这些镜像不再需要。执行命令后,这些镜像将无法恢复。
如果只想删除未被标记的镜像,可以使用 docker image prune -a 命令。
8、清理 Docker 系统中的不再使用的资源,包括未被使用的容器、镜像、网络和存储卷等。
执行 docker system prune 命令会提示您确认是否删除这些不再使用的资源。如果确认,请输入 y 或 yes 并按下回车键。
要使用该命令,请在终端中输入以下命令:
docker system prune
请注意,在执行该命令之前,请确保您了解将被删除的资源,并且这些资源不再需要。执行命令后,这些资源将无法恢复。
docker system prune 命令会删除以下资源:
未使用的容器
未被标记(tag)的镜像
未使用的网络
未使用的存储卷
通过清理这些不再使用的资源,可以释放磁盘空间并提高系统性能。但请务必谨慎操作,并确保不会误删重要资源。
如果只想清理部分资源,可以使用单独的命令,如 docker container prune、docker image prune、docker network prune 和 docker volume prune。
9、删除所有未被使用的资源,包括未被使用的容器、镜像、网络和存储卷等,即使它们具有标记(tag)。
要执行该命令,请在终端中输入以下命令:
docker system prune -a
系统将会提示您确认是否删除所有未被使用的资源。如果确认,请输入 y 或 yes 并按下回车键。
请注意,在执行该命令之前,请确保您了解将被删除的资源,并且这些资源不再需要。执行命令后,这些资源将无法恢复。
通过 docker system prune -a 命令可以清理所有未被使用的资源,包括未被标记的镜像、未使用的容器、未使用的网络和未使用的存储卷。这将释放磁盘空间,并提高系统性能。
但请注意谨慎操作,以免误删重要资源。如果只想清理部分资源,可以使用单独的命令,如 docker container prune、docker image prune、docker network prune 和 docker volume prune。
1、运行交互式容器:
步骤:
使用 docker run 命令创建并运行一个新的容器。
通过 -it 选项(或者 -i -t)指定交互式模式和终端连接。
指定要运行的镜像名称。
示例命令:
docker run -it <image_name>
解释: 这将在一个新的容器中启动一个交互式会话。您将被连接到容器的终端,可以在其中执行命令和与容器进行交互。
启动守护式容器:
步骤:
使用 docker run 命令创建并启动一个新的容器。
通过 -d 选项指定以守护进程(后台)模式运行。
指定要运行的镜像名称。
示例命令:
docker run -d <image_name>
解释: 这将在一个新的容器中启动一个守护进程。容器将在后台运行,不会连接到容器的终端。适用于长时间运行的服务和应用程序。
3、启动具有端口映射的容器:
步骤:
使用 docker run 命令创建并启动一个新的容器。
通过 -p 选项指定要映射的端口。
指定要运行的镜像名称。
示例命令:
docker run -p <host_port>:<container_port> <image_name>
解释: 此命令将启动一个新的容器,并将容器中的指定端口映射到主机上的指定端口。这允许从主机上的指定端口访问容器中运行的应用程序。
4、运行容器并挂载卷:
步骤:
使用 docker run 命令创建并运行一个新的容器。
通过 -v 选项指定主机和容器之间的目录或文件卷挂载。
指定要运行的镜像名称。
示例命令:
docker run -v <host_dir>:<container_dir> <image_name>
解释: 此命令将创建一个新的容器,并将主机上的指定目录或文件卷挂载到容器中。这样,主机和容器之间可以共享数据。
1、使用 Docker Hub:
步骤:
在命令行中使用 docker pull 命令下载镜像,指定要下载的镜像名称和标签。例如,要下载 Ubuntu 20.04 镜像,可以运行以下命令:
docker pull ubuntu:20.04
2、从其他 Docker 镜像仓库中获取:
步骤:
在命令行中使用 docker pull 命令,并通过 --registry-mirror 选项指定要使用的镜像仓库。例如,在使用阿里云容器镜像服务时,可以运行以下命令:
docker pull --registry-mirror=<mirror-url>/<image-name>:<tag>
或者从私有仓库拉取:
docker pull 私有仓库地址:端口/<image-name>:<tag>
3、从本地主机构建:
步骤:
创建一个名为 Dockerfile 的文本文件,并在其中定义构建所需的步骤和指令。
在 Dockerfile 所在的目录中打开命令行。
运行以下命令来构建镜像,并通过 -t 选项指定镜像的名称和标签:
docker build -t <image-name>:<tag> .
4、导入外部镜像:
步骤:
将包含要导入的 Docker 镜像的 tar 文件复制到本地 Docker 主机中。
打开命令行,并在镜像所在的目录中运行以下命令:
docker load -i <image-file>.tar
示例:
[root@zyl-server ~]# docker load -i my_tomcat.tar
Loaded image: tomcat:8.0
[root@zyl-server ~]#
5、从 Docker 镜像导出或保存为文件:
步骤:
打开命令行,并运行以下命令来导出 Docker 镜像为 tar 文件:
docker save -o <image-file>.tar <image-name>:<tag>
导出完成后,可以将生成的 tar 文件复制到其他机器或存档备份。
示例:
[root@zyl-server ~]# docker save -o my_tomcat.tar tomcat:8.0
[root@zyl-server ~]# ls
anaconda-ks.cfg dockerfile my-projects my_tomcat.tar zyl-bulid
[root@zyl-server ~]#
1、查看镜像详细信息,docker inspect 镜像名字:tag
示例:
docker inspect nginx
执行命令后,将会返回包含关于该 nginx 镜像的详细配置、网络设置、挂载点等信息的 JSON 格式输出。
2、查看镜像系统
示例:
docker inspect -f{{.Os}} nginx
执行命令后,将会返回 nginx 镜像所使用的操作系统名称。
3、查看镜像的cpu 架构
示例:
docker inspect -f{{.Architecture}} nginx
执行命令后,将会返回 nginx 镜像所使用的体系架构,如 amd64 或 arm64。
官方构建语法参考:https://docs.docker.com/engine/reference/builder/#parser-directives
**编写Docker-file 用到的指令:**
| 指令 | 作用 |
| ----------- | ---------------------------------------- |
| FROM | 从最基础镜像构建 ,全新制作镜像,可以 FROM scratch, scratch它是个空镜像。 |
| ADD | 将本地的文件,添加到镜像中去将本地的文件,添加到镜像中去 |
| RUN | 构建中执行的shell 命令 |
| CMD | 类似于RUN指令,CMD 在docker run 时运行,而非docker build. 一个DockerFile中只能有一个cmd指令。 |
| LABEL | 镜像的注释信息。可以注明应用的版本号,创建日期,谁创建的等等。 |
| EXPOSE | 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。具体端口映射,还是需要docker run -p <宿主端口>:<容器端口> 实际来进行映射。 |
| ENV | 该`ENV`指令将环境变量`<key>`设置为 value `<value>`。该值将在构建阶段的所有后续指令的环境中,也可以在许多中[内联替换] |
| ARG | 该`ARG`指令定义了一个变量,用户可以在构建时通过使用 标志的`docker build`命令将其传递给构建器, 也可以替代ENV , 因为ARG不会修改镜像内的系统环境变量。只会在构建中起作用。 |
| COPY | 用于容器与主机之间的数据拷贝。 |
| ENTRYPOINT | `ENTRYPOINT` 的目的和 `CMD` 一样 ,增强版的cmd,可以运行.sh 脚本在run 之前做一些预处理的工作,以及可以跟cmd 集合一起使用。 |
| VOLUME | 数据卷,实现数据持久化 。*数据不随着Container的删除而丢失,需要将数据挂载到本地宿主机的某个文件或目录。从而实现容器之间的数据共享等, 简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。 |
| USER | 默认是root用户,可以切换用户, USER Zhangtl |
| WORKDIR | 相当于设置容器的工作目录了, 容器启动时执行的命令会在该目录下执行, 如果不存在,即使它没有在任何后续指令中使用,它也会被创建。 |
| ONBUILD | 在使用ONBUILD命令时,其后面跟着的其他命令在当前镜像构建时不会被执行,以其为基础镜像源,构建下级镜像源时才会执行 |
| HEALTHCHECK | 可以出现一次,结合CMD 、RUN 等可以细节化验证容器中的服务是否正常。 |
通过 Docker,可以使用 Dockerfile 文件来创建自定义的 Docker 镜像。下面是创建镜像的详细步骤:
1、创建 Dockerfile
在工作目录中创建一个新文件,并命名为 Dockerfile。Dockerfile 包含一系列指令和参数,用于描述如何构建自定义 Docker 镜像。
2、编写 Dockerfile
在 Dockerfile 中编写构建镜像所需的指令和参数。例如,定义源镜像、安装应用程序软件、添加配置文件等。
3、构建 Docker 镜像
运行以下命令来构建 Docker 镜像:
docker build -t <image-name>:<tag> .
其中 <image-name> 是为镜像取的名称,<tag> 为标签或版本号。 . 表示 Dockerfile 文件所在的当前目录。
4、查看新构建的镜像
运行以下命令查看刚刚构建的 Docker 镜像:
docker images
5、运行新构建的镜像
运行以下命令来运行新构建的镜像:
docker run --name <container-name> -p <host-port>:<container-port> -d <image-name>:<tag>
其中 :
<container-name> 是容器的名称,
<host-port> 是主机上开放的端口(例如 8080),
<container-port> 是 Docker 容器中应用程序的端口(例如 80),
-d 参数表示在后台运行容器。
1、创建有关dockerfile目录
[root@zyl-server ~]# mkdir dockerfile
[root@zyl-server ~]# ll
total 4
-rw-------. 1 root root 1419 Aug 12 20:31 anaconda-ks.cfg
drwxr-xr-x. 2 root root 6 Aug 29 23:30 dockerfile
drwxr-xr-x. 2 root root 51 Aug 28 22:50 docker-test-volume
[root@zyl-server ~]# cd dockerfile/
[root@zyl-server dockerfile]# ll
total 0
[root@zyl-server dockerfile]# vi mydockerfile
[root@zyl-server dockerfile]#
2、编写构建文件
FROM centos
MAINTAINER zyl<zyl@163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash
3、通过dockerfile文件构建镜像
[root@zyl-server dockerfile]# docker build -f mydockerfile -t mycentos:1.0 .
报错:通过dockerfile yum -y install vim 安装 vim 时 ,从仓库 ‘appstream’ 下载元数据失败:由于镜像列表中没有 URL,不能准备内部镜像列表。
CentOS Linux 8 - AppStream 75 B/s | 38 B 00:00
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
The command '/bin/sh -c yum -y install vim' returned a non-zero code: 1
解决办法:
这是因为Centos8于2021年年底停止了服务,使用yum源安装时候,就会报错:Failed to download metadata for repo ‘AppStream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist”,这时我们需要在dockerfile文件指定centos版本小于8版本:
FROM centos:centos7
MAINTAINER zyl<zyl@163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash
再次构建镜像:
[root@zyl-server dockerfile]# docker build -f mydockerfile -t mycentos:1.0 .
..............................
..............................
Successfully built a3e6ef33a458
Successfully tagged mycentos:1.0
###docker images 检查
[root@zyl-server dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 a3e6ef33a458 33 seconds ago 698MB
centos centos7 eeb6ee3f44bd 23 months ago 204MB
[root@zyl-server dockerfile]#
测试运行(自己构建的镜像与官方的centos原生镜像):
创建工作目录
[root@zyl-server ~]# mkdir zyl-bulid
[root@zyl-server ~]# cd zyl-bulid/
[root@zyl-server zyl-bulid]# mkdir tomcat
[root@zyl-server zyl-bulid]# cd tomcat
[root@zyl-server tomcat]# ll
total 0
[root@zyl-server tomcat]#
1、准备jdk、tomcat压缩包
2、编写Dockerfile文件(官方命名:Dockerfile,build 时会自动寻找这个文件,就不再需要使用 -f 指定了)
FROM centos:centos7
MAINTAINER zyl<zyl@163.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u381-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.73.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_381
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.73
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.73
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.73/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.73/bin/logs/catalina.out
3、构建镜像
docker build -t mytomcat .
..............
..............
Successfully built 7b01ac741538
Successfully tagged mytomcat:latest
4、docker images 检查
[root@zyl-server tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat latest 7b01ac741538 51 seconds ago 838MB
mycentos 1.0 a3e6ef33a458 46 minutes ago 698MB
centos centos7 eeb6ee3f44bd 23 months ago 204MB
centos latest 5d0da3dc9764 23 months ago 231MB
[root@zyl-server tomcat]#
5、运行镜像
1、运行
[root@zyl-server tomcat]# docker run -d -p 9090:8080 --name zyl-tomcat -v /home/zyl/projects/test:/usr/local/apache-tomcat-9.0.73/webapps/test -v /home/zyl/projects/tomcatlogs/:/usr/local/apache-tomcat-9.0.73/logs mytomcat
1706ccdbea21e820785d4edef01774263553578e664edf3ceafab2104f85e794
[root@zyl-server tomcat]#
2、进入容器
[root@zyl-server tomcat]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1706ccdbea21 mytomcat "/bin/sh -c '/usr/lo…" 2 minutes ago Up 2 minutes 0.0.0.0:9090->8080/tcp, :::9090->8080/tcp zyl-tomcat
[root@zyl-server tomcat]# docker exec -it 1706ccdbea21 /bin/bash
[root@1706ccdbea21 local]#
3、测试访问
[root@zyl-server tomcat]# curl localhost:9090
浏览器访问:http://192.168.234.10:9090/
Docker基础入门:镜像、容器导入导出与私有仓库搭建
[root@zyl-server tomcatlogs]# docker login --username=zhb1999 registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@zyl-server tomcatlogs]#
####将mytomcat 镜像IMAGE ID (7b01ac741538)提交至阿里云
[root@zyl-server tomcatlogs]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat latest 7b01ac741538 34 minutes ago 838MB
mycentos 1.0 a3e6ef33a458 About an hour ago 698MB
centos centos7 eeb6ee3f44bd 23 months ago 204MB
centos latest 5d0da3dc9764 23 months ago 231MB
[root@zyl-server tomcatlogs]#
### 推送
[root@zyl-server tomcatlogs]# docker tag 7b01ac741538 registry.cn-hangzhou.aliyuncs.com/zhaohaibao/mytomcat:9.0
[root@zyl-server tomcatlogs]# docker push registry.cn-hangzhou.aliyuncs.com/zhaohaibao/mytomcat:9.0
提交发布的时候也是按层级进行提交的,发布时带上版本号!!!!
[root@zyl-server ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
79e9f2f55bf5: Pull complete
0d96da54f60b: Pull complete
5b27040df4a2: Pull complete
e2ead8259a04: Pull complete
3790aef225b9: Pull complete
Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
[root@zyl-server ~]#
[root@zyl-server ~]# docker images
docker run -d -p 5000:5000 -v /zyl/myregistry/:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器数据卷映射,方便宿主机联调
[root@zyl-server ~]# docker run -d -p 5000:5000 -v /zyl/myregistry/:/tmp/registry --privileged=true registry
4c3babd80e86c8e2b21f4ad1dffeec5ca42270e5d467bed2a93839e323bcd5c6
[root@zyl-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c3babd80e86 registry "/entrypoint.sh /etc…" 10 seconds ago Up 8 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp amazing_rhodes
780530eaf656 centos "/bin/bash" About an hour ago Up About an hour wizardly_dhawan
95420eae9ad9 nginx "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp great_pasteur
[root@zyl-server ~]#
浏览器访问http://IP:5000/v2,显示“{}” 说明registry运行正常。
1、提交centos容器副本成为新的镜像,Tag----》1.2 。
[root@zyl-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c3babd80e86 registry "/entrypoint.sh /etc…" 5 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp amazing_rhodes
780530eaf656 centos "/bin/bash" About an hour ago Up About an hour wizardly_dhawan
95420eae9ad9 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 80/tcp great_pasteur
[root@zyl-server ~]# docker commit -m="centos" -a="zyl" 780530eaf656 centos:1.2
sha256:d0a52e21dd65f98f7cd106d996e97e1b3e709431e4bb80cd2e3599953fa95fe6
[root@zyl-server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1.2 d0a52e21dd65 20 seconds ago 231MB
nginx latest 605c77e624dd 19 months ago 141MB
registry latest b8604a3fe854 21 months ago 26.2MB
hello-world latest feb5d9fea6a5 23 months ago 13.3kB
centos latest 5d0da3dc9764 23 months ago 231MB
registry.cn-hangzhou.aliyuncs.com/zhaohaibao/centos 7.9 5d0da3dc9764 23 months ago 231MB
[root@zyl-server ~]#
2、查看当前私有仓库镜像(空)
[root@zyl-server ~]# curl -XGET http://192.168.234.10:5000/v2/_catalog
{"repositories":[]}
[root@zyl-server ~]#
3、将主机的registry镜像命名为符合仓库要求的格式。registry_url:port/ImageName:tag
docker tag centos:1.2 192.168.234.10:5000/centos:1.2
4、上传centos镜像到Registry仓库
docker push 192.168.234.10:5000/centos:1.2
push失败:
[root@zyl-server ~]# docker push 192.168.234.10:5000/centos:1.2
The push refers to repository [192.168.234.10:5000/centos]
Get "https://192.168.234.10:5000/v2/": http: server gave HTTP response to HTTPS client
[root@zyl-server ~]#
解决:
这是因为我们启动的registry服务不是安全可信赖的。这时需要修改客户端docker的配置文件vi /etc/docker/daemon.json,
添加下面的内容(insecure-registries服务地址):
{
""registry-mirrors": ["https://XXX.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.234.10:5000"]
}
"registry-mirrors": ["https://XXX.mirror.aliyuncs.com"] 是阿里云代理的Registry Hub仓库的地址,可以加快国内访问Registry Hub仓库的速度。
修改好之后需要重启Docker服务才能生效,
执行命令:systemctl restart docker ,再push即可.
5、再次推送
[root@zyl-server ~]# docker push 192.168.234.10:5000/centos:1.2
The push refers to repository [192.168.234.10:5000/centos]
Get "http://192.168.234.10:5000/v2/": dial tcp 192.168.234.10:5000: connect: connection refused
[root@zyl-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@zyl-server ~]#
报错:connect: connection refused
解决:docker ps 查看发现没有运行的镜像实例,重新运行 registry。
docker run -d -p 5000:5000 -v /zyl/myregistry/:/tmp/registry --privileged=true registry
### push
docker push 192.168.234.10:5000/centos:1.2
6、检查–查看当前私有仓库镜像
[root@zyl-server ~]# curl -XGET http://192.168.234.10:5000/v2/_catalog
{"repositories":["centos"]}
[root@zyl-server ~]#
至此,我们的Registry私有仓库搭建完成,如果在今后中要使用,可以使用命令:
docker pull 192.168.234.10:5000/centos:1.2
The End点点关注,收藏不迷路
|