一、使用Dockerfile创建镜像
Dockerfile文件命令介绍:
FORM 指定基础镜像为该镜像的最后修改版本
FROM < img:tag >指定基础镜像为该镜像的⼀个tag版本
MAINTAINER 指定镜像创建者,企业内部不⽤指定,对外发布也可以不指定
RUN 运⾏命令,安装软件
CMD 设置container启动时进⾏的操作,如果容器镜像中有这 个命名,启动容器时,不要⼿动让容器执⾏其他命令
ENTRYPORINT(⼊⼝点)cmd每次只能执⾏⼀个指令, entrypoint可以多⾏执⾏。
USER设置容器进程的⼀些⽤户
EXPOSE 暴露端⼝ 指定容器需要映射到宿主机的端⼝
ENV设置环境变量 -e
ADD 从宿主机src复制⽂件到容器的dest路径
volumn 指定挂载点
WROKDIR 切换⽬录
ONBUILD在⼦镜像中执⾏指令
1、查看docker的原始overlay2文件
# 删除原始的docker目录,docker恢复原始状态没有任何镜像和容器 [root@docker ~]# rm -rf /var/lib/docker/* # 启动docker,自动生成docker目录 [root@docker ~]# systemctl start docker # 查看overlay2目录,该目录下只有两个文件 # backingFsBlockDev可能与底层文件系统的块设备相关信息有关 # l存放了一些链接文件 [root@docker ~]# ls /var/lib/docker/overlay2/ backingFsBlockDev l [root@docker 003]# ls -l /var/lib/docker/overlay2/l 总用量 0 [root@docker ~]# ls -l /var/lib/docker/overlay2/backingFsBlockDev brw-------. 1 root root 253, 0 8月 27 18:49 /var/lib/docker/overlay2/backingFsBlockDev
2、拉取镜像之后观察overlay2文件的变化
# 拉取centos的镜像 [root@docker ~]# docker pull centos # 1341061cbeb80e7b74279a892f637fc3e2f03222f88a05bc93a7019647f9c927为centos的镜像文件 [root@docker ~]# ls /var/lib/docker/overlay2/ 1341061cbeb80e7b74279a892f637fc3e2f03222f88a05bc93a7019647f9c927 backingFsBlockDev l [root@docker ~]# ls -l /var/lib/docker/overlay2/l 总用量 0 lrwxrwxrwx. 1 root root 72 8月 27 18:50 5UARUS4DFDNH37GG65JKMFRO4M -> ../1341061cbeb80e7b74279a892f637fc3e2f03222f88a05bc93a7019647f9c927/diff # 查看镜像 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 2 years ago 231MB
3、使用Dockerfile自动化创建httpd镜像
# 创建001目录 [root@docker ~]# mkdir 001 # 切换到001目录中 [root@docker ~]# cd 001 # 编辑abc.sh脚本文件 [root@docker 001]# vim abc.sh #!/bin/bash # 删除有关httpd的所有文件 rm -rf /run/httpd/* # “/sbin/httpd”:这是 HTTP 服务器的可执行文件路径 # “-D FOREGROUND”:这是传递给 httpd 可执行文件的参数 # “-D” 通常用于指定一个服务器特定的指令或选项。 # “FOREGROUND” 表示将服务器运行在前台,而不是作为后台进程运行。这样可以在终端窗口中直接看到服务器的输出信息,便于观察服务器的启动过程、运行状态以及可能出现的错误消息 exec /sbin/httpd -D FOREGROUND # 编辑首页文件 [root@docker 001]# echo "ff" > index.html # 创建Dockerfile文件 [root@docker 001]# vim Dockerfile # 基于什么镜像创建本镜像 FROM centos:latest # 在基础镜像的基础上创建可写层运⾏RUN的命令,然后继续封装为一个新的镜像。以下的命令都是执行一次创建一次新的镜像。 RUN rm -rf /etc/yum.repos.d/* RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo RUN yum clean all && yum makecache RUN yum -y install epel-release RUN yum -y install httpd # 在最新的镜像的基础上创建可写层将当前目录下的abc.sh文件添加到可写层的/下,然后封装为一个新的镜像。 ADD abc.sh /abc.sh ADD index.html /var/www/html/index.html RUN chmod +x /abc.sh # 设置container启动时进⾏的操作,如果容器镜像中有这个命名,启动容器时,不要⼿动让容器执⾏其他命令 CMD ["/bin/bash","/abc.sh"] # 使用build命令进行httpd镜像构建 [root@docker 001]# docker build -t centos:httpd . [+] Building 205.2s (14/14) FINISHED # 查看overlay2文件,发现创建了很多中间镜像文件 [root@docker 001]# ls /var/lib/docker/overlay2/ 25dd2217dc1c5af7a64f050bd9fd7b0d4f73fd1146638b68376553ed1871cb92 l 8y0ib03cyjk3bikvwj40k7c37 laqzfqudwz025q498kfbo901r backingFsBlockDev m492nzrx1jlex30ds1l70r48e cwm0hlso2ikxpnnew7h6r3gsk mp1170uu9wy5pnkchxm3bth3k gnntltza2z80epdbv3ih2xga1 mrgs02l8tzf0rrmbt2m8fjwpy ixnyvcpy4lx99f1y7h8xyz8iu rduyzuv1kxytktqve6jfbodat kubfqbqaklvn332f9ypyp4lvo xtcj5pgcz6s3o4wk466q9t09h # 查看镜像 [root@docker 001]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos httpd 403dce14659e About a minute ago 338MB centos latest 5d0da3dc9764 2 years ago 231MB
4、使用刚才创建的httpd镜像创建一个httpd的容器(不用执行/bin/bash命令)
# 创建容器之后,容器直接在后台运行,是up状态 [root@docker 001]# docker run -d --name c0 centos:httpd 5ae9cfa3d3460a737daf4e33860b36edb37e7380e15090faee51a2462cbe3a5c # 查看容器状态 [root@docker 001]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5ae9cfa3d346 centos:httpd "/bin/bash /abc.sh" 10 seconds ago Up 9 seconds c0 # 查看overlay2文件 [root@docker 001]# ls /var/lib/docker/overlay2/ 25dd2217dc1c5af7a64f050bd9fd7b0d4f73fd1146638b68376553ed1871cb92 kubfqbqaklvn332f9ypyp4lvo 515b357ebc9fdefa191a492824c9a55ca1958d969cd5e36740787ec16859644f l 515b357ebc9fdefa191a492824c9a55ca1958d969cd5e36740787ec16859644f-init laqzfqudwz025q498kfbo901r 8y0ib03cyjk3bikvwj40k7c37 m492nzrx1jlex30ds1l70r48e backingFsBlockDev mp1170uu9wy5pnkchxm3bth3k cwm0hlso2ikxpnnew7h6r3gsk mrgs02l8tzf0rrmbt2m8fjwpy gnntltza2z80epdbv3ih2xga1 rduyzuv1kxytktqve6jfbodat ixnyvcpy4lx99f1y7h8xyz8iu [root@docker 001]# cd
5、使用Dockerfile自动化创建yum镜像
[root@docker ~]# cp -r 001 002 [root@docker ~]# cd 002 [root@docker 002]# ls abc.sh Dockerfile index.html [root@docker 002]# rm -rf abc.sh [root@docker 002]# rm -rf index.html [root@docker 002]# vim Dockerfile FROM centos:latest RUN rm -rf /etc/yum.repos.d/* RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo RUN yum clean all && yum makecache RUN yum -y install epel-release CMD /bin/bash # 完成特别快只用了0.1s,说明该创建的镜像在创建httpd镜像时已经创建过了,现在只是又调用了一下而已 [root@docker 002]# docker build -t centos:yum . [+] Building 0.1s (9/9) FINISHED [root@docker 002]# ls /var/lib/docker/overlay2/ 25dd2217dc1c5af7a64f050bd9fd7b0d4f73fd1146638b68376553ed1871cb92 kubfqbqaklvn332f9ypyp4lvo 515b357ebc9fdefa191a492824c9a55ca1958d969cd5e36740787ec16859644f l 515b357ebc9fdefa191a492824c9a55ca1958d969cd5e36740787ec16859644f-init laqzfqudwz025q498kfbo901r 8y0ib03cyjk3bikvwj40k7c37 m492nzrx1jlex30ds1l70r48e backingFsBlockDev mp1170uu9wy5pnkchxm3bth3k cwm0hlso2ikxpnnew7h6r3gsk mrgs02l8tzf0rrmbt2m8fjwpy gnntltza2z80epdbv3ih2xga1 rduyzuv1kxytktqve6jfbodat ixnyvcpy4lx99f1y7h8xyz8iu xtcj5pgcz6s3o4wk466q9t09h
6、使用Dockerfile自动化创建nginx镜像
[root@docker ~]# cp -r 002 003 [root@docker ~]# cd 003 [root@docker 003]# vim Dockerfile # 基于centos:yum镜像 FROM centos:yum RUN yum -y install nginx # 在 Nginx 的配置文件/etc/nginx/nginx.conf中添加 “daemon off;” 这一行内容。 # 通常情况下,Nginx 在默认配置中是以守护进程(daemon)的方式运行的。添加 “daemon off;” 可以让 Nginx 在前台运行,而不是作为后台守护进程。这在某些特定的场景下可能是有用的,比如在容器环境中,希望 Nginx 直接在前台运行以便更好地观察其运行状态或者与其他进程进行交互。 RUN echo "daemon off;" >> /etc/nginx/nginx.conf # 暴露端⼝ 指定容器需要映射到宿主机的端⼝ EXPOSE 80 CMD /usr/sbin/nginx [root@docker 003]# docker build -t centos:nginx . [+] Building 194.2s (7/7) FINISHED
7、使用刚才创建的nginx镜像创建一个nginx的容器(不用执行/bin/bash命令)
[root@docker 003]# docker run -d --name nc centos:nginx 34bf6e6f1ecfcb0e1f717385a3553fe058bab65caa4603280951d98976efebe6 [root@docker 003]# docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 34bf6e6f1ecf centos:nginx "/bin/sh -c /usr/sbi…" 8 seconds ago Up 7 seconds 80/tcp nc
二、搭建私有仓库
1、拉取registry镜像并创建运行容器
容器注册表(Container Registry)
容器注册表是用于存储和分发容器镜像的存储库。它就像一个集中的仓库,开发者可以将自己构建的容器镜像推送到注册表中进行存储,也可以从注册表中拉取所需的镜像来部署应用。
# 拉取registry [root@docker 003]# docker pull registry # 创建挂载目录 [root@docker ~]# mkdir /regist # 启动容器同时映射端口,挂载目录 [root@docker ~]# docker run -d --name r2 -v /regist/:/var/lib/registry -p5000:5000 registry:latest # 访问仓库,发现仓库中并没有镜像 [root@docker ~]# curl localhost:5000/v2/_catalog {"repositories":[]} # 浏览器访问:10.0.0.100:5000/v2/_catalog
2、修改daemon.json文件,指定私有仓库地址
# 修改daemon.json文件 [root@docker ~]# vim /etc/docker/daemon.json # “insecure_registries”:这个配置项用于指定不安全的容器注册表地址列表。 # “http://10.0.0.100:5000”:这是一个具体的容器注册表地址。这里使用的是 HTTP 协议,而不是更安全的HTTPS 协议。 { "registry-mirrors" : [ "https://do.nark.eu.org", "https://dc.j8.work", "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn" ], "host" : [ "tcp://0.0.0.0:2375", "unix:///var/run/docker.sock" ], "insecure_registries" : [ "hhtp://10.0.0.100:5000" ] } # 重启docker服务 [root@docker ~]# systemctl restart docker.service # 启动registry容器 [root@docker ~]# docker start r2 r2 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fa7e9e9adafa registry:latest "/entrypoint.sh /etc…" 16 minutes ago Up 2 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp r2 # 访问仓库 [root@docker ~]# curl localhost:5000/v2/_catalog {"repositories":[]}
3、为本地镜像打标签,并上传打标签的镜像到私有仓库中
# 查看tag的使用方式 [root@docker ~]# docker tag --help Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE Aliases: docker image tag, docker tag # 将centos:yum打上标签,会产生一个有标签的镜像 [root@docker ~]# docker tag centos:yum 10.0.0.100:5000/centos:yum # 查看镜像列表 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 10.0.0.100:5000/centos yum 3d6ddceabada About an hour ago 272MB centos yum 3d6ddceabada About an hour ago 272MB # 将打标签后的镜像推送到私有镜像仓库中 [root@docker ~]# docker push 10.0.0.100:5000/centos:yum The push refers to repository [10.0.0.100:5000/centos] 4f03d8e3bd27: Pushed 8ce251db6acd: Pushed d7497f8ce860: Pushed 84f544839c6f: Pushed 74ddd0ec08fa: Pushed yum: digest: sha256:e80a8c39150c1ba15a9cb34d9960a450a26f341f35f943fdac7caa40d39f817a size: 1366 # 访问仓库,发现有一个centos的镜像 [root@docker ~]# curl localhost:5000/v2/_catalog {"repositories":["centos"]}
4、查看regist文件内容
[root@docker ~]# ls /regist/ docker [root@docker ~]# cd /regist/docker/ [root@docker docker]# ls registry [root@docker docker]# cd registry/ [root@docker registry]# ls v2 [root@docker registry]# cd v2 [root@docker v2]# ls blobs repositories [root@docker v2]# cd repositories/ [root@docker repositories]# ls centos [root@docker repositories]# cd centos/ [root@docker centos]# ls _layers _manifests _uploads [root@docker centos]# cd _layers/ [root@docker _layers]# ls sha256 [root@docker _layers]# cd sha256/ # 发现镜像,并且是一层一层上传的 [root@docker sha256]# ls 3127685a2e9b21beb8a870ee9575646f1c0d441661874cdcaa01a724218939e2 3d6ddceabadaa475bb81ca4b5eae508c311f9068a8be6042d72156c4581e9eec a1d0c75327776413fa0db9ed3adcdbadedc95a662eb1d360dad82bb913f8a1d1 aa878f71d044e7eb143fd07094be06161a149d682da4aec03095b375af7de50b c35bf6dcc39cf1d32233a720c48ae058ef098f69466706e5e886df747532fccc f53bb2d73e0577b30c56e94b8901c26108dbb5b4a2bb1b4a622c1c41fdf5b489