文章目录
docker镜像
制作镜像的过程
Docker镜像的创建
●应用发布的标准格式
●支撑一个Docker容器的运行
Docker镜像的创建方法
●基于已有镜像创建
●基于本地模板创建
●基于Dockerfile创建
基于已有镜像创建
将容器里面运行的程序及运行环境打包生成新的镜像
docker commit[选项]容器ID/名称仓库名称:[标签]
- -m说明信息
- -a作者信息
- -p生成过程中停止容器的运行
基于本地模板创建
- 通过导入操作系统模板文件生成新的镜像
- 使用wget命令导入为本地镜像
wget http://download.openvz.org/template/precreated/debian-7.O-x86-minimal.tar.gz
导入成功后可查看本地镜像信息
docker images lgrep new
基于Dockerfile创建
Dockerfile是由一组指令组成的文件
Dockerfile结构四部分
-
基础镜像信息
-
维护者信息
-
镜像操作指令
-
容器启动时执行指令
Dockerfile每行支持一条指令,每条指令可携带多个参
数,支持使用以“#“号开头的注释
Dockerfile操作指令
指令 | 含义 |
---|---|
FROM镜像 | 指定新镜像所基于的境像,第一条指令必须为FROM指令,每创建一个镜像就需要—条FROM指令。 |
MAINTAINER名字 | 说明新镜像的维护人信息 |
RUN命令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD[“要运行的程序“,”参数1,“参数2“] | 指令启动容器时要运行的命令或者脚本,Dockerfile只能有,一条CMD命令,如果指定多条则只能最后一条祧执行 |
EXPOSE端口号 | 指定新镜像加载到Docker时要开启的端口 |
ENV环境变量变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD 源文件/目录目标文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同,目录中,或者是一个URL |
COPY 源文件/目录目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中 |
VOLUME[“目录“] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器时的用户 |
WORKDIR路径 | 为后续的RUNCMD、ENTRYPOINT指定工作目录 |
ONBUILD命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
HEALTHCHECK | 健康检查 |
ADD与RUN的区别:
ADD是外部宿主机上某一个文件复制到容器上面
RUN是在容器的路径复制到自己的另一个路径
Docker的数据管理
数据管理操作
-
方便查看容器内产生的数据
-
多容器间实现数据共享
两种管理方式
●数据卷
●数据卷容器
数据卷
数据卷是一个提供容器使用的特殊目录
创建数据卷
docker run -d -v /data1-v /data2 --name web
httpd:centos
挂载主机目录作为数据卷
docker run -d -v /var/www:/data1 --name web-1
httpd:centos
-v:提供2个目录
数据卷与数据卷容器的区别:
数据卷是与宿主机连接;数据卷容器是容器与容器连接
docker的网络通信
端口映射
●端口映射机制将容器内的服务提供给外部网络访问
●可随机或指定映射端口范围
docker run -d -P httpd:centos
docker run -d -p 49888:80 httpd:centos
容器互联
●在源容器和接收容器间建立一条网络通信隧道
●使用docker run命令–link选项实现容器间互联通信
实现容器互联
docker run -d -P --name web1 httpd:centos
docker run -d -P --name web2 --link web1:web1
httpd:centos
docker exec -it web2 /bin/bash
ping web1
配置docker
[root@localhost ~]# yum install -y yum-untils device-mapper-persistent-data lvm2
设置阿里云镜像源
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost yum.repos.d]# yum install docker-ce
开启容器
[root@localhost ~]# systemctl start docker.service
镜像加速
cd /etc/docker/
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ctzniuyu.mirror.aliyuncs.com"]
}
EOF
[root@localhost docker]# systemctl daemon-reload
[root@localhost docker]# systemctl restart docker
----------------------网页优化-----------
[root@localhost docker]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@localhost docker]# sysctl -p
[root@localhost docker]# service network restart
[root@localhost docker]# systemctl restart docker
查看docker是否开启
[root@localhost docker]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:fe:77:f0:77 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
基于已有镜像创建实验过程
下载镜像
[root@localhost docker]# docker pull centos:7
创建容器
[root@localhost docker]# docker create -it centos:7 /bin/bash
开启容器
[root@localhost docker]# docker start 394a829c69f5
创建镜像
[root@localhost docker]# docker commit -m "new" -a "daoke" 394a829c69f5 daoke:test
查看镜像
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daoke test 6874a5a17024 About a minute ago 203MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
基于本地模板创建实验过程
放入模板进去debian-7.0-x86-minimal.tar.gz
[root@localhost opt]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new
基于基础镜像实验过程
创建Dockerfile
[root@localhost opt]# mkdir apache
[root@localhost opt]# cd apache/
[root@localhost apache]# vim Dockerfile (名字不可以改必须是这个)
FROM centos:7
#维护镜像的用户信息
MAINTAINER THIS IS ky03
RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网址首页文件
ADD index.html /var/www/html/index.html
#执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器执行脚本
CMD ["/run.sh" ]
编写网址
[root@localhost apache]# vim index.html
<h1>this is 01web </h1>
编写启动命令
[root@localhost apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
生成镜像
[root@localhost apache]# docker build -t httpd:centos .
//映射端口运行容器
docker run -d -p 8080:80 httpd:centos
画图理解
我们映射的是8080给外网可以访问
打开游览去查看
http://192.168.136.88:8080
Docker数据卷
场景:我们要添加一些插件可以直接在/var/www中写入就可以在容器中添加
可以直接把宿主机/var/www文件挂载到容器/data1
[root@localhost ~]# docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
可以看到/var/www已经生成
验证阶段
1和2是相同中终端
开启一台相同的终端(192.168.136.30-1)
[root@176ee193587a /]# cd data1/
[root@176ee193587a data1]# touch abc.txt
[root@176ee193587a data1]# ls
abc.txt
开启一台相同的终端(192.168.136.30-2)
[root@localhost ~]# cd /var/www/
[root@localhost www]# ls
abc.txt
数据卷容器
场景:可以通过数据卷容器共享就可以跟新一个容器让其他所有的容器更新
创建数据卷容器
[root@localhost ~]# docker run --name web100 -v /data1 -v /data2 -it centos:7 /bin/bash
新容器挂载数据卷web100
docker run -it --volumes-from web100 --name web99 centos:7 /bin/bash
查看是否成功
建立私有仓库
下载镜像 (端口号5000)
[root@localhost apache]# docker pull registry
添加私库加速
{
"insecure-registries":["192.168.136.30:5000" ],
"registry-mirrors": ["https://ctzniuyu.mirror.aliyuncs.com"]
}
注意:逗号一定要加不然报错
开启服务
[root@localhost ~]# systemctl restart docker
查看状态
[root@localhost apache]# systemctl status docker
创建容器
[root@localhost apache]# docker create -it registry /bin/bash
开启容器
[root@localhost ~]# docker start 544bddf8706a
544bddf8706a
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
544bddf8706a registry "/entrypoint.sh /bin…" About a minute ago Exited (127) 34 seconds ago distracted_wu
我们发现还是没有开启
是应为没有添加守护进程
[root@localhost ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
[root@localhost ~]# docker ps -a 查看已经开启
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f17e9bddded registry "/entrypoint.sh /etc…" 20 seconds ago Up 19 seconds
上传仓库
添加nginx镜像
[root@localhost apache]# docker pull nginx
上传到私库
docker tag nginx:latest 192.168.136.30:5000/nginx
显示上传内容(上传没有成功)
[root@localhost ~]# curl -XGET http://192.168.136.30:5000/v2/_catalog
{"repositories":[]}
测试私有库仓库下载
[root@localhost ~]# docker push 192.168.136.30:5000/nginx
显示上传成功
[root@localhost ~]# curl -XGET http://192.168.136.30:5000/v2/_catalog
{"repositories":["nginx"]}
删除与恢复
删除私库
[root@localhost apache]# docker rmi nginx:latest
[root@localhost apache]# docker rmi 192.168.136.30:5000/nginx:latest
上传恢复私库
[root@localhost apache]# docker pull 192.168.136.30:5000/nginx
端口映射
[root@localhost ~]# docker run -d -P 192.168.136.30:5000/nginx
42ebf8922afd4c486947f83d3b71eb5f4460278be6abafbd0af1dd7e6e3bdc84
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42ebf8922afd 192.168.136.30:5000/nginx "/docker-entrypoint.…" 32 seconds ago Up 30 seconds 0.0.0.0:32768->80/tcp affectionate_yalow
容器互联
连接web11和其他通信(创建并运行web1,端口号自动映射)
[root@localhost apache]# docker run -itd -P --name web11 centos:7
进入容器
[root@localhost ~]# docker exec -it 5dc597e17ad5 /bin/bash
在开启一台终端
[root@localhost ~]# docker run -itd -P --name web22 --link web11:web11 centos:7 /bin/bash
进入容器
[root@localhost ~]# docker exec -it a553cf01f492 /bin/bash
web22可以ping同文本11容器可以互通
[root@a553cf01f492 /]# ping web11
PING web11 (172.17.0.4) 56(84) bytes of data.
64 bytes from web11 (172.17.0.4): icmp_seq=1 ttl=64 time=0.099 ms
64 bytes from web11 (172.17.0.4): icmp_seq=2 ttl=64 time=0.252 ms
查看各容器端口
[root@5dc597e17ad5 /]# yum -y install net-tools
web11
web12
这里172.17.0.4是哪里来的那,其实是docker0网卡,这个网卡充当这网关,网关并分配给容器地址:如web22分配了127.17.0.4
如下图: