微服务架构2019-04-16

docker设置固定ip地址

Docker安装后,默认会创建下面三种网络类型

$ docker network ls
NETWORK ID     NAME        DRIVER       SCOPE
9781b1f585ae    bridge       bridge       local
1252da701e55    host        host        local
237ea3d5cfbf    none        null        local

启动 Docker的时候,用 --network 参数,可以指定网络类型

docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:latest /bin/bash

bridge:桥接网络
默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了
none:无指定网络
使用 --network=none ,docker 容器就不会分配局域网的IP
host: 主机网络
使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。
例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。
创建自定义网络:(设置固定IP)
启动Docker容器的时候,使用默认的网络是不支持指派固定IP的,如下

docker run -itd --net bridge --ip 172.17.0.10 centos:latest /bin/bash
6eb1f228cf308d1c60db30093c126acbfd0cb21d76cb448c678bab0f1a7c0df6
docker: Error response from daemon: User specified IP address is supported on user defined networks only.

步骤1: 创建自定义网络

docker network create --subnet=172.18.0.0/16 mynetwork
➜ ~ docker network ls
NETWORK ID     NAME        DRIVER       SCOPE
9781b1f585ae    bridge       bridge       local
1252da701e55    host        host        local
4f11ae9c85de    mynetwork      bridge       local
237ea3d5cfbf    none        null        local

步骤2: 创建Docker容器

docker run -itd --name networkTest1 --net mynetwork --ip 172.18.0.2 centos:latest /bin/bash

Docker简介

Docker项目提供了构建在Linux内核功能之上,协同在一起的的高级工具。其目标是帮助开发和运维人员更容易地跨系统跨主机交付应用程序和他们的依赖。Docker通过Docker容器,一个安全的,基于轻量级容器的环境,来实现这个目标。这些容器由镜像创建,而镜像可以通过命令行手工创建或 者通过Dockerfile自动创建。

Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

Dockerfile 语法

在我们深入讨论Dockerfile之前,让我们快速过一下Dockerfile的语法和它们的意义。

什么是语法?

非常简单,在编程中,语法意味着一个调用命令,输入参数去让应用执行程序的文法结构。这些语法被规则或明或暗的约束。程序员遵循语法规范以和计算机 交互。如果一段程序语法不正确,计算机将无法识别。Dockerfile使用简单的,清楚的和干净的语法结构,极为易于使用。这些语法可以自我释义,支持注释。

Dockerfile 语法示例

Dockerfile语法由两部分构成,注释和命令+参数

1.  # Line blocks used for commenting
2.  command argument argument ..

一个简单的例子:

1.  # Print "Hello docker!"
2.  RUN echo "Hello docker!"

Dockerfile命令

Dockerfile有十几条命令可用于构建镜像,下文将简略介绍这些命令。

ADD

ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

1.  # Usage: ADD [source directory or URL] [destination directory]
2.  ADD /my_app_folder /my_app_folder 

CMD

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

1.  # Usage 1: CMD application "argument", "argument", ..
2.  CMD "echo" "Hello docker!"

ENTRYPOINT

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。

1.  # Usage: ENTRYPOINT application "argument", "argument", ..
2.  # Remember: arguments are optional. They can be provided by CMD
3.  # or during the creation of a container.
4.  ENTRYPOINT echo
5.  # Usage example with CMD:
6.  # Arguments set with CMD can be overridden during *run*
7.  CMD "Hello docker!"
8.  ENTRYPOINT echo

**ENV **

ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

1.  # Usage: ENV key value
2.  ENV SERVER_WORKS 4

EXPOSE

EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

1.  # Usage: EXPOSE [port]
2.  EXPOSE 8080

FROM

FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

1.  # Usage: FROM [image name]
2.  FROM ubuntu 

MAINTAINER

我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。

1.  # Usage: MAINTAINER [name]
2.  MAINTAINER authors_name 

RUN

RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

1.  # Usage: RUN [command]
2.  RUN aptitude install -y riak

USER

USER命令用于设置运行容器的UID。

1.  # Usage: USER [UID]
2.  USER 751

VOLUME

VOLUME命令用于让你的容器访问宿主机上的目录。

1.  # Usage: VOLUME ["/dir_1", "/dir_2" ..]
2.  VOLUME ["/my_files"]

WORKDIR

WORKDIR命令用于设置CMD指明的命令的运行目录。

1.  # Usage: WORKDIR /path
2.  WORKDIR ~/

如何使用Dockerfiles

使用Dockerfiles和手工使用Docker Daemon运行命令一样简单。脚本运行后输出为新的镜像ID。

1.  # Build an image using the Dockerfile at current location
2.  # Example: sudo docker build -t [name] .
3.  sudo docker build -t my_mongodb . 

