102.Dockerfile格式、安裝nginx

25.13/25.14 Dockerfile格式mysql

25.15/25.16 Dockerfile示例(安裝nginx)linux

 

 

 

 

25.13/25.14 Dockerfile格式nginx

 

 

dockerfile是自定義鏡像的一種方式。docker本就是容器技術,並非基於容器。 sql

在容器安裝本身的系統,有點背離容器技術的初衷。容器的優點在於快速的部署、交付。你再去安裝系統,再部署環境,那多麻煩。 docker

人家都有現成的鏡像,直接拉下來就能用,不用本身從頭開始搞。vim

咱們以前教過建立鏡像的方法有兩種(導出鏡像爲容器、下載模板),也可使用dockerfile建立鏡像。咱們能夠在dockerfile裏面寫一些語法/語句,那都有哪些語句,格式、做用是什麼:centos

1. FROM   //指定基於哪一個基礎鏡像bash

格式 FROM <image> 或者  FROM <image>:<tag>, 好比ssh

FROM centoscurl

FROM centos:latest

#必需要有的,必需要基於一個基礎鏡像,在這個鏡像的基礎上去作一些額外的操做。就是docker images列出的

2. MAINTAINER  //指定做者信息

格式  MAINTAIN <name> ,好比

MAINTAINER  aming  aming@aminglinux.com

3. RUN   //鏡像操做指令

格式爲 RUN <command>  或者 RUN [「executable」, 「param1」, 「param2」],好比

RUN  yum install  httpd

RUN ["/bin/bash", "-c", "echo hello"]

#具體的一些指令,作哪些操做

4. CMD // 三種格式:

CMD ["executable", "param1", "param2"]

CMD command param1 param2

CMD ["param1", "param2"]

RUN和CMD看起來挺像,可是CMD用來指定容器啓動時用到的命令,只能有一條。好比

CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]

#docker run起來的時候所運行的命令。能夠寫多個,但只有最後一條生效

會被docker run最後的指令覆蓋,如/usr/sbin/init

5. EXPOSE  

格式爲 EXPOSE <port> [<port>...] , 好比

EXPOSE 22 80 8443

這個用來指定要映射出去的端口,好比容器內部咱們啓動了sshd和nginx,因此咱們須要把22和80端口暴漏出去。這個須要配合-P(大寫)來工做,也就是說在啓動容器時,須要加上-P,讓它自動分配。若是想指定具體的端口,也可使用-p(小寫)來指定。

#所要暴露的端口。就是docker run時的-p:

-p xxx(宿主機所要監聽的端口):xxx(容器所監聽的端口)

6. ENV  

格式 ENV  <key> <value>, 好比  

ENV PATH /usr/local/mysql/bin:$PATH

它主要是爲後續的RUN指令提供一個環境變量,咱們也能夠定義一些自定義的變量

ENV MYSQL_version 5.6

#環境變量

7. ADD  格式 add <src> <dest>

將本地的一個文件或目錄拷貝到容器的某個目錄裏。 其中src爲Dockerfile所在目錄的相對路徑,它也能夠是一個url。好比

ADD <conf/vhosts> </usr/local/nginx/conf>

#支持本地的文件,也支持遠程的連接

8. COPY  

格式同add

使用方法和add同樣,不一樣的是,它不支持url

9. ENTRYPOINT  格式相似CMD

容器啓動時要執行的命令,它和CMD很像,也是隻有一條生效,若是寫多個只有最後一條有效。和CMD不一樣是:

CMD 是能夠被 docker run 指令覆蓋的,而ENTRYPOINT不能覆蓋。好比,容器名字爲aming

咱們在Dockerfile中指定以下CMD:

CMD ["/bin/echo", "test"]

啓動容器的命令是  docker run aming 這樣會輸出 test

假如啓動容器的命令是 docker run -it aming  /bin/bash  什麼都不會輸出

ENTRYPOINT不會被覆蓋,並且會比CMD或者docker run指定的命令要靠前執行

ENTRYPOINT ["echo", "test"]

docker run -it aming  123

則會輸出 test  123 ,這至關於要執行命令  echo test  123 

#咱們通常是使用ENTRYPOINT,而不是CMD。而且不會被覆蓋,他先運行,你的指令排在後面

10. VOLUME

