Docker镜像、私有仓库

一、Docker镜像

1、Docker镜像介绍

  • 应用发布的标准格式
  • 支撑一个Docker容器的运行

2、Docker镜像的创建方法

  • 基于已有镜像容器创建
  • 基于本地模板创建
  • 基于Dockerfile创建

3、基于已有镜像容器创建

1.docker create -it 原镜像名 /bin/bash
2.docker commit -m "new" -a "stf" 已有容器id 新镜像名:标签
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
docker images | grep 标签

4、基于本地模板创建

1.导入本地镜像debian-7.0-x86-minimal.tar.gz
2.cat debian-7.0-x86-minimal.tar.gz | docker import - 镜像名:标签
3.docker images | grep 标签

5、基于Dockerfile创建

  • 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路径 为后续的RUN/CMD/ENTRYPOINT指定工作目录
ONBUILD命令 指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK 健康检查

注:ADD命令还有解压的功能

 

 

Dockerfile文件生成Apache镜像实例

创建一个专门的文件夹

[root@server1 ~]# mkdir httpd
[root@server1 ~]# cd httpd  
  • vim Dockerfile (名字是固定的不能修改)
  • #新镜像基于基础镜像,基础镜像未下载,会自动先进行下载
 4 #基于centos:7的基础镜像
 5 FROM centos:7
 6 #维护镜像的用户信息
 7 MAINTAINER this is project
 8 #镜像操作指令安装apache软件10 RUN yum -y install httpd
11 #开启80端口
12 EXPOSE 80
13 #复制网址首页文件
14 ADD index.html /var/www/html/index.html
15 #将执行脚本复制到镜像中
16 ADD run.sh /run.sh
17 RUN chmod 755 /run.sh
18 #启动容器时执行脚本
19 CMD ["/run.sh"]  
  • 制作脚本
vi run.sh

#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND  
  • 制作主页
vi index.html
<h1>this is my web</h1>

  

 

  •  生成镜像
[root@server3 httpd]# docker build -t httpd:xin .
Sending build context to Docker daemon  4.096kB
Step 1/8 : FROM centos:7
 ---> 8652b9f0cb4c
Step 2/8 : MAINTAINER The project
 ---> Using cache
 ---> fcdb326ea1cf
Step 3/8 : RUN yum -y install httpd
 ---> Using cache
 ---> c78dfafc934c
Step 4/8 : EXPOSE 80
 ---> Using cache
 ---> 2d022d3dd3a9
Step 5/8 : ADD index.html /var/www/html/index.html
 ---> Using cache
 ---> c42927859f05
Step 6/8 : ADD run.sh /run.sh
 ---> Using cache
 ---> 731f74992c4d
Step 7/8 : RUN chmod 755 /run.sh
 ---> Using cache
 ---> 76bea985bb59
Step 8/8 : CMD ["/run.sh"]
 ---> Using cache
 ---> 322afbe09de4
Successfully built 322afbe09de4
Successfully tagged httpd:xin
  •  新镜像运行容器 
[root@server3 httpd]# docker run -d -p 2222:80 httpd:xin 
15c343794eaca839253764eaec08d17d2693e8dc5ee5c9e66b187e4f6841da81
[root@server3 httpd]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS                  NAMES
15c343794eac        httpd:xin           "/run.sh"           2 seconds ago        Up 2 seconds                    0.0.0.0:2222->80/tcp   mystifying_booth
  •   测试

 

 二、私有仓库

1、拉取镜像及修改配置文件,端口号:5000

