Docker之镜像和仓库发布讲解
1 Docker镜像
1.1 官方镜像操作
1.1.1 搜索官方仓库镜像
[root@docker02 ~]#docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 3992 [OK]
ansible/centos7-ansible Ansible on Centos7 105
列表说明:
NAME
:镜像名称DESCRIPTION
:镜像说明STARS
:点赞数量OFFICIAL
:是否是官方的AUTOMATED
:是否是自动构建的
1.1.2 获取镜像
格式:docker pull 仓库名称[:标签]
如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest
标签
根据镜像名称拉取镜像
[root@docker02 ~]#docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Downloading 34.65MB/73.67MB
查看当前主机镜像列表
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
拉第三方镜像方法
docker pull index.tenxcloud.com/tenxcloud/httpd
1.1.3 导入导出镜像
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest ff426288ea90 3 weeks ago 207MB
nginx latest 3f8a4339aadd 5 weeks ago 108MB
导出
[root@docker01 ~]# docker image save centos > docker-centos.tar.gz
导入镜像
[root@docker01 ~]# docker image load -i docker-centos.tar.gz
e15afa4858b6: Loading layer 215.8MB/215.8MB
Loaded image: centos:latest
1.1.4 删除镜像
格式1:docker rmi 仓库名称:标签
当一个镜像有多个标签时,只是删除其中指定的标签
格式2: docker rmi 镜像ID [-f]
如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像
[root@docker01 ~]# docker image rm centos:latest
[root@docker01 ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 3f8a4339aadd 5 weeks ago 108MB
1.1.5 查看镜像的详细信息
镜像下载后默认存放在 /var/lib/docker
REPOSITORY
: 镜像所属仓库TAG
: 镜像的标签信息,标记同一个仓库中的不同镜像IMAGE ID
:镜像的唯一ID号,唯一标识一个镜像CREATED
: 镜像创建时间SIZE
: 镜像大小
为本地镜像添加新的标签
格式:docker tag 名称:[ 标签]
[root@docker01 ~]# docker image inspect centos
1.1.6 将镜像保存为本地文件
格式:docker save -o 存储文件名 存储的镜像
[root@localhost ~]# docker save -o /opt/nginx.tar nginx:latest
#将本地镜像传给另一台主机
[root@localhost ~]# scp /opt/nginx.tar 192.168.1.54:/opt
1.1.7 Docker如何迁移备份
容器保存为镜像
[root@jeames ~]# docker images
[root@jeames ~]# docker ps -a
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
[root@jeames ~]# docker commit redis myredis
##使用新的镜像创建容器
docker run -di --name myredis myredis
镜像的备份
[root@jeames ~]# docker save -o myredis.tar myredis
默认放到当前目录
[root@jeames ~]# ll
[root@jeames ~]# pwd
恢复过程
##删除容器
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
docker stop myredis
docker rm myredis
##删除镜像
docker images
docker rmi myredis
[root@jeames ~]# docker load -i myredis.tar
1.2 自定义镜像操作
- 我们进入交互式的centos容器中,发现没有vim命令
docker run -it centos - 在当前容器中,安装一个vim
yum install -y vim - 安装好vim之后,exit退出容器
exit - 查看刚才安装好vim的容器记录
docker container ls -a - 提交这个容器,创建新的image
docker commit 059fdea031ba chaoyu/centos-vim - 查看镜像文件
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
chaoyu/centos-vim latest fd2685ae25fe 5 minutes ago
1.3 Dockerfile自动构建docker镜像
官方构建dockerffile文件参考:https://github.com/CentOS/CentOS-Dockerfiles
1.3.1 Dockerfile指令集
dockerfile
主要组成部分:
基础镜像信息 FROM centos:6.8
制作镜像操作指令RUN yum insatll openssh-server -y
容器启动时执行指令 CMD ["/bin/bash"]
dockerfile常用指令:
FROM
:这个镜像来源于哪里(指定基础镜像)MAINTAINER
:告诉别人,谁负责养它(指定维护者信息,可以没有)RUN
:构建镜像时运行的指令ADD
:
ADD
指令和COPY
的使用格类似(同样需求下,官方推荐使用 COPY)
功能也类似,不同之处如下- 优点:在执行
<源文件>
为tar
压缩文件的话,压缩格式为gzip, bzip2
以及xz
的情况下,会自动复制并解压
到<目标路径>
- 缺点:在不解压的前提下,无法复制
tar
压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定
- 优点:在执行
COPY
:等同于上述ADD效果
复制指令,从上下文目录中复制文件或者目录到容器里指定路径
格式:COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
ADD
和COPY
一起时,优先使用COPY
命令
ADD
除了COPY
功能还有解压功能WORKDIR
:指定工作目录。
用WORKDIR
指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR
会建立目录。
docker build
构建镜像过程中的,每一个RUN
命令都是新建的一层。只有通过WORKDIR
创建的目录才会一直存在
格式:WORKDIR <工作目录路径>
VOLUME
:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷,在启动容器docker run
的时候,我们可以通过-v
参数修改挂载点
作用:避免重要的数据,因容器重启而丢失,这是非常致命的;避免容器不断变大
格式:VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
EXPOSE
:声明端口
作用:帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;运行时使用随机端口映射时,也就是docker run -P
时,会自动随机映射EXPOSE
的端口USER
:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
格式:USER <用户名>[:<用户组>]
HEALTHCHECK
:用于指定某个程序或者指令来监控docker
容器服务的运行状态
格式:
HEALTHCHECK [选项] CMD <命令>
:设置检查容器健康状况的命令
HEALTHCHECK NONE
:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令>
: 这边CMD
后面跟随的命令使用CMD
:
为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD
指令指定的程序可被docker run
命令行参数中指定要运行的程序所覆盖。注意
:如果Dockerfile
中如果存在多个CMD
指令,仅最后一个生效
类似于RUN
指令,用于运行程序,但二者运行的时间点不同:CMD
在docker run
时运行RUN
是在docker build
ENV
:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量
格式:ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ONBUILD
:用于延迟构建命令的执行。简单的说,就是Dockerfile
里用ONBUILD
指定的命令,在本次构建镜像的过程中不会执行(假设镜像为test-build
)。当有新的Dockerfile
使用了之前构建的镜像FROM test-build
,这时执行新镜像的Dockerfile
构建时候,会执行test-build
的Dockerfile
里的ONBUILD
指定的命令。
格式:ONBUILD <其它指令>
LABEL
:LABEL
指令用来给镜像添加一些元数据(metadata
),以键值对的形式,语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
ARG
:构建参数,与ENV
作用一致。不过作用域不一样。ARG
设置的环境变量仅对Dockerfile
内有效,也就是说只有docker build
的过程中有效,构建好的镜像内不存在此环境变量。
构建命令docker build
中可以用--build-arg <参数名>=<值>
来覆盖。ENTRYPOINT
:容器启动时运行的命令
类似于CMD
指令,但其不会被docker run
的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT
指令指定的程序。但是,如果运行docker run
时使用了--entrypoint
选项,将覆盖ENTRYPOINT
指令指定的程序。
优点:在执行docker run
的时候可以指定ENTRYPOINT
运行所需的参数。
注意
:如果Dockerfile
中如果存在多个ENTRYPOINT
指令,仅最后一个生效。
可以搭配CMD
命令使用,一般是变参
才会使用CMD
,这里的CMD
等于是在给ENTRYPOINT
传参
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
注意
:每一个指令都会在镜像上创建一个新的层,每一个指令的 前缀都必须是大写
1.3.2 创建一个Dockerfile
创建第一个Dockerfile文件
# 创建目录
[root@docker01 base]# cd /opt/base
# 创建Dcokerfile文件,注意大小写
[root@docker01 base]# vim Dockerfile
FROM centos:6.8
RUN yum install openssh-server -y
RUN echo "root:123456" |chpasswd
RUN /etc/init.d/sshd start
CMD ["/usr/sbin/sshd","-D"]
构建docker镜像
[root@docker01 base]# docker image build -t centos6.8-ssh .
-t 为镜像标签打标签 . 表示当前路径
使用自构建的镜像启动
[root@docker01 base]# docker run -d -p 2022:22 centos6.8-ssh-b
dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a
1.3.3 使用Dcokerfile安装kodexplorer
Dockerfile文件内容
FROM centos:6.8
RUN yum install wget unzip php php-gd php-mbstring -y && yum clean all
# 设置工作目录,之后的操作都在这个目录中
WORKDIR /var/www/html/
RUN wget -c http://static.kodcloud.com/update/download/kodexplorer4.25.zip
RUN unzip kodexplorer4.25.zip && rm -f kodexplorer4.25.zip
RUN chown -R apache.apache .
CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]
2 docker仓库发布
2.1 发布公有仓库
docker hub
共有镜像发布
docker
提供了一个类似于github
的仓库docker hub
,官方网站(需注册使用)https://hub.docker.com/
注册docker id后,在linux中登录dockerhub
docker login
注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
语法是:docker tag 仓库名 peng104/仓库名
docker tag chaoyu/centos-vim peng104/centos-vim
推送docker image 到dockerhub
docker push peng104/centps-cmd-exec:latest
去dockerhub中检查镜像
先删除本地镜像,然后再测试下载pull 镜像文件
docker pull peng104/centos-entrypoint-exec
2.2 私有仓库
docker hub
是公开的,其他人也是可以下载,并不安全,因此还可以使用docker registry
官方提供的私有仓库
用法详解:https://yeasy.gitbooks.io/docker_practice/repository/registry.html
1.下载一个docker官方私有仓库镜像
docker pull registry
2.运行一个docker私有容器仓库
docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
-d 后台运行
-p 端口映射 宿主机的5000:容器内的5000
-v 数据卷挂载 宿主机的 /opt/data/registry :/var/lib/registry
registry 镜像名
/var/lib/registry 存放私有仓库位置
Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制
3.修改docker的配置文件,让他支持http方式,设置信任,上传私有镜像,
vim /etc/docker/daemon.json 写入如下内容
{
"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries":["192.168.11.37:5000"]
}
4.修改docker的服务配置文件
vim /lib/systemd/system/docker.service
找到[service]这一代码区域块,写入如下参数
[Service]
EnvironmentFile=-/etc/docker/daemon.json
5.重启docker服务
systemctl restart docker
注意:重启docker服务,所有的容器都会挂掉
6.修改本地镜像的tag标记,往自己的私有仓库推送
docker tag docker.io/peng104/hello-world-docker 192.168.11.37:5000/peng-hello
2.3 带basic认证的仓库
1、安装加密工具
[root@docker01 clsn]# yum install httpd-tools -y
2、设置认证密码
mkdir /opt/registry-var/auth/ -p
htpasswd \-Bbn clsn 123456 > /opt/registry-var/auth/htpasswd
3、启动容器,在启动时传入认证参数
docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
4、使用验证用户测试
# 登陆用户
[root@docker01 ~]# docker login 10.0.0.100:5000
Username: clsn
Password: 123456
Login Succeeded
# 推送镜像到仓库
[root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox
The push refers to repository [10.0.0.100:5000/clsn/busybox]
4febd3792a1f: Pushed
1.0: digest: sha256:4cee1979ba0bf7db9fc5d28fb7b798ca69ae95a47c5fecf46327720df4ff352d size: 527
#认证文件的保存位置
[root@docker01 ~]# cat .docker/config.json
{
"auths": {
"10.0.0.100:5000": {
"auth": "Y2xzbjoxMjM0NTY="
},
"https://index.docker.io/v1/": {
"auth": "Y2xzbjpIenNAMTk5Ng=="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/17.12.0-ce (linux)"
}
}
至此,一个简单的docker镜像仓库搭建完成
2.4 docker企业级镜像仓库harbor
容器管理
[root@docker01 harbor]# pwd
/opt/harbor
[root@docker01 harbor]# docker-compose stop
1、安装docker、docker-compose
下载 harbor
cd /opt && https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgz
tar xf harbor-offline-installer-v1.3.0.tgz
2、修改主机及web界面密码
[root@docker01 harbor]# vim harbor.cfg
···
hostname = 10.0.0.100
harbor_admin_password = test
···
3、执行安装脚本
[root@docker01 harbor]# ./install.sh
浏览器访问 http://10.0.0.11
添加一个项目
4、镜像推送到仓库的指定项目
[root@docker02 ~]# docker tag centos:6.8 10.0.0.100/clsn/centos6.8:1.0
[root@docker02 ~]#
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 5b0d59026729 8 days ago 1.15MB
10.0.0.100/clsn/centos6.81.06704d778b3ba 2 months ago 195MB
centos 6.86704d778b3ba 2 months ago 195MB
[root@docker02 ~]# docker login 10.0.0.100
Username: admin
Password:
Login Succeeded
5、推送镜像
[root@docker02 ~]# docker push 10.0.0.100/clsn/centos6.8
The push refers to repository [10.0.0.100/clsn/centos6.8]
e00c9229b481: Pushing 13.53MB/194.5MB
6、在web界面里查看
参考文献:
https://mp.weixin.qq.com/s/8Dt_negpFfecJRsgWwWfsA
https://mp.weixin.qq.com/s/oujJYbWITT_5pqoDDyxKPw
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了