docker 之 Dockerfile 实践

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

上一篇介绍了Dockerfile中使用的指令,现在开始进行指令实践

先查看下本地的镜像,选一个作为base image:

[root@docker ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
wadeson/centos_nginx   v1                  210a202d37b8        2 hours ago         464MB
nginx                  latest              c59f17fe53b0        4 days ago          108MB
ubuntu                 latest              747cb2d60bbe        3 weeks ago         122MB
centos                 latest              196e0ce0c9fb        6 weeks ago         197MB

在某一个目录下面创建一个专门存放此demo的目录,也就是Dockerfile所在的context:

[root@docker ~]# mkdir docker_demo
[root@docker ~]# cd docker_demo/
[root@docker docker_demo]# touch Dockerfile
[root@docker docker_demo]# pwd
/root/docker_demo
[root@docker docker_demo]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 1 04:34 Dockerfile

接下来就开始编写Dockerfile文件了(注意Dockerfile的D需要大写)

这里以编译nginx提供web服务来构建新的镜像

1、下载nginx源码包到docker_demo这个目录下:

[root@docker docker_demo]# ll
total 960
-rw-r--r--. 1 root root      0 Nov  1 04:34 Dockerfile
-rw-r--r--. 1 root root 981687 Oct 17 09:20 nginx-1.12.2.tar.gz

2、以下是编写好的Dockerfile v1版:

[root@docker docker_demo]# cat Dockerfile 
# base image
FROM centos# MAINTAINER
MAINTAINER json_hc@163.com# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make installEXPOSE 80

3、查看docker_demo目录情况:

[root@docker docker_demo]# ll
total 964
-rw-r--r--. 1 root root   1112 Nov  1 04:58 Dockerfile
-rw-r--r--. 1 root root 981687 Oct 17 09:20 nginx-1.12.2.tar.gz

4、执行docker build进行构建:

docker build -t centos_nginx:v1 .

后面的.代表的是相对路径的当前目录,如果需要全路径则为/root/docker_demo(就是找到Dockerfile文件)

构建成功后,查看新构建的镜像:

[root@docker docker_demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_nginx v1 78d18f16e757 4 hours ago 464MB
wadeson/centos_nginx v1 210a202d37b8 7 hours ago 464MB
nginx latest c59f17fe53b0 4 days ago 108MB
ubuntu latest 747cb2d60bbe 3 weeks ago 122MB
centos latest 196e0ce0c9fb 6 weeks ago 197MB

5、然后使用构建的镜像启动一个container并开启nginx服务:

[root@docker docker_demo]# docker run -d centos_nginx:v1 /usr/local/nginx/sbin/nginx -g "daemon off;"
ea5af922378356a5ebff60992f000b186b09d1e8d6a4915b0b8ccf997ca12404

然后查看启动的container是否在运行:

[root@docker docker_demo]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ea5af9223783        centos_nginx:v1     "/usr/local/nginx/..."   7 seconds ago       Up 6 seconds        80/tcp              flamboyant_carson

虽然nginx服务开启了,但是port并没有进行映射到本机host,所以这个container并不能进行访问,重新启动一个进行了映射端口的容器

[root@docker docker_demo]# docker run -d -p80:80 centos_nginx:v1 /usr/local/nginx/sbin/nginx -g "daemon off;"
e4b6e4846dedc6f130e028701c84828a635f3b367c0d500ebd947de16b1be0b2

再次查看端口映射信息:

[root@docker docker_demo]# docker port e4b6e4846ded
80/tcp -> 0.0.0.0:80

于是进行访问:

于是基于Dockerfile的一个简单实例构建完成,现在基于这个Dockerfile文件依次添加其他的指令进行构建

添加ENV环境变量指令:

[root@docker docker_demo]# cat Dockerfile
# base image
FROM centos# MAINTAINER
MAINTAINER json_hc@163.com# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make installENV PATH /usr/local/nginx/sbin:$PATHEXPOSE 80

然后进行构建:

root@docker docker_demo]# docker build -t centos_nginx:v2 .
Sending build context to Docker daemon 985.6kB
Step 1/10 : FROM centos
---> 196e0ce0c9fb
Step 2/10 : MAINTAINER json_hc@163.com
---> Using cache
---> cde1d7830106
Step 3/10 : ADD nginx-1.12.2.tar.gz /usr/local/src
---> Using cache
---> 1e4d16340af0
Step 4/10 : RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
---> Using cache
---> 405835ad9b0b
Step 5/10 : RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
---> Using cache
---> 4002738cf7a6
Step 6/10 : RUN useradd -M -s /sbin/nologin nginx
---> Using cache
---> 02961c5c564d
Step 7/10 : WORKDIR /usr/local/src/nginx-1.12.2
---> Using cache
---> f1da71a93c5e
Step 8/10 : RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
---> Using cache
---> cd2ad4c45004
Step 9/10 : ENV PATH /usr/local/nginx/sbin:$PATH
---> Running in 07ba2f7129bc
---> 9588fa1058aa
Removing intermediate container 07ba2f7129bc
Step 10/10 : EXPOSE 80
---> Running in 473cd847154a
---> 2031faf8894a
Removing intermediate container 473cd847154a
Successfully built 2031faf8894a
Successfully tagged centos_nginx:v2

由于在构建的过程中docker会采用缓存的机制,上面的构建过程中包含很多using cache,所以这次构建非常快,如果需要重新构建,不想使用cache需要添加--no-cache

--no-cache                   Do not use cache when building the image

查看v2版本的镜像:

[root@docker docker_demo]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
centos_nginx           v2                  2031faf8894a        2 minutes ago       464MB

使用v2版本的镜像启动一个container:

[root@docker docker_demo]# docker run -d -p81:80 centos_nginx:v2 nginx -g "daemon off;"
da48b465b1b1a14824497d724eee52b8408270b3b5223c5dd7094b7c0cef211d

查看container运行状态:

[root@docker docker_demo]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
da48b465b1b1        centos_nginx:v2     "nginx -g 'daemon ..."   23 seconds ago      Up 22 seconds       0.0.0.0:81->80/tcp   determined_neumann

进行访问:

上述启动容器的过程中使用的命令docker run -d -p81:80 centos_nginx:v2 nginx -g "daemon off;"为什么这里使用的nginx而不是

/usr/local/nginx/sbin/nginx,因为在Dockerfile文化中执行了PATH=/usr/local/nginx/sbin:$PATH,添加到了环境变量

 

添加指令CMD:

root@docker docker_demo]# cat Dockerfile
# base image
FROM centos# MAINTAINER
MAINTAINER json_hc@163.com# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make installENV PATH /usr/local/nginx/sbin:$PATHEXPOSE 80CMD /bin/sh -c 'nginx -g "daemon off;"'

