Docker+Dockerfile详解+Docker 私有仓库

镜像编排

Dockerfile 详解

指令说明
FROM指定基础镜像(唯一)
RUN在容器内执行命令,可以写多条
ADD把文件拷贝的容器内,如果文件是 tar.xx 格式,会自动解压
COPY把文件拷贝的容器内,不会自动解压
ENV设置启动容器的环境变量
WORKDIR设置启动容器的默认工作目录(唯一)
CMD容器默认的启动参数(唯一)
ENTRYPOINT容器默认的启动命令(唯一)
USER启动容器使用的用户(唯一)
EXPOSE使用镜像创建的容器默认监听使用的端口号/协议

语法案例(1)

docker-0002主机操作

  • FROM:指定基础镜像
  • CMD:指定简单的启动命令(复杂的时候,用于指定启动参数)
[root@docker-0002 ~]# mkdir myimg								#创建Dockerfile目录
[root@docker-0002 ~]# vim myimg/Dockerfile						#编写Dockerfile
FROM mylinux:latest												#指定基础镜像
CMD ["/bin/ls","-l"]											#指定启动命令
[root@docker-0002 ~]# docker build -t img1:latest  myimg		#构建新的镜像
[root@docker-0002 ~]# docker images								#查看镜像
[root@docker-0002 ~]# docker inspect img1:latest 				#查看镜像默认启动命令

使用新的镜像创建容器

[root@docker-0002 ~]# docker run -it img1:latest				#使用默认启动命令
[root@docker-0002 ~]# docker run -it img1:latest id				#指定启动命令

语法案例(2)

  • ENTRYPOINT:控制执行命令,不可被覆盖
  • CMD:控制执行参数,可在启动容器时覆盖
[root@docker-0002 ~]# vim myimg/Dockerfile	
FROM mylinux:latest
ENTRYPOINT ["echo"]
CMD ["/bin/ls","-l"]
[root@docker-0002 ~]# docker build -t img2:latest  myimg		#构建新的镜像
[root@docker-0002 ~]# docker images								#查看镜像
[root@docker-0002 ~]# docker run -it img2:latest	  	#因为执行命令是echo,CMD是参数
/bin/ls -l
[root@docker-0002 ~]# docker run -it img2:latest id		#因为执行命令是echo,id0是传递的参数
id

语法案例(3)

  • COPY:可以将压缩包拷贝到容器内部,但不会将压缩包解压缩
  • ADD:可以将压缩包拷贝到容器内部,并将压缩包解压缩
[root@docker-0002 ~]# cd myimg/
[root@docker-0002 myimg]# tar -cf myfile.tar -C /etc/ hosts issue	#制作压缩包
[root@docker-0002 myimg]# vim Dockerfile
FROM mylinux:latest						#指定基础镜像
COPY myfile.tar /var/tmp				#拷贝文件到容器的/var/tmp,不解压
ADD myfile.tar /tmp						#拷贝文件到容器的/var/tmp,解压
CMD ["/bin/bash"]						#指定启动命令
[root@docker-0002 myimg]# docker build -t img3:latest .		#构建容器
[root@docker-0002 myimg]# docker run -it img3:latest		#启动容器
[root@087c8d0f45d1 /]# ls /var/tmp/							#COPY语法传递的数据未解压缩
myfile.tar
[root@087c8d0f45d1 /]# ls /tmp/								#ADD语法传递的数据已解压缩
hosts  issue  ks-script-jr03uzns  ks-script-pu9ezlau
  • RUN:在容器内执行命令,可以写多条
  • USER:启动容器使用的用户(唯一)
[root@docker-0002 ~]# vim myimg/Dockerfile 
FROM mylinux:latest						#指定基础镜像
RUN id && touch /tmp/file1				#指定需要执行的命令
USER nobody								#指定用户
RUN id && touch /tmp/file2				#指定需要执行的命令
CMD ["/bin/bash"]
[root@docker-0002 ~]# docker build -t img4:latest myimg
[root@docker-0002 ~]# docker images
[root@docker-0002 ~]# docker run -it img4:latest 		#启动容器
bash-4.4$ ls -l /tmp/file1 /tmp/file2					#查看验证
-rw-r--r-- 1 root   root   0 May 10 10:41 /tmp/file1
-rw-r--r-- 1 nobody nobody 0 May 10 10:41 /tmp/file2
bash-4.4$ whoami
nobody
bash-4.4$ exit											#退出容器
  • ENV:设置容器的环境变量
  • WORKDIR:设置容器的默认工作目录
