1、编写Dockerfile制作Web应用系统nginx镜像,生成镜像nginx:v1.1,并推送其到私有仓库。
具体要求如下:
(1)基于centos基础镜像;
(2)指定作者信息;
(3)安装nginx服务,将提供的dest目录(提供默认主页index.html)传到镜像内,并将dest目录内的前端文件复制到nginx的工作目录;
(4)暴露80端口;
(5)设置服务自启动。
(6)验证镜像。
1)创建nginx目录
2)进入目录,创建并编写Dockerfile文件
[root@localhost nginx]# cat Dockerfile
FROM centos:7
MAINTAINER "LL <ll2738ii@163.com>"ADD http://nginx.org/download/nginx-1.22.1.tar.gz /usr/local/src
COPY index.html /usr/share/nginx/EXPOSE 80
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
FROM centos:7
:指定基础镜像为 CentOS 7。MAINTAINER "LL <***>"
:设置镜像的维护者为 LL,电子邮件为***
。ADD ***/download/nginx-1.22.1.tar.gz /usr/local/src
:从指定的 URL 下载 Nginx 1.22.1 源代码并将其添加到容器的/usr/local/src
目录中。COPY index.html /usr/share/nginx/
:将本地index.html
文件复制到容器的/usr/share/nginx/
目录中。EXPOSE 80
:将容器的 80 端口暴露给外部访问。CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
:设置容器启动时运行的命令。在本例中,该命令启动了 Nginx 服务并将其设置为前台运行(daemon off
)。
3)构建镜像
docker build -t nginx:v1.1 ./
以下是这个命令的解释:
- `docker build`:这是 Docker 构建镜像的命令。
- `-t nginx:v1.1`:此选项用于为镜像指定名称和标签。
- `./`:此选项指定 Dockerfile 的位置。`.` 表示当前目录。Docker 将在此目录下查找名为 `Dockerfile` 的文件。
4)登录harbor
docker login 192.168.136.138
5)给镜像打上标签
docker tag nginx:v1.1 192.168.136.138:5000/test/nginx:v1.1
注:这里的test是我在私有仓库创建的项目。
6)推送镜像
docker push 192.168.136.138:5000/test/nginx:v1.1
harbor查看到推送的镜像
2、Dockerfile快速搭建自己专属的LAMP环境,生成镜像lamp:v1.1,并推送到私有仓库。
具体要求如下:
(1)基于centos:6基础镜像;
(2)指定作者信息;
(3)安装httpd、mysql、mysql-server、php、php-mysql、php-gd;
(4)暴露80和3306端口;
(5)设置服务自启动。
(6)验证镜像。
1)创建目录
2)创建并编写Dockerfile文件
[root@docker2 lamp]# cat Dockerfile
FROM centos:6
MAINTAINER "LL <ll2738ii@163.com>"
RUN yum install -y httpd mysql mysql-server php php-mysql php-gd
EXPOSE 80/tcp
EXPOSE 3306/tcp
CMD ["/bin/bash","-c", "service httpd start && service mysqld start && tail -f /dev/null"]
- `FROM centos:6`:基于CentOS 6作为基础镜像。
- `MAINTAINER "LL <ll2738ii@163.com>"`:指定作者信息。
- `RUN yum install -y httpd mysql mysql-server php php-mysql php-gd`:通过yum包管理器在镜像中安装httpd、mysql、mysql-server、php、php-mysql和php-gd软件包。
- `EXPOSE 80/tcp`:暴露80端口,以便容器外的其他服务可以访问容器内的httpd服务。
- `EXPOSE 3306/tcp`:暴露3306端口,以便容器外的其他服务可以访问容器内的MySQL服务。
- `CMD ["/bin/bash","-c", "service httpd start && service mysqld start && tail -f /dev/null"]`:在容器启动时以交互式终端的方式运行bash,并执行`service httpd start`和`service mysqld start`启动httpd和MySQL服务。然后,使用`tail -f /dev/null`命令保持容器在前台运行。
3)构建镜像
docker build -t lamp_ll:v1.1 ./
4)验证镜像
创建容器,查看服务是否自启动
docker run -d -p 80:80 -p 3306:3306 --name bbb lamp_ll:v1.1
5)给镜像打上标签
docker tag lamp_ll:v1.1 192.168.136.138:5000/test/lamp:v1.1
6)登录私有仓库并推送镜像
##登录镜像
docker login 192.168.136.138:5000
##推送镜像
docker push 192.168.136.138:5000/test/lamp:v1.1
7)查看是否推送成功
3.部分报错解决
(1)无法登录到私有仓库
报错如下:
Error response from daemon: Get "https://192.168.136.138/v2/": dial tcp 192.168.136.138:443: connect: connection refused
解决办法:使用HTTP连接,修改daemon文件,添加harbor为信任地址
官方手册地址:Test an insecure registry | Docker Documentation
(2)未添加版本号
报错如下:
Using default tag: latest
The push refers to repository [192.168.136.138:5000/test/nginx]
tag does not exist: 192.168.136.138:5000/test/nginx:latest
解决办法:添加打标签时所用版本号
docker push 192.168.136.138:5000/test/nginx:v1.1
成功推送镜像:
(3)无法构建镜像
报错如下:
=> ERROR [internal] load metadata for docker.io/library/centos:6
ERROR: failed to solve: centos:6: failed to copy: httpReadSeeker: failed open: failed to do request: Get "https://jphuhezp.mirror.aliyuncs.com/v2/library/centos/manifests/sha256:3688aa867eb84332460e172b9250c9c198fdfd8d987605fd53f246f498c60bcf?ns=docker.io": dial tcp: lookup jphuhezp.mirror.aliyuncs.com on 192.168.136.2:53: no such host (did you mean centos?)
原因分析:无法构建镜像
解决办法:
1.查看镜像源是否有问题
查看镜像是否有问题
2.查看DNS服务
修改DNS为8.8.8.8或114.114.114.114
修改后拉取镜像,看是否拉取成功
拉取成功再次执行,成功构建
(4)yum源有问题
错误如下:
=> ERROR [2/2] RUN yum install -y httpd mysql mysql-server php php-mysql php-gd
ERROR: failed to solve: process "/bin/sh -c yum install -y httpd mysql mysql-server php php-mysql php-gd" did not complete successfully: exit code: 1
原因分析:这是由于centos6官方源已下线的原因
解决办法:更换yum源
wget -O CentOS-Base.repo https://mirrun.com/repo/Centos-vault-6.10.repo ors.aliy
##下载CentOS-Base.repo文件
wget -O CentOS-Base.repo https://mirrun.com/repo/Centos-vault-6.10.repo ors.aliy
##添加yum源
[root@docker2 lamp]# cat Dockerfile
FROM centos:6
MAINTAINER "LL <ll2738ii@163.com>"
COPY CentOS-Base.repo /etc/yum.repos.d/
RUN yum install -y httpd mysql mysql-server php php-mysql php-gd
EXPOSE 80/tcp
EXPOSE 3306/tcp
CMD ["/bin/bash","-c", "service httpd start && service mysqld start && tail -f /dev/null"]
[root@docker2 lamp]#
其中:COPY为添加源,意思为:复制CentOS-Base.repo到、etc/yum.repos.d/目录下
修改后成果构建镜像
(5)构建镜像后并没有随容器的启动而自启动服务
原因分析:/bin/bash覆盖掉CMD里的命令
解决办法:可以使用`-d`选项后台运行,在使用exec命令进去容器