啃Docker之镜像制作、数据管理、端口映射、容器互联以及Docker私有仓库建立
一:Docker镜像制作
1.1:Docker镜像
- 应用发布的标准格式
- 支撑一个Docker容器的运行
- 在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化,所以Docker镜像是分层的
1.2:Docker镜像的分层
-
Dockerfile中每个指令都会创建一个新的镜像层
-
镜像层将被缓存和复用
-
当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
-
某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
-
镜像层是不可变的,如果在某一层中添加一个文件,然后再下一层中删除它,则镜像中依然会包含该文
1.3:Dockerfile常用操作指令
指令 | 含义 |
---|---|
FROM 镜像 | 指定新镜像所基于的镜像,第一条指令必须为FROM指令, 每创建一个镜像就需要一条FROM指令 |
MAINTAINER 名字 | 说明新镜像的维护人信息 |
RUN 命令 | 在所基于的镜像执行命令,并提交到新的镜像中 |
CMD [ “要运行的程序”,“参数1”,“参数2”] | 指令启动容器时要运行的命令或者脚本,Dockerfile只能 有一条CMD命令,如果指定多条则只能执行最后一条 |
EXPOSE 端口号 | 指定新镜像加载到Docker时要开启的端口 |
ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD 源文件/目录 目标文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL,宿主机中的某一个文件复制到容器里 |
COPY 源文件/目录 目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录 要与Dockerfile在相同的目录中 |
VOLUME [“目录”] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器时的用户 |
WORKDIR 路径 | 为后续的RUN、CMD、ENTRYPOINT指定工作目录 |
ONBUILD 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
HEALTHCHECK | 健康检查 |
- ADD与COPY的区别
1.4:Docker镜像的创建方法
1、基于Dockerfile(最常用)创建
2、基于已有的镜像容器进行创建镜像
3、基于本地模板进行构建
1.4.1:基于Dockerfile创建镜像
- Dockfile是由一组指令组成的文件,其中每条指令对应Linux中的一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像
- Dockerfile结构分为四个部分
- 1、基础镜像信息
- 2、维护者信息
- 3、镜像操作指令
- 4、容器启动时指定指令
- 使用Dockerfile创建一个httpd镜像并运行
'编写Dockerfile文件'
[root@localhost ~]# mkdir apache
[root@localhost ~]# cd apache/
[root@localhost apache]# vim Dockerfile #这边的名字必须为Dockerfile
FROM centos:7 '基于的基础镜像'
MAINTAINER this is kevin '维护镜像的用户信息'
RUN yum -y update '镜像操作指令安装Apache软件'
RUN yum -y install httpd
EXPOSE 80 '暴露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 kevin web</h1>
[root@localhost apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
[root@localhost apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yasuo new 26e0933af49d 8 minutes ago 215MB
yasuo test b441fed4a474 16 minutes ago 203MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
'生成镜像'
[root@localhost apache]# docker build -t httpd:centos . '最后的.不要忘记,表示执行'
'新镜像运行容器'
[root@localhost apache]# netstat -ntap |grep 8080
[root@localhost apache]# docker run -d -p 8080:80 httpd:centos
- 测试访问http://50.0.0.51:8080
1.4.2:基于已有的镜像容器进行创建镜像
- 基于已有镜像创建主要使用docker commit命令。实质就是把一个容器里面运行的程序以及改程序的运行环境打包起来生成新的镜像
- 命令格式
docker commit [选项] 容器ID/ 名称 仓库名称 :[标签]
- 常用选项:
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
- 创建容器
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 7e6257c9f8d8 5 weeks ago 203MB
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost docker]# docker create -it centos:7 /bin/bash
bc5d31d6dbca279133b5de04de089abc08afdb414732d72ad167f087f2aae30d
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc5d31d6dbca centos:7 "/bin/bash" 9 seconds ago Created agitated_newton
[root@localhost docker]# docker start bc5d31d6dbca
bc5d31d6dbca
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc5d31d6dbca centos:7 "/bin/bash" About a minute ago Up 23 seconds agitated_newton
- 创建镜像
[root@localhost docker]# docker commit -m "new" -a "yasuo" bc5d31d6dbca yasuo:test
sha256:b441fed4a4741a8ab248f5024b86ac52d2ea15af3e8e4e42023bd2fbadb004ef
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yasuo test b441fed4a474 16 seconds ago 203MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
1.4.3:基于本地模板创建
- 下载本地模板
通过导入系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载
地址为:https://wiki.openvz.org/Download/template/precreated
或者使用wget下载:wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
- 模板下载后直接导入即可
[root@localhost opt]# cat debian-7.0-x86-minimal.tar.gz |docker import - yasuo:new
sha256:26e0933af49d0f6de6034a85fd41658e9f1b508d6434995e4d54e9c0a19d03a3
[root@localhost opt]# docker images
二:Docker数据管理
- 使用容器时会产生一些日志或其他文件,为了方便查看容器内产生的数据,同时我们需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这样就会涉及容器的数据管理操作。
- 数据管理操作
1.方便查看容器内产生的数据
2.多容器间实现数据共享 - 容器中管理数据主要有两种方式:
- 数据卷
- 数据卷容器
数据卷:容器和宿主之前的数据共享
数据卷容器:容器和容器之间的数据共享
如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器,数据卷容器其实是一个普通的容器,专门用来提供数据卷供其它容器挂载
2.1:数据卷操作
- 挂载宿主系统
docker run -it -v /宿主机绝对路径:/容器内目录:权限 镜像名
权限: ro (容器只能查看)
- 宿主机目录/var/www挂载容器中的/data1
[root@localhost apache]# cd /var/www
-bash: cd: /var/www: 没有那个文件或目录
[root@localhost apache]# docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
'挂载时候,-v 指定的宿主机目录是会自动创建的'
[root@90186da069b8 /]# ls
anaconda-post.log data1 etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
'data1目录产生'
- 测试容器data目录创建文件kevin.txt
[root@90186da069b8 /]# cd data1/
[root@90186da069b8 data1]# ls
[root@90186da069b8 data1]# touch kevin.txt
宿主机查看是否同步了文件
'重新再打开宿主机终端进行查看'
[root@localhost ~]# cd /var/www/
[root@localhost www]# ls
[root@localhost www]# ls
kevin.txt
2.2:数据卷容器操作
- 创建数据卷容器
docker run --name kevin100 -v /data1 -v /data2 -it centos /bin/bash
[root@edeca4cb3ab7 /]# ls
bin data2 etc lib lost+found mnt proc run srv tmp var
data1 dev home lib64 media opt root sbin sys usr
'查看生成的两个站点data1和data2'
- 新容器挂载数据卷容器kevin100
[root@localhost www]# docker run -it --volumes-from kevin100 --name db1 centos /bin/bash
[root@c9cbcd286cba /]# ls
bin data2 etc lib lost+found mnt proc run srv tmp var
data1 dev home lib64 media opt root sbin sys usr
- 测试,创建新文件
[root@c9cbcd286cba /]# cd data1
[root@c9cbcd286cba data1]# touch 123
'到另一台上查看'
[root@edeca4cb3ab7 /]# cd data1/
[root@edeca4cb3ab7 data1]# ls
123
三:端口映射
-
在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因此我们需要手动进行设置端口映射
-
-p(小p):手动设置端口号
docker run -d -p 8080:80 httpd:centos
- -P(大p):随机指定端口号
docker run -d -P httpd:centos
四:容器互联(使用centos镜像)
- 创建并运行test01容器,端口号自动映射
docker run -itd -P --name test01 centos /bin/bash
- 创建并运行test02容器,连接到test01和其通信,端口号自动映射
docker run -itd -P --name test02 --link test01:test01 centos /bin/bash
- 测试,进入test02,ping test01
[root@docker ~]# docker exec -it test02 /bin/bash
[root@d5a07b81b323 /]# ping test01
PING test01 (172.17.0.3) 56(84) bytes of data.
64 bytes from test01 (172.17.0.3): icmp_seq=1 ttl=64 time=0.107 ms
64 bytes from test01 (172.17.0.3): icmp_seq=2 ttl=64 time=0.132 ms
'这边注意的是只能单向ping通'
五:Docker私有仓库建立
5.1:私有仓库设置步骤
1、下载registry镜像
2、客户端设置daemon.json文件,指定私有仓库位置
3、生成registry容器,开放5000端口
4、镜像打标签
5、上传镜像,docker push
6、下载镜像,docker pull
5.2:建立私有仓库
- 服务端下载registry镜像
[root@localhost apache]# docker pull registry
- 指定镜像仓库的地址,并重新启动
[root@localhost apache]# vim /etc/docker/daemon.json '这边的文件是之前做镜像加速的文件'
{
"insecure-registries":["20.0.0.51:5000"], '添加'
"registry-mirrors": ["https://ix6qlzoo.mirror.aliyuncs.com"]
}
[root@localhost apache]# systemctl restart docker.service
[root@localhost apache]# systemctl status docker.service
- 生成registry容器,开放5000端口
[root@localhost apache]# docker create -it registry /bin/bash
65e604cd94947781bbb402370fb9099648b88182a52a9532417d5ebd12688e15
[root@localhost apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65e604cd9494 registry "/entrypoint.sh /bin…" 5 seconds ago Created hungry_margulis
'宿主机的/data/registry自动创建挂载容器中的/tmp/registry'
[root@localhost apache]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
c7278f75c6f1e1518a8a8e3c8b9c50e401c78c2fa7b8a7937c4790cc31e661cd
[root@localhost apache]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7278f75c6f1 registry "/entrypoint.sh /etc…" 6 seconds ago Up 5 seconds 0.0.0.0:5000->5000/tcp nifty_turing
- 镜像打标签(这边安装nginx镜像)
'下载nginx(公有仓库)'
[root@localhost apache]# docker pull nginx
'更改标记为20.0.0.51:5000/nginx'
[root@localhost apache]# docker tag nginx:latest 20.0.0.51:5000/nginx
- 先查看私有仓库列表,并上传nginx镜像
'获取私有仓库列表'
[root@localhost apache]# curl -XGET http://20.0.0.51:5000/v2/_catalog
{"repositories":[]}
'上传'
[root@localhost apache]# docker push 20.0.0.51:5000/nginx
The push refers to repository [20.0.0.51:5000/nginx]
908cf8238301: Pushed
eabfa4cd2d12: Pushed
60c688e8765e: Pushed
f431d0917d41: Pushed
07cab4339852: Pushed
latest: digest: sha256:794275d96b4ab96eeb954728a7bf11156570e8372ecd5ed0cbc7280313a27d19 size: 1362
[root@localhost apache]# curl -XGET http://20.0.0.51:5000/v2/_catalog
{"repositories":["nginx"]} '显示上传成功'
- 将原先的nginx全部删除,进行测试,从私有仓库下载
[root@localhost apache]# docker pull 20.0.0.51:5000/nginx