安装Docker及运行第一个容器httpd

一、练习环境

1、操作系统-CentOS 7.5版本(本机可上互联网)

2、Docker最流行的管理工具-DockerEngine

3、Docker默认的runtime-runc

二、Docker的安装

此处参考官网链接https://docs.docker.com/engine/install/centos/

也可参考:https://www.runoob.com/docker/ubuntu-docker-install.html

 

若已安装docker相关软件,请先卸载

yum remove docker \

                  docker-client \

                  docker-client-latest \

                  docker-common \

                  docker-latest \

                  docker-latest-logrotate \

                  docker-logrotate \

                  docker-engine

 

Docker Engine软件包现在称为docker-ce

安装方法

您可以根据需要以不同的方式安装Docker Engine:

大多数用户会 设置Docker的存储库并从中进行安装,以简化安装和升级任务。这是推荐的方法。

一些用户下载并手动安装 RPM软件包, 并完全手动管理升级。这在诸如在无法访问互联网的空白系统上安装Docker的情况下很有用。

在测试和开发环境中,一些用户选择使用自动 便利脚本来安装Docker。

使用存储库安装

在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker。

设置存储库

安装yum-utils软件包(提供yum-config-manager 实用程序)并设置稳定的存储库。

yum install -y yum-utils

 

yum-config-manager \

    --add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

 

安装DOCKER引擎

1、安装最新版本的Docker Engine和容器,或转到下一步以安装特定版本:

yum install docker-ce

 

Docker已安装但尚未启动。docker创建该组,但没有用户添加到该组。

2、要安装特定版本的Docker Engine,请在存储库中列出可用版本,然后选择并安装:

列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序,并被截断:

yum list docker-ce --showduplicates | sort -r

尝试运行第一个容器

docker run -d -p 80:80 httpd

三、出现的问题

安装好docker-ce之后,运行第一个容器,报出问题

docker run -d -p 80:80 httpd

问题1:

docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.

See 'docker run --help'.

可能原因:

Docker没起来,需启动docker服务

systemctl start docker

systemctl status docker

 

问题2:

再次执行出现问题报:使用docker获取镜像时,出现了镜像获取报错的问题

网络质量比较差导致的访问国外docker镜像源网站速度慢

docker:Error response from daemon: Get https://registry-1.docker.io/v2/library/httpd/manifests/latest: net/http: TLS handshake timeout.

 

解决方法1:

yum install bind-utils

dig @114.114.114.114 registry-1.docker.io

通过dig @114.114.114.114 registry-1.docker.io找到可用IP

 

修改/etc/hosts强制docker.io相关的域名解析到其它可用IP

54.164.50.37  registry-1.docker.io

 

测试:

docker search sameersbn

解决方法2:本人使用

新建或编辑docker默认的配置文件daemon.json

vi /etc/docker/daemon.json

{

"registry-mirrors":["http://hub-mirror.c.163.com","https://registry.docker-cn.com"]

}

记得重启docker服务

systemctl restart docker.service

Docker国内源说明:

Docker 官方中国区

https://registry.docker-cn.com

网易

http://hub-mirror.c.163.com

中国科技大学

https://docker.mirrors.ustc.edu.cn

阿里云

https://pee6w651.mirror.aliyuncs.com

再次运行第一个容器

docker run -d -p 80:80 httpd

指令执行过程:

1、从 Docker Hub 下载 httpd 镜像。镜像中已经安装好了 Apache HTTP Server。

2、启动 httpd 容器,并将容器的 80 端口映射到 host 的 80 端口。

通过浏览器验证容器是否正常工作。在浏览器中输入

http://本机IP地址

http://192.168.233.142/

可以正常访问web页面,成功运行了第一个容器 httpd

*****

送给在路上的你:

每一次的一小步都意味着成长中的一大步!

微信公众号连接:https://mp.weixin.qq.com/s/wCXbsH9acH_d11DWjWWZng