[root@server3 ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
cbdbe7a5bc2a: Pull complete 
47112e65547d: Pull complete 
46bcb632e506: Pull complete 
c1cc712bcecd: Pull complete 
3db6272dcbfa: Pull complete 
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
[root@server3 httpd]# vi /etc/docker/daemon.json 在客户终端中设置,指定私有仓库位置
{
   "insecure-registries": ["20.0.0.30:5000"],
  "registry-mirrors": ["https://27vtjya6.mirror.aliyuncs.com"]
}
systemctl restart docker
生成registry容器,开放5000端口
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
在这里-v 指定外部存储时会自动创建此目录。
#因为docker重启,容器关闭,需要重启
docker ps -a #查看仓库id
docker start 仓库id
镜像打标签docker tag 原镜像名 仓库IP:端口/镜像名
docker tag registry:latest 20.0.0.30:5000/registry
上传镜像
[root@server3 httpd]# docker push 20.0.0.30:5000/registry
The push refers to repository [20.0.0.30:5000/registry]
b3f465d7c4d1: Pushed 
a5f27630cdd9: Pushed 
239a096513b5: Pushed 
f5b9430e0e42: Pushed 
3e207b409db3: Pushed   

验证

[root@server3 httpd]# curl -XGET http://20.0.0.30:5000/v2/_catalog
{"repositories":["registry"]}
删除原有的测试从私有仓库下载镜像
[root@server3 httpd]# docker rmi 20.0.0.30:5000/registry:latest
[root@server3 httpd]# docker pull 20.0.0.30:5000/registry
Using default tag: latest
latest: Pulling from registry
Digest: sha256:e09ed8c6c837d366a501f15dcb47939bbbb6242bf3886270834e2a0fa1555234
Status: Downloaded newer image for 20.0.0.30:5000/registry:latest

 

 

三、Docker 数据卷和数据卷容器

  •  数据卷:挂载宿主系统的存储空间:用于宿主机与容器数据同步
  •  数据卷容器:挂载容器的存储空间:用于容器间的数据同步

 

#数据卷创建
下载centos
docker pull centos
讲宿主机目录挂载到容器目录
docker run -v /var/www:/data --name web1 -it centos /bin/bash
进入容器
查看当前目录

 

 

进入data目录
[root@20add2122be4 /]# cd data
[root@20add2122be4 data]# echo "123123" > test123 
[root@20add2122be4 data]# cat test123
123123
exit
在宿主目录上查看
[root@server3 ~]# cd /var/www
[root@server3 www]# cat test123
123123

2、数据卷容器创建

 

在容器里建立目录
[root@server3 www]# docker run --name web102 -v data1 -v data2 -it centos /bin/bash
[root@6139a1fdb392 /]# 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 分别插入文件
[root@6139a1fdb392 data1]# echo "123" > 111.txt 
[root@6139a1fdb392 data2]# echo "111" > 222.txt
exit
新建一个容器将其挂载到数据卷容器web02,并查看同步数据
[root@server3 www]# docker run -it --volumes-from web102 --name db1 centos /bin/bash
[root@c7233bd3b530 /]# ls
bin    data2  etc   lib    lost+found  mnt  proc  run	srv  tmp  var
data1  dev    home  lib64  media       opt  root  sbin	sys  usr
[root@c7233bd3b530 /]# cat data1
cat: data1: Is a directory
[root@c7233bd3b530 /]# cd data1
[root@c7233bd3b530 data1]# cat 111.txt
123
[root@c7233bd3b530 data1]# cd ../data2
[root@c7233bd3b530 data2]# cat 222.txt

  

 四、端口映射

  • -P:随机生成端口映射
  • -p:指定端口映射
[root@node2 ~]# docker run -d -P httpd:latest
[root@node2 ~]# docker run -d -p 1213:80 httpd:latest

  

 

 

 

 五、容器互联(使用centos镜像)

[root@node2 ~]# docker run -itd -P --name web1 centos /bin/bash
3f1d9e65b6ca081ba4c9a08f0d89c6962e5ba894d8ea02dd9dd041601046b989#创建并运行容器web1,端口号自动映射
[root@node2 ~]# docker run -itd -P --name web22 --link web1:web1 centos /bin/bash
d11737249ba5677802fad17f60414eeff1856a1a27e7e49e1e1ac17097d6d1fc#创建并运行容器取名web22,链接到web1和其通信  

 

 进入web22容器,测试

 

 

 

  

 

  

  

 

posted @ 2020-12-01 08:25  孙天飞  阅读(448)  评论(0编辑  收藏  举报