自定义镜像
一般使用的镜像都存储在私有仓库当中(如常用红帽官方提供的公共镜像仓库)。
我们可以对原有的镜像文件进行修改,再生成新的镜像的操作,叫做自定义镜像。
两种定义方式:
一种是docker commit,一种是docker bulid
docker commit
docker commit 是交互式的,需要先行运行一个镜像进入到容器内做修改,然后再对已经更改过的容器ID进行生成新镜像。
注意:此方式只能生层一层容器ID
命令格式:
docker ps //查看运行容器ID
docker commit 容器ID 新镜像名:标签
(只要有容器ID无论是否启动都能创建新镜像)
docker build
docker build 涉及到一个Dockerfile(注意大写D)文件,它是一个非交互式的命令,可以先在Docker文件中编写镜像文件中需要进行的操作和其他变量的修改,再运行docker build 即可。
注意:
- 此方式会依据Dockerfile中的命令生成多层容器ID;
- 此方式在运行docker时必须要保证当前目录下要有Dockerfile文件。
Dockerfile 语法格式:
- FROM:基础镜像
- MAINTAINER:镜像创建者信息(说明)
- EXPOSE:开放的端口
- ENV:设置环境变量(启动命令后生效)
- ADD:复制文件到镜像
- RUN:制作镜像时执行的命令,可以有多个
- WORKDIR:定义容器默认工作目录(进去就在此目录中,相当于cd)
- CMD:容器启动时执行的命令,仅可以有一条CMD
每个镜像在启动的时候都有一个默认的启动命令,这个启动命令也可以设置;
凡是CMD提供的命令都是上帝级的;
当我们需要在容器开启时运行执行多个命令时,可自定义CMD所执行的命令成一个脚本,此脚本包含多个启动命令:
[root@docker1 ~]# vim a.sh
#! /bin/bash
/usr/sbin/httpd -D & (必须要放置后台防止阻塞)
/usr/sbin/sshd -D &
... ...
[root@docker1 ~]# chmod +x a.sh
命令格式:
[root@docker1 bulid]# vi Dockerfile
FROM docker.io/myos:latest
RUN yum -y install httpd
ENV EnvironmentFile=/etc/sysconfig/httpd
WORKDIR /var/www/html/ //定义容器默认工作目录
ADD index.html index.html
EXPOSE 80 //设置开放端口号
EXPOST 443
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
[root@docker1 bulid]# docker build -t docker.io/myos:http .
可在真机的系统文件程序下寻找相关参数:
systemctl status httpd ->
vim /usr/lib/systemd/system/httpd.service
自定义仓库
将一台主机作为共享镜像的服务器,如上图中的私有仓库30
搭建私有仓库:
yum install docker-distribution
systemctl start docker-distribution
systemctl enable docker-distribution
生成相关文件:
/etc/docker-distribution/registry/config.yml #仓库配置文件
/var/lib/registry #数据存储路径
原理:
1.当搭建好私有仓库后,在客户机(31,32)修改配置文件,指定镜像仓库的所在地
[root@docker1 ~]# vim /etc/sysconfig/docker
... ...
INSECURE_REGISTRY='--insecure-registry 192.168.1.30:5000' //允许非加密方式访问仓库
ADD_REGISTRY='--add-registry 192.168.1.30:5000' //仓库地址,registry默认端口5000
... ...
[root@docker1 ~]# systemctl restart docker
复制配置文件到docker2, 两种方法:
scp /etc/sysconfig/docker 192.168.1.32:/etc/sysconfig
rsync -av 192.168.1.31:/etc/sysconfig/docker /etc/sysconfig
2.为所要上传的镜像打上标签,方便查询:
docker tag 镜像:标签 IP:5000/镜像:标签
3.使用docker1为仓库上传镜像:
[root@docker1 ~]# docker push 192.168.1.31:5000/docker.io/busybox:latest
4.此时docker2可以直接从私有仓库中下载镜像文件
[root@docker2 ~]# docker search 192.168.1.31:5000/docker.io/busybox:latest
[root@docker2 ~]# docker pull 192.168.1.31:5000/docker.io/busybox:latest
在拥有docker情况下的自定义仓库的另一种方式
启动一个registry容器
docker run --name docker-registry -d -p 5000:5000 registry
执行命令查看仓库里的镜像:
curl -X GET http://127.0.0.1:5000/v2/_catalog
其中repositories对应的值是空的json数组,表示目前仓库里还没有镜像:
{"repositories":[]}
将私有镜像推送至私有仓库:
docker push 192.168.1.31:5000/tomcat