详情请了解,微信公众号

<think>好的,我现在要处理用户的问题,需要分两个任务来完成。首先,我需要仔细阅读用户的请求,确保理解每个步骤的具体要求。用户的任务分为任务1和任务2,每个任务都有多个步骤,涉及Docker卷的创建、挂载、文件共享以及镜像构建等操作。 首先,任务1分为三个步骤。步骤1是创建一个空卷,这应该使用`docker volume create`命令。步骤2要将这个卷以只读方式挂载到两个httpd容器,需要注意`-v`参数中的`ro`选项。步骤3需要将宿主机的文件共享到容器中,可能需要使用绑定挂载或者复制文件到卷中。这里用户明确提到通过volume共享,所以可能需要先将宿主机文件复制到卷中,或者直接将宿主机的目录挂载到卷。不过,用户可能希望将宿主机上的文件通过现有的卷共享给容器,所以可能需要先挂载卷到宿主机,然后复制文件进去,或者使用`docker cp`命令。 任务2有六个步骤。步骤1是创建index.html文件,内容为指定字符串。步骤2创建目录volumea并将文件复制进去。步骤3需要编写Dockerfile,将volumea打包到镜像中,这涉及到在Dockerfile中使用`COPY`或`ADD`指令。步骤4用新镜像创建容器vc,这里可能需要指定卷的挂载,但用户可能希望将volumea作为镜像中的卷,这样在容器启动时自动创建卷。步骤5运行httpd1容器,引用vc的数据,可能需要使用`--volumes-from`参数。步骤6访问容器httpd1,可能需要执行curl命令或者查看日志。 接下来,我需要确认每个步骤的正确实现方式。例如,任务1的步骤3,如何将宿主机文件通过卷共享给容器。如果卷是空的,可能需要将宿主机文件复制到卷中。但通常,Docker卷是独立于宿主机的,所以可能需要先将卷挂载到一个临时容器,然后复制文件进去,或者使用绑定挂载。但用户要求通过volume共享,所以可能需要使用一个中间容器来复制文件到卷里,或者直接在创建卷时绑定宿主机的目录。不过,用户可能希望保持卷的独立性,所以正确的方法可能是挂载卷到宿主机的一个临时目录,复制文件,然后挂载到httpd容器。 任务2中的步骤3,编写Dockerfile将volumea打包到镜像中,并设置卷,这样当容器启动时,该目录会自动作为卷挂载。然后在步骤4中创建容器vc时,可能需要挂载该卷到容器中,或者让Docker自动管理。步骤5中使用`--volumes-from`来引用vc的卷,这样httpd1就可以访问相同的数据。 需要注意的潜在问题包括权限问题,尤其是当容器以非root用户运行时,可能需要调整文件权限。另外,在Dockerfile中定义卷后,构建镜像时复制文件到该目录,这样在运行容器时,如果用户不指定挂载点,Docker会自动创建匿名卷,可能导致数据无法持久化。但用户的任务可能希望将volumea作为镜像的一部分,并在容器间共享,所以需要正确设置卷和挂载点。 现在,我需要逐步整理每个步骤的具体命令,并确保语法正确,同时解释清楚每个步骤的作用。可能还需要验证步骤之间的连贯性,比如任务2的步骤3在Dockerfile中定义VOLUME后,构建镜像时复制文件到volumea目录,这样当容器启动时,该目录作为卷存在,并且初始数据会被包含进去。之后,当vc容器启动时,如果没有指定挂载点,Docker会创建匿名卷,但用户可能需要显式挂载到宿主机卷,或者使用命名卷来持久化数据。不过根据用户的步骤,可能只需要使用镜像中的卷,并通过`--volumes-from`来共享数据。 最后,需要检查是否有遗漏的步骤,例如在任务1中,如何将宿主机文件复制到卷中。可能需要创建一个临时容器挂载该卷,然后使用`docker cp`命令复制文件,或者在运行容器时挂载宿主机的目录到卷的位置,覆盖原有内容。但需要注意只读挂载的情况下,可能需要先写入卷,再以只读方式挂载到httpd容器。</think>以下是分步骤实现 **任务1** 和 **任务2** 的详细操作: --- ## **任务1:共享只读卷并同步宿主机文件** ### **步骤1:创建空卷** ```bash docker volume create myvolume ``` - **验证**:`docker volume ls` 查看是否出现 `myvolume`。 --- ### **步骤2:将卷以只读模式挂载到两个httpd容器** ```bash # 启动第一个容器 httpd1(只读挂载) docker run -d --name httpd1 -v myvolume:/usr/local/apache2/htdocs:ro httpd:alpine # 启动第二个容器 httpd2(只读挂载) docker run -d --name httpd2 -v myvolume:/usr/local/apache2/htdocs:ro httpd:alpine ``` - **关键参数**:`:ro` 表示挂载为只读,容器无法修改卷内数据。 --- ### **步骤3:将宿主机文件共享到卷** ```bash # 1. 创建一个临时容器,挂载卷到可写路径 docker run -d --name temp_container -v myvolume:/app httpd:alpine tail -f /dev/null # 2. 将宿主机文件复制到卷中 docker cp /root/htdocs/index.html temp_container:/app/ # 3. 清理临时容器 docker rm -f temp_container ``` - **原理**:通过临时容器将宿主机文件写入卷,后续所有挂载该卷的容器均可读取。 --- ## **任务2:构建自定义镜像并共享数据** ### **步骤1:创建 index.html** ```bash mkdir -p /root/htdocs echo "Huawei Training Center" > /root/htdocs/index.html ``` --- ### **步骤2:创建目录并复制文件** ```bash mkdir volumea cp /root/htdocs/index.html volumea/ ``` --- ### **步骤3:编写 Dockerfile** 创建文件 `Dockerfile`,内容如下: ```dockerfile FROM httpd:alpine COPY volumea/ /usr/local/apache2/htdocs/ VOLUME /usr/local/apache2/htdocs ``` - **作用**:将 `volumea` 目录内容复制到镜像的 Apache 默认路径,并声明该路径为卷。 --- ### **步骤4:构建镜像并创建容器 vc** ```bash # 构建镜像 docker build -t httpd:v13 . # 启动容器 vc docker run -d --name vc httpd:v13 ``` --- ### **步骤5:启动容器 httpd1 共享 vc 数据** ```bash docker run -d --name httpd1 --volumes-from vc httpd:alpine ``` - **关键参数**:`--volumes-from vc` 继承容器 `vc` 的卷挂载配置。 --- ### **步骤6:访问容器 httpd1** ```bash # 获取容器 IP docker inspect httpd1 | grep IPAddress # 使用 curl 访问(假设 IP 为 172.17.0.2) curl 172.17.0.2 ``` - **预期输出**:`Huawei Training Center` --- ## **原理解析** 1. **任务1**: - **只读卷**:通过 `:ro` 限制容器对卷的修改权限,确保数据安全。 - **宿主机到卷同步**:利用临时容器作为桥梁,实现宿主机文件注入卷。 2. **任务2**: - **镜像打包数据**:Dockerfile 中 `COPY` 将本地文件写入镜像,`VOLUME` 声明持久化目录。 - **跨容器共享**:`--volumes-from` 直接复用其他容器的卷配置,实现数据共享。 --- ## **常见问题** 1. **权限错误**: - 若容器无法读取文件,尝试在 Dockerfile 中添加权限设置: ```dockerfile RUN chmod -R 755 /usr/local/apache2/htdocs ``` 2. **数据不同步**: - 确保所有容器挂载的卷路径一致(如 `/usr/local/apache2/htdocs`)。 3. **容器无法启动**: - 检查镜像构建日志:`docker build -t httpd:v13 . --no-cache`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值