1. 程式人生 > 實用技巧 >Docker - Dockerfile 構建映象

Docker - Dockerfile 構建映象

Dockerfile 構建映象

1.簡介

Docker映象是分很多層的

Dockerfile 由一行行命令語句組成, 並且支援以開頭的註釋行

一般而言, Dockerfile 主體內容分為4部分:

  • 基礎映象資訊(必須的)
  • 維護者資訊
  • 映象操作指令
  • 容器啟動時執行指令

Docker 以從上到下的順序執行 Dockerfile 的指令

為了指定基本映像,第一條指令必須是 FROM

一個聲 明以字元開頭則被視為註釋

可以在 Docker 檔案中使用 RUN,CMD,FROM,EXPOSE,ENV 等指令

指令 釋義
FROM 指定基礎映象
MAINTAINER 維護者的資訊
RUN 在容器內部 執行的命令
ADD 新增檔案至映象內(可以自動解壓:僅限於tar格式的壓縮包)
CMD 啟動容器時 執行的命令
ENTRYPOINT 同CMD,但這個一定會被執行,不會被覆蓋修改
ENV 設定執行命令時的環境變數,並且在構建完成後,仍然生效
ARG 設定只在構建過程中使用的環境變數,構建完成後,將消失
COPY 將本地檔案或目錄拷貝到映象的檔案系統中
USER 指定以哪個使用者的名義執行RUN, CMD 和ENTRYPOINT等命令
ONBUILD 當 當前映象 被當做基礎映象時 執行的命令
WORKDIR 當前工作目錄
VOLUME 目錄掛載(新增資料卷)
EXPOSE 設定向外暴露的埠號
STOPSIGNAL 設定容器退出時發出的關閉訊號
HEALTHCHECK 設定容器狀態檢查
LABEL 用於為映象新增元資料
SHELL 更改執行shell命令的程式。Linux的預設shell是["/bin/sh","-c"],Windows的是["cmd", "/S", "/C"]

2.編寫指令的檔案 - 名稱必須是:Dockerfile

# 1.建立一個編寫指令的檔案:Dockerfile
touch Dockerfile

3.編寫構建映象的指令

① FROM - 指定基礎映象(作為構建新映象時 提供一個基礎環境)

語法
FROM [映象名稱]
FROM [映象]:[版本號]
FROM [映象]@[摘要]

② MAINTAINER - 維護者資訊

MAINTAINER [維護者的資訊]

③ RUN - 構建映象時 在映象中執行的命令

RUN [Linux命令]

④ ADD - 將本地檔案複製到映象中

  • 可以新增網路資源
  • 會自動解壓.tar格式的網路資源
  • 宿主機的檔案路徑可以是絕對路徑,也可以是相對路徑
  • 檔案路徑的許可權也需要注意
ADD [宿主主機檔案路徑] [映象相對應的檔案路徑]

⑤ COPY - 功能類似 ADD,但是是不會自動解壓檔案,也不能訪問網路資源

COPY [宿主主機檔案路徑] [映象相對應的檔案路徑]

⑤ CMD - 指定容器啟動時 預設執行的命令

CMD [容器啟動時 在容器內執行的命令]

⑥ LABEL - 用於為映象新增元資料

LABEL <key>=<value> <key>=<value> <key>=<value>

LABEL version="1.0" description="這是一個 Web 伺服器" by="IT 筆錄"

⑦ ENV- 設定環境變數

ENV <key> <value>

ENV MYSQL_ROOT_PASSWORD=123456

⑧ EXPOSE - 指定於外界互動的埠

EXPOSE 並不會讓容器的埠訪問到主機

要使其可訪問,需要在 docker run 執行容器時通過-p 來發布這些埠

或通過-P 引數來發布 EXPOSE 匯出的所有埠

EXPOSE <port>

EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp

⑨ VOLUME - 用於指定持久化目錄(掛載)

一個卷可以存在於一個或多個容器的指定目錄,該目錄可以繞過聯合檔案系統,並具有以下功能

  • 卷可以容器間共享和重用
  • 容器並不一定要和其它容器共享卷
  • 修改卷後會立即生效
  • 對卷的修改不會對映象產生影響
  • 卷會一直存在,直到沒有任何容器在使用它
VOLUME ["/path/to/dir"]

⑩ WORKDIR - 工作目錄,類似於 cd 命令

通過 WORKDIR 設定工作目錄後,Dockerfile 中其後的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都會在該目錄下執行

在使用 docker run 執行容器時,可以通過-w 引數覆蓋構建時所設定的工作目錄

WORKDIR /path/to/workdir

WORKDIR /a	# 這時工作目錄為/a
WORKDIR b	# 這時工作目錄為/a/b
WORKDIR c	# 這時工作目錄為/a/b/

⑩① ARG - 用於指定傳遞給構建執行時的變數

ARG <name>[=<default value>]

ARG site
ARG build_user=www

⑩② ONBUILD - 用於設定映象觸發器

當所構建的映象被用做其它映象的基礎映象時,構建映象前會執行

ONBUILD [INSTRUCTION]

ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

4.開始構建

選項 釋義
-t 指定映象名稱
-f 指定Dockerfile路徑
docker build [選項] [自定義映象名稱] [dockerfile]

5.例項

vim Dockerfile
i
FROM busybox:latest
CMD echo "Hello World"
Esc
:wq
docker build -t test/busybox01 .
docker images
docker run -d --name busybox001 test/busybox01
docker logs busybox001


# 建立1個Dockerfile
[root@localhost ~]# vim Dockerfile

# 按i進入插入模式
i

# 輸入如下內容
FROM busybox:latest
CMD echo "Hello World"

# 按 Esc 退出插入模式  按 :wq 進行儲存
Esc
:wq

