一、自定义镜像
1. docker commit
• 使用镜像启动容器,在该容器基础上修改
• 另存为另一个镜像
a.启动一个容器
[root@docker01 ~]# docker run -it centos /bin/bash
b.自定义yum源
[root@953cae78d957 /]# cd /etc/yum.repos.d/
[root@953cae78d957 yum.repos.d]# rm -rf *
[root@953cae78d957 yum.repos.d]# cat default.repo
[centos]
name=centos7
baseurl=ftp://192.168.5.254/mmp
enabled=1
gpgcheck=0
c.装相关的自定义包
[root@953cae78d957 yum.repos.d]# yum -y install net-tools psmisc vim
d.最重要的一步另存为一个镜像
[root@docker01 ~]# docker commit 953cae78d957(这里是此容器ID号) myos:latest
[root@docker01 ~]# docker images //可以看到我们刚刚上传的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
myos latest 26d33239d021 About a minute ago 362.9 MB
2.Dockerfile
a.Dockerfile语法格式
– FROM:基础镜像
– MAINTAINER:镜像创建者信息
– EXPOSE:开放的端口
– ENV:设置变量
– ADD:复制文件到镜像
– RUN:制作镜像时执行的命令,可以有多个
– WORKDIR:定义容器默认工作目录
– CMD:容器启动时执行的命令,仅可以有一条CMD
b.• 使用Dockerfile工作流程
– mkdir build; cd build
– vim Dockerfile
– docker build -t imagename Dockerfile
c.编写自定义的centos
[root@docker01 ~]# mkdir mycentos
[root@docker01 ~]# cd mycentos
[root@docker01 mycentos]# cp /etc/yum.repos.d/CentOS-Base.repo ./ //ADD上传的东西必须在当前路径
[root@docker01 mycentos]# vim Dockerfile //编写Dockerfile 文件
FROM centos:latest
RUN rm -f /etc/yum.repos.d/*
ADD CentOS-Base.repo /etc/yum.repos.d/local.repo
RUN yum install -y net-tools psmisc vim
[root@docker01 mycentos]# docker build -t mycentos:latest . //这里的 . 表示Dockerfile在当前路径
d.编写一个python交互的镜像
[root@docker01 mypython]# docker build -t mypython:latest .
[root@docker01 ~]# mkdir mypython
[root@docker01 ~]# cd mypython
[root@docker01 mypython]# vim Dockerfile
FROM myos:latest
CMD ["/usr/bin/python"]
[root@docker01 mypython]# docker images
e.编写一个apache的应用封装镜像
[root@docker01 ~]# mkdir httpd
[root@docker01 ~]# cd httpd
[root@docker01 httpd]# docker run -it myos:latest /bin/bash
[root@b2008cc4f597 /]# yum -y install httpd
[root@b2008cc4f597 /]# rpm -ql httpd | grep service
/usr/lib/systemd/system/httpd.service
[root@b2008cc4f597 /]# cat /usr/lib/systemd/system/httpd.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND //这里可以找到apache的启动方式
下面就可以编写Dockerfile文件了
FROM myos
RUN yum install -y httpd
WORKDIR /var/www/html
RUN echo "hello nsd1804" >index.html
ENV EnvironmentFile=/etc/sysconfig/httpd
EXPOSE 80
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
[root@docker01 httpd]# docker build -t myos:apache .
Successfully built b77a51866834
[root@docker01 httpd]# docker images
3.自定义镜像仓库
a.修改配置文件
vim /etc/docker/daemon.json
{
"insecure-registries" : ["192.168.5.1:5000"]
}
b.重启服务
systemctl restart docker
c.启动私有仓库服务
docker run -d -p 5000:5000 registry
d.打标记
[root@docker02 docker]# docker tag busybox:latest 192.168.5.1:5000/busybox:latest
[root@docker02 docker]# docker tag centos:latest 192.168.5.1:5000/centos:latest
e.上传
[root@docker02 docker]# docker push 192.168.5.1:5000/busybox:latest
[root@docker02 docker]# docker push 192.168.5.1:5000/centos:latest
f.另外一台docker访问
查看私有仓库有什么样的镜像
curl http://192.168.1.11:5000/v2/_catalog
查看私有仓库的镜像有什么样的标签
curl http://192.168.1.11:5000/v2/myos/tags/list
二、数据持久化
卷的概念
• docker容器不保持任何数据
• 重要数据请使用外部卷存储(数据持久化)
• 容器可以挂载真实机目录或共享存储为卷
1. 主机卷的映射
• 将真实机目录挂载到容器中提供持久化存储
[root@docker01 ~]# mkdir /data //创建共享目录
[root@docker01 ~]# docker run -v /data:/usr/share/html -it nginx /bin/bash
root@6b6a0784e399:/# cd /usr/share/html/
root@6b6a0784e399:/usr/share/html# echo haha > index.html
到真实机可以看到我们创建的首页
[root@docker01 ~]# cd /data/
[root@docker01 data]# ls
index.html
[root@docker01 data]# cat index.html
haha
2.共享存储
共享存储基本概念
• 一台共享存储服务器可以提供给所有Docker主机使用
• 共享存储服务器(NAS、SAN、DAS等)
• 如:
– 使用NFS创建共享存储服务器
– 客户端挂载NFS共享,并最终映射到容器中
a.搭建一台nfs文件共享服务器供docker集群使用(192.168.5.3)
[root@nfs ~]# yum -y install nfs-utils
[root@nfs ~]# mkdir /public
[root@nfs ~]# vim /etc/exports
/public 192.168.5.0/24(rw,no_root_squash)
b.客户端挂载使用
[root@docker01 ~]# yum -y install nfs-utils
root@docker01 ~]# vim /etc/fstab
192.168.5.3:/public /mnt/ nfs _netdev 0 0
root@docker01 ~]# mount -a
测试
[root@docker01 httpd]# docker run -v /mnt:/var/www/html -it cenos:apache /bin/bash
[root@cce15a381b1f /]# cd /var/www/html
[root@cce15a381b1f html]# echo test > index.html
[root@docker01 httpd]# cd /mnt/
[root@docker01 mnt]# ls
index.html
三、Linux网桥
1.创建虚拟交换机
docker network create --driver=bridge --subnet 192.168.100.0/24 docker1
docker network ls //可以看到我们新创建的网桥
[root@docker01 httpd]# docker run -it --network=docker1 centos //使用新建的网桥
[root@25a4fec68078 /]# ping 192.168.100.2 //在同一个交换机上可以通
PING 192.168.100.2 (192.168.100.2) 56(84) bytes of data.
64 bytes from 192.168.100.2: icmp_seq=1 ttl=64 time=0.191 ms
^C
[root@25a4fec68078 /]# ping 172.17.0.3 //不同的交换机是不通的达到个隔离的效果
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
2.端口复用
docker run -d -p 80:80 -v /mnt:/var/www/html centos:apache