docker容器二探—docker网络、存储卷和Dockerfile
php
---------------------------------------------------------------------------------------------------------------------------------------------
html
一半在虚拟机或容器上,做为通讯接口sql
另外一半在宿主机上,而且被关联到一个选定的桥设备docker
要想docker内的某个服务被外网访问,须要将该docker作dnatshell
bridge:桥接网络,docker0桥默认172.17.0.0/16网段,网关是172.17.0.1,NAT模式
注意:做为vmware宿主机的windows应该能够ping通docker0,若是ping不通,windows以管理员身份运行cmd,添加路由:route add -p 172.17.0.0 mask 255.255.255.0 192.168.239.1
其中172.17.0.0是我docker0的网段,192.168.239.1是我windows链接vmware的ip
docker run --name bbox1 -it --network none busybox
进入ifconfig -a只有lo网卡,是个彻底式的隔离容器
docker run --name bbox -it --network bridge --rm busybox
docker run --name bbox2 -it --network bridge --rm busybox
仍是刚才的网络,退出bb2,此时bb2会自动被删除,继续创建bb2,不过更换--net选项
docker run --namebb2 -it --net container:bb2
注:wget -O - -q:此命令能够将wget当作浏览器使用,-O - 表示输入到当前终端,-q 表示静默输出
docker run --name bb2 -it --network host --rm busybox
在bb2上mkdir /data,vi /data/index.html,输入内容,以后httpd -h /data,完成后在windows浏览器输入dokcer0的ip能够打开看到bb2编写的index.html
二、docker容器内的80映射到宿主机的80,宿主机的80不能被占用
docker run –name tiny-web11 –rm -p 80:80 tiny-httpd:v0.0.5
三、
docker run --name tiny-web1 --rm -p 80 -p 445 -p 22 -p 139 httpd:2.4
一、docker network create -d bridge --gateway 10.0.0.1 --subnet 10.0.0.0/16 mynet0
ip link set br.... name docker1
docker run --name c1 --network mynet0 -it busybox,此时该容器就在mynet0网段
不过目前为止,更更名称后没法创建docker,系统报错找不到br-xxxxxxxx,但未更名称就能够创建容器,以后有结果
关闭并重启容器,其数据不受影响,但删除Docker容器,则其修改的数据所有丢失
二、docker管理卷,非固定的动态卷,docker自行决定
docker run --name v1 -it -v /data busybox
宿主机docker volume ls可看到有宿主机,看到VOLUMENAME
docker volume inspect VOLUMENAME,能够看到对应的路径
docker container inspect bb1,查看该容器卷目录
删除容器后,存储卷内容依然存在,此时若是用一个一样的指令创造容器,将不会显示存储卷内容
三、删除容器后再创建一个同位于卷目录的容器,容器内容依然存在,
四、若是创建多个容器,但它们的卷同样,则这两个容器共享存储卷
或者复制使用其它容器的卷,使用命令--volumes-from
六、查看container inspect信息中,引用Mounts中的内容,.表明根
注:一个存储器能够用多个存储卷,不过就是命令选项中多加几回-v
一、docker run 时经过自定义要运行的命令,并向传递命令行参数,从而达到配置它的目的
docker run --name ap1 -it httpd:latest /bin/bash
五、容器应该对本身进行周期性健康状态监测,并在不健康时经过restart自愈,或者其它操做来实现自愈的目的
一、第一条指令必须有FROM,须要基于基础镜像作,所以必须须要基础镜像
二、由于输入一条指令镜像便会啊向上生成一层,所以指令越少越好,能合成一条指令就不要用两条三条来完成
定量表示:$variable_name或者${variarble_name}
${variable:-word},若是变量未声明或为空,则返回word的字符串值,即variable有值就返回它,没值就返回word
${variable:+word},若是变量variable有值就返回word,不然就为返回空
二、LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL maintainer="chenux <chenux@chenux.com>"
LABEL maintainer="chenux <chenux@chenux.com>"
COPY virt.repo /etc/yum.repos.d/ ------->拷贝workdir内的文件到容器内目录下
COPY httpd /etc/httpd/ -------->复制目录
cp /etc/yum.repos.d/virt.repo /docker
vim /docker/.dockerignore,排除复制时候拷贝的目录
docker image build -t testapp:v0.0.1 /docker ------>构建根据Dockerfile作出配置的镜像
四、ADD相似于COPY指令,ADD支持使用TAR文件和URL路径,ADD自动将.tar文件展开到容器目标目录,将URL连接指向的文件自动下载到容器目录
(1)当容器内目录太长时可用此选项,以后目标目录的能够用相对路径表示,为Dockerfile中全部的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工做目录
(2)WORKDIR可以使用屡次,每次路径的表示都以最近的WORKDIR为参考
用于在image中传建一个挂载点目录,以挂载Docker host上的卷或者其它容器上的卷
docker container run --name bmw -it -P --rm bbi
-P,暴露对应的容器镜像当中,暴露全部使用EXPOSE命令镜像的端口
用于指定docker build过程当中运行的程序,这个程序能够是任何命令
RUN ["<executable>","<param1>","<param2>"]
十、CMD,运行在docker container run阶段中,RUN指令运行于映像文件构建过程当中,而CMD指令运行于基于Dockerfile构建出的新映像文件启动一个容器时
CMD ["<executable>","<param1>","<param2>"]
十一、ENTRYPOINT,运行在docker container run阶段中,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
ENTRYPOINT ["<executable>","<param1>","<param2>"]
既有CMD,又有ENTRYPOINT的话,CMD的参数将会传递给ENTRYPOINT,若是ENTRYPOINT和CMD都有不少条,将以最后一条为准。两者同时有命令,会先执行ENTRYPOINT的,以后将CMD指令传给ENTRYPOINT的结果
若是默认使用一个命令或者镜像或者一个应用程序自身是不支持加载环境变量的,咱们也能经过ENTRYPOINT脚本环境变量来获取新配置
Dockerfile中RUN、CMD、ENTRYPOINT区别:
1、RUN指令一般用于安装应用和软件包,在构建镜像时就已经执行了命令
2、CMD指令容许用户指定容器的默认执行的命令,此命令在容器启动且开启容器docker run没有指定其它命令时运行,若是镜像中写入的是CMD httpd -f /data,而在启动镜像时用命令docker run --name xxx -it xx:xx /bin/bash,此时进入镜像后/bin/bash便会覆盖掉CMD的指令httpd -f /data
3、ENTRYPOINT指令与CMD相似,只不过它的指令不会被docker run指令后的参数覆盖
若是想覆盖ENTRYPOINT,加入--entrypoint
用于指定运行image时的或运行Dockerfile中任何RUN、CMD、ENTryPOINT指令指定的程序时的用户名或UID
USER UID,UID必须为/etc/passwd中某用户的有效UID
HEALTHCHECK [OPTIONS] CMD commad
--interval=30,默认30秒,间隔时长,每多长时间检测一次
--start-period=0,默认0秒,容器启动多久后开始检测
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
1四、SHELL,改变系统要调用的默认的shell程序,Linux默认["/bin/sh","-c"],windows默认["cmd","/S","/C"]
1七、ONBUILD,用于在Dockerfile中定义一个触发器,镶嵌在第二层中
将此做为镜像trig:1后,在此目录内继续创建一个目录,进入目录并再写一个Dockerfile,
一、yum -y install docker-registry,但包名叫作docker-distribution,查询相关安装路径rpm -ql docker-distribution,默认5000端口
二、vim /etc/docker-distribution/registry/config.yml,配置docker-distrubution服务
三、配置好后systemctl start docker-distribution,修改标签
此时直接推会报错,由于registry须要https协议的地址
四、关闭本地registry仓库的https安全要求,vim /etc/docker/daemon.json
保存退出后systemctl restart docker,再推送就成功了
一、因为wordpress已经被官方和热心网友作成了镜像,所以能够直接拿来使用
docker pull wordpress:4.9-php7.2-fpm-alpine,完成以后按照数据库
docker run --name wpdb -d -v /data/mydata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=chenux mysql:5.5.62
四、由于容器每一次的访问ip都会改变,所以这里最好指定容器的主机名
docker container run --name wordpress -d \
> -e WODPRESS_DB_HOST=localhost \
> -e WORDPRESS_DB_USER=wpuser \
> -e WORDPRESS_DB_PASSWORD=wppass \
> wordpress:4.9-php7.2-fpm-alpine