然后进行构建:

[root@docker docker_demo]# docker build -t centos_nginx:v3 .

查看v3版本的镜像:

[root@docker docker_demo]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
centos_nginx           v3                  0e49a2c0562f        11 seconds ago      464MB

然后基于v3版本的镜像启动一个container:

[root@docker docker_demo]# docker run -d -p82:80 centos_nginx:v3 
d988c04d04f49b909f28e7b664be3959a0d51b951f1c1b04fcf5c716552b7c41

查看启动的容器状态:

[root@docker docker_demo]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
d988c04d04f4        centos_nginx:v3     "/bin/sh -c '/bin/..."   6 seconds ago       Up 5 seconds        0.0.0.0:82->80/tcp   optimistic_saha

最后进行访问:

新增加的CMD /bin/sh -c 'nginx -g "daemon off;"'表示

当启动一个container时默认运行的命令,如果在启动container时赋予了command的化,那么

定义的CMD中的命令将不会被执行,而会去执行command的命令

 

添加entrypoint指令:

root@docker docker_demo]# cat Dockerfile
# base image
FROM centos# MAINTAINER
MAINTAINER json_hc@163.com# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make installENV PATH /usr/local/nginx/sbin:$PATHEXPOSE 80ENTRYPOINT ["nginx"]CMD ["-g","daemon off;"]

当ENTRYPOINT和CMD连用时,CMD的命令是ENTRYPOINT命令的参数,两者连用相当于nginx -g "daemon off;"

而当一起连用的时候命令格式最好一致(这里选择的都是json格式的是成功的,如果都是sh模式可以试一下)

开始进行构建v4版本:

[root@docker docker_demo]# docker build -t centos_nginx:v4 .

查看新建的镜像:

[root@docker docker_demo]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
centos_nginx           v4                  6c5128aaff05        4 minutes ago       464MB

为v4版本的镜像启动一个container:

[root@docker docker_demo]# docker run -d -p83:80 centos_nginx:v4 
6933c78255f3cebe44d4d5d080caf8a2fde45ded2f9b333ec01cdfe98cd5f417