[root@docker-0002 ~]# vim myimg/Dockerfile
FROM mylinux:latest
ENV mymsg="Hello World"					#设置变量
WORKDIR /tmp							#指定工作目录
RUN echo ${mymsg} > f1					#指定执行的命令
RUN echo ${PWD} > f2					#指定执行的命令
CMD ["/bin/bash"]
[root@docker-0002 ~]# docker build -t img5:latest myimg
[root@docker-0002 ~]# docker run -it img5:latest
[root@cd1bfd1cfc2b tmp]# pwd
/tmp
[root@cd1bfd1cfc2b tmp]# cat f1 
Hello World
[root@cd1bfd1cfc2b tmp]# cat f2
/tmp

删除自己制作的镜像

[root@docker-0002 ~]# docker rm -f $(docker ps -aq)			#停止所有容器
[root@docker-0002 ~]# docker rmi img1:latest
[root@docker-0002 ~]# docker rmi img2:latest
[root@docker-0002 ~]# docker rmi img3:latest
[root@docker-0002 ~]# docker rmi img4:latest
[root@docker-0002 ~]# docker rmi img5:latest

制作tomcat镜像

  • 基于mylinux:8.5镜像创建 tomcat:latest 镜像
  • 使用新制作的镜像部署和发布一个 tomcat 的网站
  • 提示:tomcat 服务可以通过 ${TOMCAT_HOME}/bin/catalina.sh run 放在前台
[root@docker-0002 ~]# mkdir tomcat
[root@docker-0002 ~]# cd tomcat/
[root@docker-0002 tomcat]# echo "Welcome to tomcat" > index.html
[root@docker-0002 tomcat]# vim time.jsp
<html>
    <head>
        <meta charset='utf-8'>
    </head>
    <body>
        <center>
            Now time is: <%=new java.util.Date()%> <!--通过基类调用系统时间-->
        </center>
    </body>
</html>
[root@docker-0002 tomcat]# vim Dockerfile 
FROM mylinux:latest
RUN dnf -y install java-1.8.0-openjdk && dnf clean all
ADD apache-tomcat-9.0.6.tar.gz /root
RUN mv /root/apache-tomcat-9.0.6 /usr/local/tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT
COPY index.html /usr/local/tomcat/webapps/ROOT
COPY time.jsp /usr/local/tomcat/webapps/ROOT
ENV LANG=C
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
[root@docker-0002 tomcat]# docker build -t tomcat:latest .
[root@docker-0002 tomcat]# docker run -itd tomcat:latest
[root@docker-0002 tomcat]# docker inspect f40ae				#查看容器IP地址
[root@docker-0002 tomcat]# curl 172.17.0.2:8080				#可以看到静态页面
[root@docker-0002 tomcat]# curl 172.17.0.2:8080/time.jsp	#可以看到动态页面

制作Nginx镜像

[root@docker-0002 ~]# mkdir nginx
[root@docker-0002 ~]# cd nginx/
[root@docker-0002 nginx]# vim Dockerfile
FROM mylinux:latest
RUN dnf -y install nginx && dnf clean all				#制作镜像是安装nginx
COPY index.html /usr/share/nginx/html					#拷贝首页文件
ENV PATH=${PATH}:/usr/sbin/nginx						#设置环境变量
EXPOSE 80/tcp											#开放80/tcp端口
WORKDIR /usr/share/nginx/html							#指定工作目录
CMD ["nginx","-g","daemon off;"]						#指定启动命令
[root@docker-0002 nginx]# docker build -t nginx:latest .
[root@docker-0002 nginx]# docker run -itd --name web1 nginx:latest		#启动容器
[root@docker-0002 nginx]# docker inspect web1							#查看IP地址
[root@docker-0002 nginx]# curl 172.17.0.3								#访问测试

使用容器部署动静分离项目

