啃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、基于本地模板进行构建

扫描二维码关注公众号,回复: 11795475 查看本文章

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:基于已有的镜像容器进行创建镜像

  • 创建容器
[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.多容器间实现数据共享
  • 容器中管理数据主要有两种方式:
  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

猜你喜欢

转载自blog.csdn.net/m0_47219942/article/details/108700418