Dockerfile示例一:创建一个MongoDB的镜像

在这部分中,我们讲一步一步创建一个Dockfile,这个Dockerfile可用于构建MongoDB镜像进而构建MongoDB容器。

创建一个Dockerfile

使用nano文本编辑器,让我们创建Dockerfile。

  1. sudo nano Dockerfile

定义文件和它的目的

让阅读者明确Dockerfile的目的永远是必要的。为此,我们通常从注释开始写Dockerfile。

1.  ############################################################
2.  # Dockerfile to build MongoDB container images
3.  # Based on Ubuntu
4.  ############################################################

设置基础镜像

1.  # Set the base image to Ubuntu
2.  FROM ubuntu

定义作者

1.  # File Author / Maintainer
2.  MAINTAINER Example McAuthor

设置命令与参数下载****MongoDB

1.  ################## BEGIN INSTALLATION ######################
2.  # Install MongoDB Following the Instructions at MongoDB Docs
3.  # Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
4.  # Add the package verification key
5.  RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
6.  # Add MongoDB to the repository sources list
7.  RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list
8.  # Update the repository sources list once more
9.  RUN apt-get update
10.  # Install MongoDB package (.deb)
11.  RUN apt-get install -y mongodb-10gen
12.  # Create the default data directory
13.  RUN mkdir -p /data/db
14.  ##################### INSTALLATION END #####################

设置****MongoDB****端口

1.  # Expose the default port
2.  EXPOSE 27017
3.  # Default port to execute the entrypoint (MongoDB)
4.  CMD ["--port 27017"]
5.  # Set default container command
6.  ENTRYPOINT usr/bin/mongod

保存Dockerfile。

构建镜像

使用上述的Dockerfile,我们已经可以开始构建MongoDB镜像

sudo docker build -t my_mongodb .

Dockerfile示例二:创建一个Nginx的镜像

Nginx简述

Nginx是一个高性能的 HTTP 和 反向代理 服务器。它因为它的轻量级,易用,易于扩展而流行于业界。基于优良的架构设计,它能够比之前的类似软件处理更多的请求。它也可以用来提供静态文件服务,比如图片,脚本和CSS。

和上个例子一样,我们还是从基础镜像开始,运用FROM命令和MAINTAINER命令

1.  ############################################################
2.  # Dockerfile to build Nginx Installed Containers
3.  # Based on Ubuntu
4.  ############################################################
5.  # Set the base image to Ubuntu
6.  FROM ubuntu
7.  # File Author / Maintainer
8.  MAINTAINER Maintaner Name

安装Nginx

1.  # Install Nginx
2.  # Add application repository URL to the default sources
3.  RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
4.  # Update the repository
5.  RUN apt-get update
6.  # Install necessary tools
7.  RUN apt-get install -y nano wget dialog net-tools
8.  # Download and Install Nginx
9.  RUN apt-get install -y nginx

**Bootstrapping **

安装Nginx后,我们需要配置Nginx并且替换掉默认的配置文件

1.  # Remove the default Nginx configuration file
2.  RUN rm -v /etc/nginx/nginx.conf
3.  # Copy a configuration file from the current directory
4.  ADD nginx.conf /etc/nginx/
5.  # Append "daemon off;" to the beginning of the configuration
6.  RUN echo "daemon off;" >> /etc/nginx/nginx.conf
7.  # Expose ports
8.  EXPOSE 80
9.  # Set the default command to execute
10.  # when creating a new container
11.  CMD service nginx start

保存 dockfile。

使用Dockerfile自动构建Nginx容器

因为我们命令Docker用当前目录的Nginx的配置文件替换默认的配置文件,我们要保证这个新的配置文件存在。在Dockerfile存在的目录下,创建nginx.conf:

  1. sudo nano nginx.conf

然后用下述内容替换原有内容:

1.  worker_processes 1;
2.  events { worker_connections 1024; }
3.  http {
4.    sendfile on;
5.    server {
6.      listen 80;
7.      location {
8.        proxy_pass http://httpstat.us/;
9.        proxy_set_header X-Real-IP $remote_addr;
10.    }
11.    }
12.  }

让我们保存nginx.conf。之后我们就可以用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 install

EXPOSE 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  install

ENV PATH /usr/local/nginx/sbin:$PATH

EXPOSE 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  install

ENV PATH /usr/local/nginx/sbin:$PATH

EXPOSE 80

CMD /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  install

ENV PATH /usr/local/nginx/sbin:$PATH

EXPOSE 80

ENTRYPOINT ["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  install

ENV PATH /usr/local/nginx/sbin:$PATH

EXPOSE 80

ENTRYPOINT ["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的内容

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容