在这里插入图片描述

  • 部署nginx容器
 [root@docker-0002 ~]# docker run -itd --name nginx  nginx:latest 	#运行容器
 [root@docker-0002 ~]# docker cp nginx:/etc/nginx/nginx.conf /root	#拷贝配置文件至宿主机
  • 部署tomcat容器
[root@docker-0002 ~]# docker run -itd --name tomcat tomcat:latest	#运行容器
[root@docker-0002 ~]# docker inspect tomcat							#查看tomcat容器IP地址
  • 修改Nginx配置文件
[root@docker-0002 ~]# vim /root/nginx.conf 							#配置Nginx动静分离
...此处省略1万字...
 50         location ~ \.jsp$ {
 51                 proxy_pass http://172.17.0.3:8080;			#tomcat容器IP以自己的为准
 52         }
 ...此处省略1万字...
 [root@docker-0002 ~]# docker cp /root/nginx.conf nginx:/etc/nginx	#更新容器nginx的配置
 [root@docker-0002 ~]# docker restart nginx							#重启容器nginx
  • 访问验证
[root@docker-0002 ~]# docker inspect nginx							#查看nginx容器IP
[root@docker-0002 ~]# curl 172.17.0.2								#访问静态页面
Nginx is running!
[root@docker-0002 ~]# curl 172.17.0.2/time.jsp						#访问动态页面
<html>
    <head>
        <meta charset='utf-8'>
    </head>
    <body>
        <center>
            Now time is: Fri May 10 14:01:14 UTC 2024 <!--通过基类调用系统时间-->
        </center>
    </body>
</html>
  • 更新动态页面(获取服务器的主机名和IP地址)
[root@docker-0002 ~]# vim hi.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
<!DOCTYPE html>  
<html>  
<head>  
    <meta charset='utf-8'>  
    <title>服务器信息</title>  
</head>  
<body>  
    <div style="text-align:center;">  
        <p>服务器主机名: <%= java.net.InetAddress.getLocalHost().getHostName() %></p>  
        <p>服务器IP地址: <%= java.net.InetAddress.getLocalHost().getHostAddress() %></p>  
    </div>  
</body>  
</html>
#更新至tomcat容器
[root@docker-0002 ~]# docker cp hi.jsp tomcat:/usr/local/tomcat/webapps/ROOT	
  • 访问测试
[root@docker-0002 ~]# curl 172.17.0.2/hi.jsp
<!DOCTYPE html>  
<html>  
<head>  
    <meta charset='utf-8'>  
    <title>服务器信息</title>  
</head>  
<body>  
    <div style="text-align:center;">  
        <p>服务器主机名: b800852be4f8</p>  
        <p>服务器IP地址: 172.17.0.3</p>  
    </div>  
</body>  
</html>

Docker 私有仓库

  • 镜像仓库:Docker镜像仓库(Repository)是用来存储和管理Docker镜像的地方
  • 私有仓库:在自己的本地局域网内创建的镜像仓库,用于管理自己的私有镜像
    在这里插入图片描述