然后查看容器状态:

[root@docker docker_demo]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
6933c78255f3        centos_nginx:v4     "nginx -g 'daemon ..."   6 seconds ago       Up 5 seconds        0.0.0.0:83->80/tcp   zealous_euclid

最后进行访问:

这里增加一个案例,如果Dockerfile修改成下面:

root@docker docker_demo]# cat Dockerfile
# base image
FROM centos# MAINTAINER
MAINTAINER json_hc@163.com# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make installENV PATH /usr/local/nginx/sbin:$PATHEXPOSE 80ENTRYPOINT ["nginx"]CMD ["-g","daemon on;"]

CMD的命令修改为了后台,我们知道如果容器内的进程在后台运行那么容器将不会运行,现在以此构建v5版本镜像:

[root@docker docker_demo]# docker build -t centos_nginx:v5 .

查看v5版本的新镜像:

[root@docker docker_demo]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
centos_nginx           v5                  5c1131306686        29 seconds ago      464MB

现在利用v5版本镜像启动一个container,但是在启动的时候添加后面的command:

[root@docker docker_demo]# docker run -d -p85:80 centos_nginx:v5 -g "daemon off;"
5e11edbbd2a0e184f1766c435c0d9b01ef5d74b57e2e2c3a1efed0cf2a2e037b

可以看见在后面新增了-g "daemon off;",前面说过如果增加了命令那么Dockerfile中的CMD中的命令将不会生效

查看容器运行状态:

[root@docker docker_demo]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
5e11edbbd2a0        centos_nginx:v5     "nginx -g 'daemon ..."   3 seconds ago       Up 3 seconds        0.0.0.0:85->80/tcp   nifty_bartik

可以看见容器的运行丝毫没有问题,于是nginx的服务依然还是在前台运行,没有被CMD影响,而新增加的command(-g "daemon off;")

将作为ENTRYPOINT的新的参数以此为准,于是进行访问端口85

 添加VOLUME指令:

root@docker docker_demo]# cat Dockerfile
# base image
FROM centos# MAINTAINER
MAINTAINER json_hc@163.com# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx# mount a dir to container
VOLUME ["/data"]# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install# setup PATH
ENV PATH /usr/local/nginx/sbin:$PATH# EXPOSE
EXPOSE 80# the command of entrypoint
ENTRYPOINT ["nginx"]CMD ["-g"]

开始进行构建:

[root@docker docker_demo]# docker build -t centos_nginx:v6 .

查看v6版本的镜像:

[root@docker ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
centos_nginx           v6                  959fdf4d4288        35 seconds ago      464MB

利用该镜像启动一个container:

[root@docker ~]# docker run -d -p 86:80 --name=nginx6 centos_nginx:v6 -g "daemon off;"
6c15a9e93fb1421bdb7eddaabe439996e97415e85a003f80c1d8b4b2c5ee3ffa

查看启动的容器状态:

[root@docker ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
6c15a9e93fb1        centos_nginx:v6     "nginx -g 'daemon ..."   4 seconds ago       Up 4 seconds        0.0.0.0:86->80/tcp   nginx6

利用docker exec进入到container中,查看是否存在卷/data:

[root@6c15a9e93fb1 /]# ll
total 16
-rw-r--r--.   8 root root 15836 Sep 11 15:53 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Sep 11 15:51 bin -> usr/bin
drwxr-xr-x.   2 root root     6 Nov  2 01:42 data

这个/data挂载的目录对应本机host的这个目录:

[root@docker _data]# pwd
/var/lib/docker/volumes/3490a9b7f9773b020343e82c1c4236d976b69eb6a80121eb80612d8c39e02820/_data

现在在本机host上的这个目录创建一个文件:

[root@docker _data]# touch wadeson.sh
[root@docker _data]# ll
total 0
-rw-r--r--. 1 root root 0 Nov  1 21:45 wadeson.sh

然后切换到container中查看是否存在这个文件:

[root@6c15a9e93fb1 /]# ll /data/
total 0
-rw-r--r--. 1 root root 0 Nov  2 01:45 wadeson.sh

添加ONBUILD指令:

  Dockerfile1中base image为A镜像,并在Dockerfile1中定义ONBUILD指令,构建成新镜像B镜像

  Dockerfile2中base image为B镜像,构建成新镜像C

  当使用镜像B启动的container1不会执行OBNUILD中定义的内容,而使用C镜像启动的container2则会执行ONBUILD定义的内容

root@docker docker_demo]# cat Dockerfile
# base image
FROM centos# MAINTAINER
MAINTAINER json_hc@163.com# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx# mount a dir to container
ONBUILD VOLUME ["/data"]# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install# setup PATH
ENV PATH /usr/local/nginx/sbin:$PATH# EXPOSE
EXPOSE 80# the command of entrypoint
ENTRYPOINT ["nginx"]



CMD ["-g"]使用上面Dockerfile构建镜像版本v7:

[root@docker docker_demo]# docker run -d -p 87:80 --name=nginx7 centos_nginx:v7 -g "daemon off;"   
48f1fe5c71aefc0f9513e8085af8f5b7cdf14fa986fb3b11f2050f18ceefd26e

现在进入到容器内查看是否存在/data:

[root@docker ~]# docker exec -it nginx7 /bin/bash
[root@48f1fe5c71ae nginx-1.12.2]# ll /data
ls: cannot access /data: No such file or directory

现在修改上面Dockerfile的FROM基于的base image:

[root@docker docker_demo]# cat Dockerfile
# base image
FROM centos_nginx:v7# MAINTAINER
MAINTAINER json_hc@163.com

利用此Dockerfile构建镜像v8:

[root@docker docker_demo]# docker build -t centos_nginx:v8 .
Sending build context to Docker daemon  986.6kB
Step 1/2 : FROM centos_nginx:v7
# Executing 1 build trigger...
Step 1/1 : VOLUME /data---> Running in a6187867513d---> 5ac07930be4c
Removing intermediate container a6187867513d
Step 2/2 : MAINTAINER json_hc@163.com---> Running in e02dbf8219cf---> 6f792dc07c35
Removing intermediate container e02dbf8219cf
Successfully built 6f792dc07c35
Successfully tagged centos_nginx:v8

可以看见卷/data已经执行了操作,现在启动一个container:

[root@docker docker_demo]# docker run -d -p 88:80 --name=nginx8 centos_nginx:v8 -g "daemon off;"   
6c2a847c5f6b59b02f91afecadbfc15c88d1217a477c0421a424bce6e5eb317a

查看容器状态,并进入到容器验证/data目录:

[root@docker docker_demo]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
6c2a847c5f6b        centos_nginx:v8     "nginx -g 'daemon ..."   37 seconds ago      Up 37 seconds       0.0.0.0:88->80/tcp   nginx8
[root@docker docker_demo]# docker exec -it nginx8 /bin/bash
[root@6c2a847c5f6b nginx-1.12.2]# ll /data/
total 0

由此可见镜像v8包含了v7 的所有内容,并且增加了ONBUILD的内容

 

转自:https://www.cnblogs.com/jsonhc/p/7767669.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat启动后命令行日志中文乱码

这是日志的编码设置和窗体的编码格式不一致。 将 conf\logging.properties 文件中的 UTF-8 改成 GBK 重启tomcat (右键cmd标题栏部分,可以查看cmd属性) 转载于:https://www.cnblogs.com/Echiops/p/10974587.html

Coursera机器学习笔记(一) - 监督学习vs无监督学习

转载 http://daniellaah.github.io/2016/Machine-Learning-Andrew-Ng-My-Notes-Week-1-Introduction.html 一. 监督学习 什么是监督学习? 我们来看看维基百科中给出的定义: 监督式学习(英语:Supervised learning),是一个机器学习…

基于OpenCL的mean filter性能

1.对于一个标准的3*3 均值滤波,kernel代码如下: 使用buffer/image缓冲对象 __kernel void filter(__global uchar4* inputImage, __global uchar4* outputImage, uint N) {int x get_global_id(0);int y get_global_id(1);int width get_global_size(…

Docker 实战:编写 Dockerfile

一、编译镜像 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 编译镜像 Dockerfile类似于Makfile,用户使用docker build就可以编译镜像,使用该命令可以设置编译…

dubbo-环境搭建,实现一个简单地dubbo实例(附github地址)

一、建立maven模块和provider、consumer、service子模块,其中service是开发接口的模块 建立一个maven模块,不选择样板,直接next知道完成,建立三个子模块,建立完后发现各个模块的java目录不是源目录 右键——>make Directory as…

AMD 5XXX 系列显卡的 peak bandwidth计算

在ATI Stream Computing Programming Guide中,例举了AMD 5系列显卡的参数信息。 我比较关注其中Peak bandwidths的计算,以便在opencl程序测试bandwidth利用率。 下面,我以5870为例,探讨一下如何计算得到这些结果: L1 c…

OpenCL memory object 之 Global memory (1)

这篇日志是学习AMD OpenCL文档时候的总结。 OpenCL用memory object在host和device之间传输数据,memory object由runtime(运行库,driver的一部分)来管理。 OpenCL中的内存对象包括buffer以及image,buffer是一维数据元素…

OpenCL memory object 之 Global memory (2)

当我们用clCreateBuffer, clCreateImage创建OpenCL memory object时候,我们需要输入一个flag参数,这个参数决定memory object的位置。 cl_mem clCreateBuffer (cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errc…

数据结构进阶篇-跳表

大家想必都知道,数组和链表的搜索操作的时间复杂度都是O(N)的,在数据量大的时候是非常耗时的。对于数组来说,我们可以先排序,然后使用二分搜索,就能够将时间复杂度降低到O(logN),但是有序数组的插入是一个O…

查看本机ssh公钥,生成公钥

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 查看ssh公钥方法: 1.通过命令窗口:打开你的git bash 窗口,进入.ssh目录:cd ~/.ssh&…

如何实现动态水球图 --》 echars结合echarts-liquidfill实现

1)项目中作为项目依赖,安装到项目当中(注意必须要结合echars) npm install echarts vue-echarts --save npm install echarts-liquidfill --save 2)在需要使用水晶球的组件里引入liquidFill.js import echarts-liquidfill/src/liquidFill.js;…

RabbitMQ 从入门到精通 (一)

目录 1. 初识RabbitMQ2. AMQP3.RabbitMQ的极速入门4. Exchange(交换机)详解4.1 Direct Exchange4.2 Topic Exchange4.3 Fanout Exchange5. Message 消息1. 初识RabbitMQ RabbitMQ 是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据&a…

接收并解析消息体传参、解析 json 参数

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1.场景:postman 发送了一个 post 请求,如下: 2. 解析方式为用一个 vo 对象来接收 json。把 json 中的…

OpenCL memory object 之 传输优化

首先我们了解一些优化时候的术语及其定义: 1、deferred allocation(延迟分配), 在第一次使用memory object传输数据时,runtime才对memory object真正分配空间。 这样减少了资源浪费,但第一次使用时要慢一些…

VBS使文本框的光标位于所有字符后

有时候在文本框里会显示一部分提示信息,用户在这些提示信息后面输入文本,但是将焦点设置于文本框后,光标总是在文本框的最前面, 用户输入的时候需要按"-->"键将光标移到最后才能输入,这样的操作很不爽。我…

AMD OpenCL 大学课程

AMD OpenCL大学课程是非常好的入门级OpenCL教程,通过看教程中的PPT,我们能够很快的了解OpenCL机制以及编程方法。下载地址:http://developer.amd.com/zones/OpenCLZone/universities/Pages/default.aspx 教程中的英文很简单,我相信…

47.QT-QChart之曲线图,饼状图,条形图使用

1.使用准备 在pro中, 添加QT charts 然后在界面头文件中添加头文件并声明命名空间,添加: #include <QtCharts> QT_CHARTS_USE_NAMESPACE 2.QChart之曲线图 绘制曲线图需要用到3个类 QSplineSeries: 用于创建有由一系列数据组成的曲线.类似的还有QPieSeries(饼图数据). Q…

Docker 部署应用、jar 工程 docker 方式部署

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 把要部署的工程打成一个jar包。&#xff08;我的工程叫 gentle &#xff09; 打 jar 的方法&#xff1a;超简单方法&#xff1a; Int…

第二阶段冲刺(2)

1、整个项目预期的任务量 &#xff08;任务量 所有工作的预期时间&#xff09;和 目前已经花的时间 &#xff08;所有记录的 ‘已经花费的时间’&#xff09;&#xff0c;还剩余的时间&#xff08;所有工作的 ‘剩余时间’&#xff09; &#xff1b; 所有工作的预期时间&#…

华为路由器配置DHCP中继

DHCP(动态主机配置协议)理论知识&#xff1a;DHCP主要用来为客户机自动配置I P地址相关的网络参数&#xff0c;包括IP地址、子网掩码、默认网关、DNS服务器等。 DHCP 通信为广播的方式&#xff0c;因此当需要 DHCP 服务器为不同广播域&#xff08;路由或 VLAN 网段&#xff09;…