镜像编排
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地址 | 最低配置 |
---|---|---|
registry | 192.168.8.110 | 2CPU,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 #进入容器