格式  VOLUME ["/data"]

建立一個能夠從本地主機或其餘容器掛載的掛載點。

#至關因而-v時的那個掛載點

11. USER  

格式 USER daemon

指定運行容器的用戶

#不多用,通常是root

12. WORKDIR  

格式 WORKDIR  /path/to/workdir

爲後續的RUN、CMD或者ENTRYPOINT指定工做目錄(路徑)

#指定你所工做的目錄

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

25.15/25.16 Dockerfile示例(安裝nginx)

 

 

 

使用dockerfile作一個nginx的鏡像

1.先下載nginx的配置文件

wget http://www.apelearn.com/study_v2/.nginx_conf

#也能夠用add把這個配置文件,搞到鏡像裏去

2.vim Dockerfile //內容以下

## Set the base image to CentOS

FROM centos

# File Author /Maintainer

MAINTAINER aming aming@aminglinux.com

# Install necessary tools

RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel

# Install Nginx

ADD http://nginx.org/download/nginx-1.8.0.tar.gz .

RUN tar zxvf nginx-1.8.0.tar.gz

RUN mkdir -p /usr/local/nginx

RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install

RUN rm -fv /usr/local/nginx/conf/nginx.conf

COPY .nginx_conf /usr/local/nginx/conf/nginx.conf

# Expose ports

EXPOSE 80

# Set the default command to execute when creating a new container

ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd

3.建立鏡像:

docker build -t centos_nginx  . #此處有個點

docker  images //能夠看到咱們新建的鏡像

docker run -itd -p 8088:80 centos_nginx bash

 

 

實例:

[root@axinlinux-01 ~]# vim Dockerfile

## Set the base image to CentOS

FROM centos #基於centos鏡像

# File Author / Maintainer

MAINTAINER aming aming@aminglinux.com #做者信息

# Install necessary tools

RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel #安裝用來的包及須要的包

# Install Nginx #接下來安裝nginx

ADD http://nginx.org/download/nginx-1.8.0.tar.gz . #先下載nginx源碼包好比1.8.0,放到當前目錄下。後面有個點

RUN tar zxvf nginx-1.8.0.tar.gz #run解包

RUN mkdir -p /usr/local/nginx #建立目錄(-p級聯建立)

RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install #而後進去,編譯,安裝

RUN rm -fv /usr/local/nginx/conf/nginx.conf #刪除自帶的nginx配置文件

####COPY .nginx_conf /usr/local/nginx/conf/nginx.conf #此處咱們不用copy了,用add

ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf #用add把這個連接的配置文件下載到這個目錄下

# Expose ports

EXPOSE 80 #把80端口暴露出來

# Set the default command to execute when creating a new container

ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd #docker run(容器啓動)的時候要指定的命令。後面指定tail是由於,這個容器執行完啓動nginx就中止了,因此就執行tail -f(動態的檢查文件,永遠執行不完,也就是永遠不會中止這個容器)

[root@axinlinux-01 ~]# docker build -t centos_nginx . #build會自動去找Dockerfile這個文件,-t是指定新的鏡像名字。後面有個點,在哪一個路徑下去找Dockerfile

此處注意,上一節作了橋接(pipework),就會報錯,須要重啓docker。由於此時能聯網的是br0,而他會去連ens33,ens33已經沒有ip了。因此要重啓docker,讓他自動的去連br0

而後,進去一個容器(dpcker ps -a),ping一下外網,看可否聯網。保證build的順利執行

[root@axinlinux-01 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos_nginx latest d1194afebe0a 8 minutes ago 343MB

[root@axinlinux-01 ~]# docker run -itd -p 81:80 centos_nginx bash #把81端口給他作一個映射

16e6628e89a9d09f085e58d042a23b90541717a1321854f93700af8fd57b1302

[root@axinlinux-01 ~]# docker exec -it 16e6628e89 bash

[root@16e6628e89a9 /]# ps aux |grep nginx #查看有無啓動ngixn

root 1 0.0 0.0 11680 1352 pts/0 Ss+ 15:08 0:00 /bin/sh -c /usr/local/nginx/sbin/nginx && tail -f /etc/passwd bash #這能夠看到咱們配置那條命令

[root@axinlinux-01 ~]# curl 127.0.0.1:81 #查看是否可訪問

相關文章
相關標籤/搜索