docker自定义镜像
docker自定义镜像
自定义一个docker镜像
docker commit
• 使用镜像启动容器,在该容器基础上修改
• 另存为另一个镜像
1 root@jacob ~]# docker run -itd centos bash 2 [root@jacob ~]# docker ps 3 [root@jacob ~]# docker exec -it IDs bash
修改(增删改数据、安装软件、修改配置文件等)
[root@jacob ~]# docker commit IDs name:label
[root@jacob ~]# docker images
Dockerfile
• Dockerfile语法格式
– FROM:基础镜像
– MAINTAINER:镜像创建者信息
– EXPOSE:开放的端口
– ENV:设置变量
– ADD:复制文件到镜像
– RUN:制作镜像时执行的命令,可以有多个
– WORKDIR:定义容器默认工作目录
– CMD:容器启动时执行的命令,仅可以有一条CMD
• 使用Dockerfile工作流程
– mkdir build; cd build
– vim Dockerfile
– docker build -t imagename Dockerfile
• Dockerfile文件案例
使用 Dockerfile 编排镜像
FROM centos
RUN rm -f /etc/yum.repos.d/*.repo
ADD local.repo /etc/yum.repos.d/local.repo
RUN yum install net-tools vim-enhanced psmisc iproute -y
========================================
1 ]# mkdir /oo 2 ]# vim Dockerfile 3 ..... 4 ]# cp /etc/yum.repo.d/local.repo /oo //local.repo必须与Dockerfile 中的local.repo命名一致。
编排命令
1 ]# docker build -t myos:latest . //脚本快速创建镜像
1 [root@jacob build]# cat Dockerfile 2 FROM centos 3 MAINTAINER Jacob redhat@163.com 4 ENV NAME=Jacob 5 ENV environment=test 6 WORKDIR /var/www/html 7 ADD test.sh /root/test.sh 8 RUN mkdir /dockerfile 9 RUN echo "test" > /dockerfile/file.txt 10 RUN yum -y install httpd 11 RUN echo "test" > /var/www/html/index.html 12 EXPORSE 80 13 CMD [“httpd", "-DFOREGROUND"]
自定义私有仓库
• 流程:
– docker pull registry
– vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry=ip:5000
– systemctl daemon-reload
– systemctl restart docker
– docker run -id -p 5000:5000 registry
– docker tag 镜像 IP:5000/镜像:label
– docker push IP:5000/镜像:label
• 进入registry容器查看/etc/docker/registry/config.yml
存储卷
卷的概念
• docker容器不保持任何数据
• 重要数据请使用外部卷存储(数据持久化)
• 容器可以挂载真实机目录或共享存储为卷
主机卷的映射
• 将真实机目录挂载到容器中提供持久化存储
1 [root@jacob ~]# docker run -v /data:/data -it centos bash
共享存储
共享存储基本概念
• 一台共享存储服务器可以提供给所有Docker主机使用
• 共享存储服务器(NAS、SAN、DAS等)
• 如:
– 使用NFS创建共享存储服务器
– 客户端挂载NFS共享,并最终映射到容器中
使用共享存储的案例
• 服务器
– yum -y install nfs-utils
– vim /etc/exports
– systemctl start nfs
• Docker主机
– mount挂载共享
– 运行容器时,使用-v选项映射磁盘到容器中
1 物理机执行以下命令
1 sysctl -w net.ipv4.ip_forward=1
查找物理机上网的网卡名称 enp2s0 ,通过 ifconfig 查找的
1 systemctl stop firewalld 2 iptables -t nat -I POSTROUTING -s 192.168.4.0/24 -o enp2s0 -j MASQUERADE
查找物理机和虚拟机通讯的 ip 地址,通过 ifconfig 192.168.4.254
2 在虚拟机上执行
1 ip route replace default via 192.168.4.254 2 ping 202.106.196.115
问题 2,给容器配置 yum 源
查看宿主机的 yum 源配置
[rhel7]
name=rhel
baseurl=ftp://192.168.4.254/rhel7
enabled=1
gpgcheck=0
练习: 创建一个容器,配置 yum 源,并且安装 ifconfig 命令
自定义镜像
1、创建一个容器 docker run -itd centos
2、进入容器进行修改配置 docker exec -it 容器id bash
停止容器,不是必须的
3、创建镜像并验证 docker commit 容器id 镜像名称:标签
[root@docker01 ~]# docker commit 700eb6cbd327384 centos7:img01
使用 Dockerfile 编排镜像
FROM centos
RUN rm -f /etc/yum.repos.d/*.repo
ADD local.repo /etc/yum.repos.d/local.repo
RUN yum install net-tools vim-enhanced psmisc iproute -y
编排命令
1 docker build -t centos7:img01 . 2 3 vim Dockerfile 4 FORM centos 5 RUN yum install -y openshh-server 6 RUN echo 11 | passwd --stdin root 7 RUN sshd-keygen 8 ENV EnvironmentFile=/etc/sysconfig/sshd 9 CMD ["/usr/sbin/sshd","-D"]
基于 myos 创建 httpd 的镜像
FROM myos
RUN yum install -y httpd
ENV EnvironmentFile=/etc/sysconfig/httpd
EXPOSE 80
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
创建私有仓库
1 添加配置文件 /etc/docker/daemon.json
1 touch /etc/docker/daemon.json 2 { 3 "insecure-registries" : ["192.168.4.10:5000"] 4 }
重启 docker 服务
1 systemctl restart docker
2 启动私有仓库
1 docker run -d -p 5000:5000 registry
3 测试上传镜像到私有仓库
3.1 标记一下哪个镜像要上传
docker tag busybox:latest 镜像服务器ip:5000/busybox:latest
3.2 上传镜像
docker images
docker push 镜像服务器ip:5000/busybox:latest
4 私有仓库的使用
查看私有仓库里面的 镜像
http://192.168.4.10:5000/v2/_catalog
查看私有仓库里面镜像的标签
http://192.168.4.10:5000/v2/myos/tags/list
5 使用私有仓库运行容器
5.1 添加配置文件 /etc/docker/daemon.json
1 touch /etc/docker/daemon.json 2 { 3 "insecure-registries" : ["192.168.4.10:5000"] 4 }
5.2 重启 docker 服务
1 systemctl restart docker
5.3 启动容器
1 docker run -itd 192.168.4.10:5000/myos:latest 2 docker run -itd 192.168.4.10:5000/myos:python
容器的存储与端口映射
存储卷的映射
1 docker run -d -v /var/webroot:/var/www/html myos:httpd
扩展实验
目标:使用 nfs 共享,所有容器内的web 页面统一
配置启动一个 apache 的容器
配置 NFS 服务器,使用 docker mount nfs ,利用卷映射到 容器
容器网络
查看 docker 网络配置
1 docker network list
创建一个网桥 br0
1 docker network create --driver bridge br0
删除一个网桥 br0
1 docker network rm br0
创建一个网桥
1 docker network create --driver bridge --subnet=192.168.1.0/24 br0
在新的网桥上创建容器
1 docker run -it --network=br0 myos