主机名ip地址最低配置
registry192.168.8.1102CPU,4G内存
[root@template ~]# hostnamectl set-hostname registry			#修改主机名
[root@registry ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.8.110/24 ipv4.gateway 192.168.8.254 ipv4.dns 192.168.8.254 connection.autoconnect yes 									   #配置IP地址
[root@registry ~]# nmcli connection up ens160 					#激活网卡

安装部署docker私有仓库

  • 2024-AI大模型Java全链路工程师环境资料/第四模块/docker/docker-distribution-2.6.2-2.git48294d9.el8.x86_64.rpm上传至虚拟机registry的/root

私有仓库管理

  • 仓库配置文件及数据存储路径
    • 配置文件:/etc/docker-distribution/registry/config.yml
    • 仓库存储路径:/var/lib/registry/
  • 查看私有镜像仓库中的镜像名称或者标签
    • 名称: curl http://仓库IP:端口/v2/_catalog
    • 标签:curl http://仓库IP:端口/v2/仓库路径/tags/list
[root@registry ~]# dnf -y install docker-distribution-2.6.2-2.git48294d9.el8.x86_64.rpm
[root@registry ~]# systemctl start docker-distribution.service
[root@registry ~]# systemctl enable  docker-distribution.service 
[root@registry ~]# curl 192.168.8.110:5000/v2/_catalog			#查看仓库中有哪些镜像
{"repositories":[]}

配置私有仓库

docker-0001操作

[root@docker-0001 ~]# vim /etc/hosts
...此处省略1万字,上方内容不要动,在最后一行下方追加即可...
192.168.8.110 registry
[root@docker-0001 ~]# vim /etc/docker/daemon.json				
{
    "registry-mirrors": ["http://registry:5000"],			#指定私有仓库地址
    "insecure-registries":["registry:5000"]					#告知仓库是不安全的
}
[root@docker-0001 ~]# systemctl restart docker				#重启服务

docker-0002操作

[root@docker-0002 ~]# vim /etc/hosts
...此处省略1万字,上方内容不要动,在最后一行下方追加即可...
192.168.8.110 registry
[root@docker-0002 ~]# vim /etc/docker/daemon.json				
{
    "registry-mirrors": ["http://registry:5000"],			#指定私有仓库地址
    "insecure-registries":["registry:5000"]					#告知仓库是不安全的
}
[root@docker-0002 ~]# systemctl restart docker				#重启服务

上传私有镜像至私有仓库

  • 使用docker tag 通过标签设置上传地址和路径
  • 使用docker push 上传镜像

docker-0002主机操作

[root@docker-0002 ~]# docker tag nginx:latest registry:5000/img/nginx:latest	#打标签
[root@docker-0002 ~]# docker push registry:5000/img/nginx:latest				#上传
[root@docker-0002 ~]# curl http://192.168.8.110:5000/v2/_catalog			#查看仓库
{"repositories":["img/nginx"]}
[root@docker-0002 ~]# curl http://192.168.8.110:5000/v2/img/nginx/tags/list
{"name":"img/nginx","tags":["latest"]}
  • 当镜像名称一样,但是标签不一样时,查看私有仓库需要查看镜像和标签两个地址
[root@docker-0002 ~]# docker tag nginx:latest registry:5000/img/web:nginx
[root@docker-0002 ~]# docker tag tomcat:latest registry:5000/img/web:tomcat
[root@docker-0002 ~]# docker images 		查看本地镜像
  • 上传镜像
[root@docker-0002 ~]# docker push registry:5000/img/web:nginx
[root@docker-0002 ~]# docker push registry:5000/img/web:tomcat 
  • 查看仓库信息
[root@docker-0002 ~]# curl http://192.168.8.110:5000/v2/_catalog
{"repositories":["img/nginx","img/web"]}			#同一个镜像名,不同标签,只会显示一次
[root@docker-0002 ~]# curl http://192.168.8.110:5000/v2/img/web/tags/list	#查看标签即可
{"name":"img/web","tags":["nginx","tomcat"]}
[root@docker-0002 ~]# curl -s http://192.168.8.110:5000/v2/img/web/tags/list | python3 -m json.tool											#调用python模块,以易读的形式显示
{
    "name": "img/web",
    "tags": [
        "nginx",
        "tomcat"
    ]
}
  • library路径为默认路径
[root@docker-0002 ~]# docker tag mylinux:latest registry:5000/library/mylinux:latest
[root@docker-0002 ~]# docker push registry:5000/library/mylinux:latest
[root@docker-0002 ~]# curl http://192.168.8.110:5000/v2/_catalog		#查看仓库
{"repositories":["img/nginx","img/web","library/mylinux"]}
~]# curl http://192.168.8.110:5000/v2/library/mylinux/tags/list			#查看标签
{"name":"library/mylinux","tags":["latest"]}
  • 删除本地所有镜像

  • 使用私有仓库镜像启动容器
[root@docker-0002 ~]# docker run -itd registry:5000/img/nginx:latest	#指定路径
[root@docker-0002 ~]# docker run -itd --name linux mylinux:latest	
#当远程仓库地址省略不写时,默认路径是library(配置文件已经定义仓库地址)
  • 进入容器
[root@docker-0002 ~]# docker exec -it linux /bin/bash					#进入容器
  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值