# 5. 使用 Dockerfile 文件
#### 1. 介紹
上一篇:[理解docker鏡像的層疊結構(四)](https://www.rails365.net/articles/li-jie-docker-jing-xiang-de-ceng-die-jie-gou-si)
Dockerfile是一個純文本文件,內容是可讀的,就是把構建鏡像的指令一條條放在這個文件中,然后就可以build出來一個鏡像。
#### 2. 使用
我們來實踐一下。
創建一個最簡單的Dockerfile文件。
```
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
```
內容如下:
```
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
```
我們以此Dockerfile文件,來生成了一個鏡像,使用`docker build`命令。
只要
```
$ docker build .
```
會顯示這樣的信息:
```
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM nginx
---> db079554b4d2
Step 2/2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
---> Running in 64127d3ff089
---> 6fb1fd56e2dd
Removing intermediate container 64127d3ff089
Successfully built 6fb1fd56e2dd
```
build成功之后可以查看一下:
```
$ docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 6fb1fd56e2dd 4 seconds ago 182 MB
nginx v2 f51e5af097aa 44 minutes ago 182 MB
```
其中可看出,`REPOSITORY`和`TAG`部分都為none,其實我們build的時候可以給個名稱標識一下。
```
$ docker build -t nginx:v3 .
```
現在就有了。
```
$ docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v3 6fb1fd56e2dd 4 minutes ago 182 MB
nginx v2 f51e5af097aa 48 minutes ago 182 MB
```
#### 3. 參數解釋
回到之前的Dockerfile文件的內容。
```
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
```
只有兩個指令,分別是`FROM`和`RUN`。
`FROM`代表的是基礎鏡像,`RUN`表示的是運行的命令。
值得注意的是,每條指令都會創建一層鏡像,不要單獨寫太多的`RUN`語句,而是要串起來。
例如,類似下面的作法是不對的。
```
FROM ruby:2.2.2
# update
RUN apt-get update -qq
# RUN apt-get upgrade -qq
# RUN apt-get dist-upgrade -qq
# RUN apt-get autoremove -qq
# for build essential lib
RUN apt-get install -y build-essential
# for postgres
RUN apt-get install -y libpq-dev
# for nokogiri
RUN apt-get install -y libxml2-dev libxslt1-dev
# for a JS runtime
RUN apt-get install -y nodejs
# for imagemagick
RUN apt-get install -y imagemagick
# for vim
RUN apt-get install -y vim
# set gem sources
RUN gem sources -r https://rubygems.org/
RUN gem sources -a https://ruby.taobao.org/
ENV APP_HOME /var/www/coomo_store
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD Gemfile* $APP_HOME/
RUN bundle install --jobs=4
ADD . $APP_HOME
```
還有很多命令,會被經常用到,比如`ARG`, `ENV`, `EXPOSE`, `WORKDIR`, `CMD`。
下面來介紹一下。
`ARG`表示的是設置一個參數,在build的時候由外面通過命令行參數的形式傳過來。
比如:
```
$ docker build --build-arg PORT=3000 --build-arg NPM_TOKEN=e43d3f2c-e7b7-4522-bf74-b7d2863eddf7 .
```
傳了兩個參數分別為`PORT`和`NPM_TOKEN`。
`ENV`是設置環境變量,以后這個變量可以傳到docker容器內部中去。
`EXPOSE`表示暴露的端口號。
`WORKDIR`就是指定工作目錄啦。
`CMD`是容器啟動的命令。
來看一個實例,具體體會一下這些命令。
```
from node:6.9
ARG PORT
ARG NPM_TOKEN
ENV PORT ${PORT}
ENV NPM_TOKEN ${NPM_TOKEN}
EXPOSE ${PORT}
ADD . /code
WORKDIR /code
RUN npm install
RUN npm run build
CMD npm run docker
```
下面這個鏈接是官方給的關于Dockerfile的文檔:
<https://docs.docker.com/engine/reference/builder/#dockerfile-examples>
完結。
下一篇:[docker的數據卷(六)](https://www.rails365.net/articles/docker-de-shu-ju-juan-liu)
- 0. 介紹
- 1. 安裝 docker
- 2. docker 的鏡像和鏡像源加速
- 3. docker 的容器
- 4. 理解 docker 鏡像的層疊結構
- 5. 使用 Dockerfile 文件
- 6. docker 的數據卷
- 7. Docker Compose 的介紹與安裝
- 8. 使用 compose 部署 GitLab 應用
- 9. 使用 compose 部署 Rocket.Chat 應用
- 10. docker 部署深入理解
- 11. 部署 owncloud 與 phpMyAdmin
- 12. 讓 php-fpm 跑的 owncloud 應用 docker 化
- 13. docker 遷移 GitLab 項目