(第三十七天)
一、使用
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