Docker - Dockerfile 構建映象
阿新 • • 發佈:2020-12-18
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