# 構建映象test/busybox01 到當前目錄.
[root@localhost ~]# docker build -t test/busybox01 .
Sending build context to Docker daemon  7.786MB
Step 1/2 : FROM busybox:latest
 ---> dc3bacd8b5ea
Step 2/2 : CMD echo "Hello World"
 ---> Running in f5b2496a4cd3
Removing intermediate container f5b2496a4cd3
 ---> 3798dc9e5d7b
Successfully built 3798dc9e5d7b	# 構建出的映象ID
Successfully tagged test/busybox01:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
test/busybox01      latest              3798dc9e5d7b        About a minute ago   1.23MB
nginx               latest              bc9a0695f571        8 days ago           133MB
busybox             latest              dc3bacd8b5ea        9 days ago           1.23MB
mysql               5.7                 ae0658fdbad5        12 days ago          449MB
mysql               5.7.32              ae0658fdbad5        12 days ago          449MB
redis               latest              74d107221092        2 weeks ago          104MB
centos              latest              0d120b6ccaa8        3 months ago         215MB
python              3.6.8               48c06762acf0        18 months ago        924MB

# 用 test/busybox01映象 執行一個容器 busybox001
[root@localhost ~]# docker run -d --name busybox001 test/busybox01
5e53fd64cb19359395075f59a49e7c51bd723ad028365a3b02e74b853ce93de2

# 檢視容器busybox001的日誌
[root@localhost ~]# docker logs busybox001
Hello World	# 這個就是容器輸出的內容

ALLOW_HOST = []
ALLOW_HOST = ['*']
vim Dockerfile

FROM busybox:latest
RUN touch index.html
RUN echo "Hello" > index.html
CMD cat index.html

docker build -t test/busybox:v2 .

docker images

docker run -d --name busybox002 test/busybox:v2

docker logs busybox01



vim Dockerfile

FROM busybox:latest


ADD xxx.zip /root

RUN touch index.html
RUN echo "Hello" > index.html
CMD cat index.html

docker build -t test/busybox:v3 .

docker images

docker run -d --name busybox003 test/busybox:v3

docker logs busybox003
vim Dockerfile

# 1.指定基礎映象
FROM python:3.6.8

# 2.安裝django
RUN pip3 install django==2.2.2 -i https://pypi.douban.com/simple/

# 3.建立1個django專案
RUN django-admin startproject blog
RUN cd blog && python3 manage.py startapp app01

## 3.將當前目錄的檔案 複製到映象中(此處不能用絕對路徑)
ADD django_proj01 /root

# 4.設定啟動命令
CMD cd /root && python3 manage.py runserver 0.0.0.0:8000


docker build -t test/django:v1 .

docker run -dit -p 30000:8000 --name django01 --network host test/django:v1

安裝Nginx

# 1.安裝yum工具
yum install yun-utils -y

# 2.建立檔案
touch /etc/yum/repos.d/nginx.repo

# 3.編輯檔案


# 4.生成yum快取
yum makecache

# 5.安裝nginx
yum install nginx -y


# 6.配置dialing


# 7.設定配置檔案
nginx -t:測試配置檔案
nginx -g 'daemon off;'	# 在前臺啟動nginx

構建nginx

mkdir teach
cd teach
mkdir django
mkdir nginx
cd nginx
touch Dockerfile
vim nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx_mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true


vim Dockerfile


# 設定基礎映象
FROM centos:7

# 安裝wget
yum install wget -y

# 換源
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo


# 建立nginx源的檔案
ADD nginx.repo /etc/yum/repos.d/

# 重新整理yum快取
RUN yum makecache

# 安裝yum工具
RUN yum install yum-utils -y

# 安裝nginx
RUN yum install nginx -y

# 複製配置檔案
ADD default.conf /etc/nginx/conf.d/

# 設定啟動命令
CMD nginx -g "daemon off;"

docker build -t nginx:v1 .

Dockerfile

# 設定基礎映象
FROM centos

RUN yum install wget -y

# 換源
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

RUN cd /etc/yum.repos.d && wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

RUN mv /etc/yum.repos.d/CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo

# 建立nginx源的檔案
ADD nginx.repo /etc/yum.repos.d/ 

# 重新整理yum快取
RUN yum makecache

# 安裝yum工具
RUN yum install yum-utils -y

# 安裝Nginx
RUN yum install nginx -y

# 複製配置檔案
ADD default.conf /etc/nginx/conf.d/

# 設定啟動命令
CMD nginx -g 'daemon off;'

default.conf

upstream django {
    server django:8000;
}

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://django;
        index index.html index.htm;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

mine

all

cd /root
mkdir mine
cd mine 
mkdir django
mkdir mysql

mysql

cd /root/mine/mysql
vim Dockerfile

# 1.指定基礎映象
FROM mysql:5.7
ENV MYSQL_ROOT_PASSWORD=123456
RUN mysql -uroot -p123456
RUN create database blog01 default charset utf8;
EXPOSE 3306

docker build -t mysql:v1 .

docker run -dit -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql:v1


docker run -dit -p 3306:3306 --name mysql01 mysql:v1

django

cd /root/mine/django
vim Dockerfile

# 1.指定基礎映象
FROM python:3.6.8

# 2.安裝django
# RUN pip3 install django==2.2.2 -i https://pypi.douban.com/simple/

# 3.將當前目錄的檔案 複製到映象中(此處不能用絕對路徑)
ADD django_blog /root

# 4.安裝依賴
CMD pip3 install -r requirements.txt -i https://pypi.douban.com/simple/

EXPOSE 8000


# 4.設定啟動命令
CMD python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py runserver 0.0.0.0:8000


docker build -t django:v1 .

docker run -dit -p 8000:8000 --name django01 --network host django:v1
docker run -dit -p 8000:8000 --name django03 django:v2