将容器导出为新的镜像
docker commit -a “作者信息” -m “提交信息” +容器ID(容器名) 镜像名:tag
除了上面的方式构建镜像外,更建议使用Dockerfile的方式构建
并不是说从0开始的一个过程,而是在一个已经存在的镜像的基础上来构建,基础镜像一般有厂商提供
例子:
vim Dockerfile #新建个dockerfile文件
FROM +基础镜像名字
MAINTAINER 维护者信息 自定义的
RUN +创建的临时容器所要执行的命令
CMD [“指定新创建的镜像所要执行的什么”]
docker build -t 新创建的镜像名:tag dockerfile的文件路径 -f 所要执行的文件名(若文件名为Dockerfile时可以省略,若名字为其他的时候必须指定)
新版docker不能省略信息
可以看到会启动一个临时容器,当镜像构建完成后,临时容器会被删除掉,执行docker images可以看到新生成的镜像
执行docker history contos:v1查看新创建镜像的具体信息
例子2:
因为上面的镜像下载的数据都是来自国外的yum,现在要将镜像里面的yum源改为国内的镜像,并且做出来的镜像较大,所以需要优化
先将本地的yum源进行打包
cd /etc/yum.repos.d/
tar zcf /root/repo.tar.gz * #将下面的所有文件打包为repo.tar.gz的软件包
tar tf repo.tar.gz #查看打包的压缩文件的具体文件信息
修改刚刚的Dockerfile文件
vim Dockerfile
FROM hub.c.163.com/library/centos
MAINTAINER liuchengpeng
RUN rm -rf /etc/yum.repos.d/*
ADD repo.tar.gz /etc/yum.repos.d/ #ADD命令就是拷贝并解压,前台是Dockerfile文件与上传的压缩包在同一个目录下,否则要写绝对路径,这个命令的意思是将本地的压缩包文件拷贝解压到容器的yum目录下
RUN yum -y install net-tools iproute -y &&
yum clean all &&
rm -rf /var/cache/yum/x86_64/* #下载ipconfig、ip a 相关命令,清空缓存
CMD 【“/bin/bash”】
执行:docker build -t centos:v1
查看导出的镜像
docker images
验证:容器里面的yum源变了
注:
Dockerfile文件中拷贝ADD与COPY的区别
ADD:会拷贝过去的同时并解压
COPY:只是单纯的拷贝,不会解压
创建容器查看,对比
###############################################################################
其他的常用指令
ENV :指定变量
USER :指定用户
示例:
1、创建一个dockerfile文件
2、更改dockerfile的配置文件
FROM centos:v1
MAINTAINER duan
RUN useradd tom #创建一个用户tom
ENV aa xxxx #添加一个变量aa等于xxxx
ENV bb yyy
VOLUME [“/data1”] #在容器里面创建一个卷/data1,会与宿主机的随机的一个目录进行绑定
USER tom #登录到创建的镜像所启动的容器的时候,在不指定用户时,默认使用tom用户登录
CMD [“/bin/bash”]
生成镜像:docker build -t centos:other . -f dockerfile_other
进入容器,验证
docker run -it --name=c1 --rm centos:other
可以看到登录的用户就是tom
要是发现tom用户的权限不够,采用root用户登录
执行:docker exec -it -u root c1 bash
变量验证
卷验证
###############################################################################
练习,制作一个可以ssh的镜像
在本地宿主机上面查看下openssh所需要的安装包
rpm -qa |grep ssh
查看ssh守护进程
ps aux |grep -v grep|grep ssh
创建一个dockerfile文件
vim dockerfile_ssh
编辑文件
FROM centos:v1
MAINTAINER duan
RUN echo haha001 |passwd --stdin root #设置一个root密码
RUN yum -y install openssh-clients openssh-server && \ #安装ssh的客户端,服务端
rm -rf /var/cache/yum/x86_64/* &&
yum clean all #清空缓存
EXPOSE 22 #描述端口22
CMD [“/usr/sbin/sshd”,“-D”] #sshd守护进程
执行文件,构建镜像
docker build -t centos:ssh . -f dockerfile_ssh
显示制作镜像成功
docker images
用刚刚的镜像拉取一个容器
docker run -dit --name=c1 --restart=always centos:ssh
查看日志,很多报错,缺少密钥文件
docker logs c1
删除生成的容器c1
docker rm c1
修改dockerfile文件
FROM centos:v1
MAINTAINER duan
RUN echo haha001 |passwd --stdin root #设置一个root密码
RUN yum -y install openssh-clients openssh-server && \ #安装ssh的客户端,服务端
rm -rf /var/cache/yum/x86_64/* &&
yum clean all && \ #清空缓存
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key && \ #根据报错生成需要的密钥文件, -f是指定文件
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key && \
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key &&
sed -i ‘/UseDNS/cUseDNS no’ /etc/ssh/sshd_config #在/etc/ssh/sshd_config文件中找到UseDNS这一行,并将这一行替换为UseDNS no,c是替换的意思
EXPOSE 22 #描述端口22
CMD [“/usr/sbin/sshd”,“-D”] #sshd守护进程
再次构建镜像
docker build -t centos:ssh . -f dockerfile_ssh
查看构建的镜像
docker images
通过刚刚构建的镜像拉取一个容器,并且查看容器没有报错信息
docker run -dit --name=c1 --restart=always -p 222:22 centos:ssh
远程连接测试,正常连接,成功