一、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容器,测试