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 #查看是否可訪問