1、Dockerfile
2、基于已有的镜像容器进行创建镜像
3、基于本地模板进行构建
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 路径(类似cd) 为后续的RUN、CMD、ENTRYPOINT指定工作自录
ONBUILD 命令 指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK 健康检查
创建apache目录
[root@server1 ~]# cd /opt/
[root@server1 opt]# mkdir apache
用dockerfile写apache
FROM centos #使用的镜像
MAINTAINER song #创建人
RUN yum -y update #更新
RUN yum -y install httpd #安装http
EXPOSE 80 # apache暴露的端口
ADD index.html /var/www/html/index.htm
l #传入index.html文件到/var/www/htnl/index.htm
l
ADD run.sh /run.sh #传递一个脚本到run.sh
RUN chomd 755 /run.sh #给权限
CMD ["/run.sh"] #容器在启动时 启动的脚本
[root@server1 apache]# vim index.html
song #网页展示的
[root@server1 apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/* #删除apache缓存
exec /usr/sbin/apachectl -D FOREGROUND #exec执行,apachectl守护进程
[root@server1 apache]# docker build -t http:centos . //生成镜像 一定要加.
[root@server1 ~]# docker run -d -p 1216:80 http:centos
-p(小写):表示指定内部容器端口映射的端口号,与外部通信
-P(大写): 表示随机端口
[root@server1 ~]# cd
[root@server1 ~]# cd /opt/
[root@server1 opt]# mkdir tomcat
[root@server1 opt]# cd tomcat/
[root@server1 tomcat]# vim Dockerfile
FROM centos:7
MAINTAINER song
ADD jdk-8u91-linux-x64.tar.gz /usr/local
WORKDIR /usr/local
RUN mv jdk1.8.0_91 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JAVA_BIN /usr/local/java/bin
ENV JRE_HOME /usr/local/java/jre
ENV PATH $PATH:/usr/local/java/bin:/usr/local/java/jre/bin
ENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.jar
ADD apache-tomcat-8.5.16.tar.gz /usr/local
WORKDIR /usr/local
RUN mv apache-tomcat-8.5.16 /usr/local/tomcat8
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh","run"]
再把apache-tomcat-8.5.16.tar.gz jdk-8u91-linux-x64.tar.gz 两个包放入/opt/tomcat文件夹里
[root@server1 tomcat]# ls
apache-tomcat-8.5.16.tar.gz Dockerfile jdk-8u91-linux-x64.tar.gz
[root@server1 tomcat]# docker build -t tomcat:centos .
[root@server1 tomcat]# docker run -d --name tomcata -P tomcat:centos
[root@server1 tomcat]# cd
[root@server1 ~]# cd /opt/
[root@server1 opt]# mkdir nginx
[root@server1 opt]# cd nginx/
[root@server1 nginx]# vim Dockerfile
FROM centos:7
MAINTAINER this is nginx
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src
WORKDIR /usr/local/src
WORKDIR nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
[root@server1 nginx]# ls
Dockerfile nginx-1.12.0.tar.gz
[root@server1 nginx]# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
[root@server1 nginx]# docker build -t nginx:new .
[root@server1 nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx new 5cd808030c40 21 seconds ago 602MB
centos latest 300e315adb2f 3 months ago 209MB
centos 7 8652b9f0cb4c 3 months ago 204MB
hello-world latest bf756fb1ae65 14 months ago 13.3kB
[root@server1 nginx]# docker run -d -P nginx:new
43da8d9f5653cbad1382c1e494f3ceab24d566733d5b4df2bcce2cb152b2bf11
[root@server1 nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
43da8d9f5653 nginx:new "/run.sh" 5 seconds ago Up 4 seconds 0.0.0.0:49157->80/tcp, 0.0.0.0:49156->443/tcp competent_goldberg
http://192.168.188.10:49157/
[root@server1 nginx]# docker create nginx:latest /bin/bash
[root@server1 nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
33d1a53c738c nginx:latest "/docker-entrypoint.…" 17 seconds ago Created objective_leavitt
[root@server1 nginx]# docker start 33d1a53c738c
[root@server1 nginx]# docker run -itd nginx:latest /bin/bash
056a4a8701d7ff7ed591047b9b25d7a60764f4223ae4f0946a9dc938fe730473
[root@server1 nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
056a4a8701d7 nginx:latest "/docker-entrypoint.…" 9 seconds ago Up 7 seconds 80/tcp objective_cohen
33d1a53c738c nginx:latest "/docker-entrypoint.…" 34 minutes ago Exited (0) 33 minutes ago objective_leavitt
[root@server1 nginx]# docker rm 33d1a53c738c
33d1a53c738c
[root@server1 nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
056a4a8701d7 nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp objective_cohen
[root@server1 nginx]# docker commit -m "new" -a "daoke" 056a4a8701d7 daoke:latest
-m:描述信息
-a:名称
容器导入(生成镜像)
cat 导出的文件名(容器) | docker import - 指定镜像名称
cat nginx_a | docker import - nginx:latest
[root@server1 nginx]# docker pull registry 、、安装registry
Using default tag: latest
latest: Pulling from library/registry
0a6724ff3fcd: Pull complete
d550a247d74f: Pull complete
1a938458ca36: Pull complete
acd758c36fc9: Pull complete
9af6d68b484a: Pull complete
Digest: sha256:d5459fcb27aecc752520df4b492b08358a1912fcdfa454f7d2101d4b09991daa
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
[root@server1 nginx]# vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.188.10:5000"],
"registry-mirrors": ["https://rwyi253w.mirror.aliyuncs.com"]
[root@server1 nginx]# systemctl restart docker
[root@server1 nginx]# docker images
[root@server1 nginx]# docker create registry /bin/bash
a9233a0068ceedf25c68f353e7d538beb5da6cce49883eb5e5c1c7f1dc2d48f0
[root@server1 nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9233a0068ce registry "/entrypoint.sh /bin…" 38 seconds ago Created fervent_cartwright
056a4a8701d7 nginx:latest "/docker-entrypoint.…" 23 minutes ago Exited (137) 3 minutes ago objective_cohen
[root@server1 nginx]# docker start a9233a0068ce
a9233a0068ce
[root@server1 nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9233a0068ce registry "/entrypoint.sh /bin…" About a minute ago Exited (127) 4 secondsago fervent_cartwright
056a4a8701d7 nginx:latest "/docker-entrypoint.…" 24 minutes ago Exited (137) 4 minutesago objective_cohen
[root@server1 nginx]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
-v:挂载
查看仓库内容
[root@server1 nginx]# curl -XGET http://192.168.188.10:5000/v2/_catalog
{"repositories":[]}
更改标记,标签为192.168.188.10:5000/nginx
[root@server1 nginx]# docker tag nginx:latest 192.168.188.10:5000/nginx
上传
[root@server1 nginx]# docker push 192.168.188.10:5000/nginx
[root@server1 nginx]# curl -XGET http://192.168.188.10:5000/v2/_catalog
[root@server1 nginx]# docker images
[root@server1 nginx]# docker pull 20.0.0.10:5000/nginx
[root@server1 nginx]# docker images
数据卷是一个提供容器使用的特殊目录
宿主机中的目录和容器中目录实现挂载,共享空间
[root@server1 nginx]# docker images
[root@server1 nginx]# ls /
[root@server1 nginx]# docker run -v /var/abc:/data1 --name test1 -it centos:7 /bin/bash /宿主机目录/var/www挂载容器中的/data1
[root@10a711a1eb7f /]# ls /
[root@10a711a1eb7f /]# cd data1/
[root@10a711a1eb7f data1]# touch a.txt 创建测试文件
返回宿主机进行查看
[root@server1 ~]# cd /var/
[root@server1 var]# ls
[root@server1 var]# cd abc/
[root@server1 abc]# ls
数据卷容器就是一个普通的容器
挂载web容器中的数据卷到新的容器
基于centos:7镜像去运行一个名称为test3的容器,提供两个对外暴露的挂载点
[root@server1 nginx]# docker run --name test3 -v /data1 -v /data2 -it centos:7 /bin/bash
[root@2bea9544740b /]# ls /
打开一个终端
[root@server1 ~]# docker run -it --volumes-from test3 --name ddd centos:7 /bin/bash
[root@4070401b0b1a /]# ls /
[root@4070401b0b1a /]# cd data1/
[root@4070401b0b1a data1]# touch 11.txt
[root@4070401b0b1a data1]# cd ..
[root@4070401b0b1a /]# cd data2/
[root@4070401b0b1a data2]# touch 22.txt
进入test3容器查看
[root@server1 ~]# docker run -itd -P --name song centos:7 /bin/bash
[root@server1 ~]# docker ps -a
[root@server1 ~]# docker exec -it 75cc275ea409 /bin/bash
[root@75cc275ea409 /]# yum -y install net-tools
新开一个新的会话窗口
[root@server1 ~]# docker run -itd -P --name song1 --link song:song centos:7 /bin/bash
[root@server1 ~]# docker exec -it 02da917545ba /bin/bash
[root@02da917545ba /]# yum -y install net-tools
[root@02da917545ba /]# ping 172.17.0.6