明確概念
Dockerfile 是拿來構建自定義鏡像的,並沒有直接生成容器。只是可以在運行鏡像時運行容器而已。
做容器編排以部署環境,是使用 docker-compose.yml 文件進行的,里面可能會需要用到 Dockerfile 。
總結
Dockerfile是用來構建鏡像的,若是想使用這個鏡像的話還需要使用docker run命令來運行這個鏡像,從而生成運行一個容器
docker-compose.yml是用來編排項目的,里面包含使用各種鏡像創建的容器服務,使用的鏡像可以是網絡上的,也可以是根據使用Dockerfile文件來生成的鏡像,相當於是把上一步的這個工作給做了
docker-compose.yml使用的鏡像可以是網絡上的,具體是這樣的,優先使用本地存在的鏡像,本地沒有的話才會從 Docker Hub網站上下載,若想直接使用私有倉庫鏡像,則需要事先從私有倉庫鏡像給拉取到本地才行
Dockerfile
把每一層修改、安裝、構建、操作的命令都寫入一個腳本,用這個腳本來構建、定制鏡像,這個腳本就是 Dockerfile。
Dockerfile 部分指令:
// FROM 指定基礎鏡像
FROM nginx
// RUN 執行命令。每一條 RUN 都會生成一層,一個需求盡量使用&&,這樣就減少了 RUN ,即減少了分層
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
RUN yum update && yum install -y vim python-dev
// COPY: 源路徑下的 package.json 復制到新一層的鏡像路徑/usr/src/app
COPY package.json /usr/src/app/
// WORKDIR 指定工作目錄。指定下層工作的目錄為容器內的/data,盡量使用絕對目錄
WORKDIR /data
// ADD 添加,ADD能自動解壓文件。以下例子最終 hello 在/data/test 下
WORKDIR /data
ADD hello test/
// COPY 拷貝 與ADD類似,只是不能解壓縮文件。
WORKDIR /DATA
COPY hello test/
// CMD 執行命令
CMD ["python", "app.py"]
// ENV 設置環境變量 定義 NAME=Happy Feet,那么之后就可以使用 $NAME 來執行了
ENV VERSION=1.0 DEBUG=on NAME="Happy Feet" // VOLUMES掛載
// EXPOSE 端口暴露
EXPOSE <端口1> [<端口2>...]
Dockerfile 文件示例
// 1、創建 Dockerfile
mkdir mynginx
cd mynginx
vim Dockerfile
// 2、輸入以下內容並保存:
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
// 在 Dockerfile 目錄下執行,生成新的自定義 images
docker build -t nginx:v3 .
Docker-compose
docker-compose 是官方開源項目,負責實現對 Docker 容器集群的快速編排,部署分布式應用。通過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關聯的應用容器為一個項目(project)
安裝docker-compose:
mac 和 win 下已經默認裝好了。而 linux 下得手動安裝。這里采用二進制包的方式
$ sudo curl -L https://github.com/docker/compose/releases/download/1.26.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
// 測試 docker-compose
$ docker-compose --version
一般使用步驟
1、創建一個空目錄。
2、定義 Dockerfile,方便遷移到任何地方
3、編寫 docker-compose.yml 文件
4、運行 docker-compose up 啟動服務
docker-compose 使用舉例
下面我們用 Python 來建立一個能夠記錄頁面訪問次數的 web 網站。
1.建一個空目錄:mkdir -p /data/test
2.在該空文件下建立 app.py,輸入以下內容:
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 該頁面已被訪問 {} 次。\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
3.編寫 Dockerfile 文件:
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
4.編寫 docker-compose.yml 文件
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
此時該空目錄下共有:app.py、Dockerfile、docker-compose.yml 文件
5.執行 docker-compose 項目
docker-compose up
yml 模板文件的說明:
version: '3'
services:
phpfpm:
image: yoogr/phpfpm:0.0.1
container_name: ct-phpfpm
build:
context: .
dockerfile: Dockerfile
expose:
- "9000"
volumes:
- ${DIR_WWW}:${DIR_WWW}:rw
- ./conf/php/php.ini:/usr/local/etc/php/php.ini:ro
- ./conf/php/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw
- ./conf/supervisor/conf.d:/etc/supervisor/conf.d/:ro
- ./log/php-fpm/:/var/log/php-fpm/:rw
- ./log/supervisor/:/var/log/supervisor/:rw
command: supervisord -n
links:
- mysql:mysql
- redis:redis
每個 service 代表一個 container,container 可以通過 dockerhub的 image 來創建,也可以從本地的 Dockerfile build 出來的鏡像來創建。
某個服務需要用到 Dockerfile build 出來的鏡像,則在 docker-compose 里面指明 build 的文本位置和文件名
yml 文件可以指定 volume 和 network
如下,是一個使用了 network 和 volumes 參數的例子(放在與 service 同層的關系):
version: '3.0'
services:
wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_PASSWORD: examplepass
network:
- my-bridge
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: wordpress
MYSQL_ROOT_PASSWORD: 123456
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
my-data
networks:
my-bridge:
driver:bridge
網絡和卷的定義類似於 docker network create 和 docker volume create。如果你沒有指定連接network,那么才會使用 link。
