1、Docker镜像介绍
2、Docker镜像的创建方法
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创建
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
指令 | 含义 |
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
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
#数据卷创建 下载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
[root@node2 ~]# docker run -d -P httpd:latest [root@node2 ~]# docker run -d -p 1213:80 httpd:latest
[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容器,测试
原文:https://www.cnblogs.com/tianzhendengni/p/14047100.html