Dockerfile相似於咱們學習過的腳本,將咱們在上面學到的docker鏡像,使用自動化的方式實現出來。html
記得網上有一個最佳實踐,能夠🔍搜索一下。python
構建鏡像命令格式:nginx
docker build -t [鏡像名]:[版本號] [Dockerfile所在目錄]
複製代碼
構建樣例:web
docker build -t nginx:v0.2 /opt/dockerfile/nginx/
複製代碼
建立 Dockerfile 專用目錄:docker
建立祕鑰認證:shell
準備軟件源:django
cp /etc/apt/source.list ./
複製代碼
注意:咱們要清除 docker 相關的配置,只留下原始的軟件源。 給出一份 source.list 以下:ubuntu
# 默認註釋了源碼鏡像以提升 apt update 速度,若有須要可自行取消註釋
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial main main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
# 預發佈軟件源,不建議啓用
# deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
複製代碼
建立 Dockerfile 文件:vim
# 構建一個基於 ubuntu 的 ssh 定製鏡像
# 基礎鏡像
FROM ubuntu
# 鏡像做者
MAINTAINER ruiyang0715@gmail.com
# 執行命令
# 增長軟件源
ADD sources.list /etc/apt/sources.list
#安裝ssh服務
RUN apt-get update
RUN apt-get install -y openssh-server curl vim net-tools
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
#取消pam限制
RUN sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd
RUN apt-get autoclean
RUN apt-get clean
RUN apt-get autoremove
# 複製配置文件到相應位置,並賦予腳本可執行權限
ADD authorized_keys /root/.ssh/authorized_keys
# 對外端口
EXPOSE 22
#啓動ssh
ENTRYPOINT ["/usr/sbin/sshd","-D"]
複製代碼
這時候的文件夾以下:segmentfault
構建鏡像:
docker build -t ubuntu-ssh .
複製代碼
使用新鏡像啓動一個容器,查看效果:
查看端口:
ssh 查看效果:
格式:
FROM <image>
FROM <image>:<tag>
複製代碼
解釋:
FROM 是 Dockerfile裏的第一條並且只能是除了首行註釋以外的第一條指令。
格式:
MAINTAINER <name>
複製代碼
解釋:
指定該 dockerfile 文件的維護者信息。相似咱們在 docker commit 時候使用-a 參數指定的信息
格式:
RUN <command>
RUN["executable", "param1", "param2"]
複製代碼
解釋: shell模式:相似於 /bin/bash-ccommand 舉例: RUN echo hello exec 模式:相似於 RUN ["/bin/bash", "-c", "command"] 舉例: RUN ["echo", "hello"]
格式:
EXPOSE <port> [<port>...]
複製代碼
解釋: 設置 Docker 容器對外暴露的端口號,Docker 爲了安全,不會自動對外打開端口,若是須要外部提供訪問,還須要啓動容 器時增長-p 或者-P 參數對容器的端口進行分配。
格式:
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell 模式)
複製代碼
解釋: 每一個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
複製代碼
解釋:
格式:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
複製代碼
解釋: 單純複製文件場景,Docker 推薦使用 COPY
格式:
VOLUME ["/data"]
複製代碼
解釋:
首先在當前目錄下面建立一個用於測試的壓縮文件:
而後建立一個測試的單個文件 index.html
在 Dockerfile 中添加拷貝文件的命令:
# 構建一個基於 ubuntu 的 ssh 定製鏡像
# 基礎鏡像
FROM ubuntu
# 鏡像做者
MAINTAINER ruiyang0715@gmail.com
# 執行命令
# 增長軟件源
ADD sources.list /etc/apt/sources.list
#安裝ssh服務
RUN apt-get update
RUN apt-get install -y openssh-server curl vim net-tools
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
#取消pam限制
RUN sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd
RUN apt-get autoclean
RUN apt-get clean
RUN apt-get autoremove
# 複製配置文件到相應位置,並賦予腳本可執行權限
ADD authorized_keys /root/.ssh/authorized_keys
# 增長文件
ADD ["sources.list","/etc/apt/sources.list"]
# 增長壓縮文件
ADD ["hello.tar.gz", "/hello/"]
# 使用 COPY 增長一個文件
RUN mkdir -p /var/www/html
COPY index.html /var/www/html/
# 在容器中建立一個掛載點
VOLUME ['/data/']
# 對外端口
EXPOSE 22
#啓動ssh
ENTRYPOINT ["/usr/sbin/sshd","-D"]
複製代碼
格式:
ENV <key> <value>
ENV <key>=<value> ...
複製代碼
解釋: 設置環境變量,能夠在 RUN 以前使用,而後 RUN 命令時調用,容器啓動時這些環境變量都會被指定。
格式:
WORKDIR /path/to/workdir (shell 模式)
複製代碼
解釋: 切換目錄,爲後續的 RUN、CMD、ENTRYPOINT 指令配置工做目錄。 至關於 cd 能夠屢次切換(至關於 cd 命令),也可使用多個 WORKDIR 指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑
舉例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
複製代碼
則最終路徑爲 /a/b/c。
在上一個Dockerfile的基礎上,在 RUN 下面加一個ENV 以下:
ENV NAME=furuiyang
複製代碼
Dockerfile:
# 基礎鏡像
FROM ubuntu
# 鏡像做者
MAINTAINER ruiyang0715@gmail.com
# 增長軟件源
ADD sources.list /etc/apt/sources.list
# 安裝ssh服務
RUN apt-get update
RUN apt-get install -y openssh-server curl vim net-tools
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
# 取消pam限制
RUN sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd
RUN apt-get autoclean
RUN apt-get clean
RUN apt-get autoremove
# 設置環境變量
ENV NAME=furuiyang
# 複製配置文件到相應位置,並賦予腳本可執行權限
ADD authorized_keys /root/.ssh/authorized_keys
# 增長文件
ADD ["sources.list","/etc/apt/sources.list"]
# 對外端口
EXPOSE 22
# 啓動ssh
ENTRYPOINT ["/usr/sbin/sshd","-D"]
複製代碼
從新生成鏡像,開啓容器運行:
docker build -t ubuntu-ssh .
docker run -d -p 10086:22 ubuntu-ssh
ssh 172.18.222.137 -p 10086
複製代碼
進入使用 env 命令查看環境變量是否被設置上。
(這裏有個問題就是我ssh進入就沒有可是exec進入纔可看到被設置的 NAME 環境變量)
構建過程當中,建立了不少鏡像,這些中間鏡像,咱們能夠直接使用來啓動容器,經過查看容器效果,從側面能看到咱們每次構建的效果。提供了鏡像調試的能力
咱們能夠經過docker history <鏡像名> 來查看整個構建過程所產生的鏡像
查看 ubuntu-ssh 的整個構建過程當中建立的鏡像:
使用中間鏡像來啓動容器:
docker run -d -p 10087:22 0ca50222ff8c
複製代碼
拓展: 執行的步驟越多越好呢?仍是越少越好?
咱們的第一次構建會很慢,可是以後的構建都會變快,由於利用到了構建的緩存。
不使用構建緩存的兩種作法: 所有不用緩存:
docker build --no-cache -t [鏡像名]:[鏡像版本] [Dockerfile位置]
複製代碼
部分使用緩存:在 Dockerfile 中使用
# 建立構建刷新時間
ENV REFRESH_DATE 2019-08-30
複製代碼
只要構建的時間不變,那麼就用緩存,時間一旦改變,就不用緩存了。
查看構建過程的歷史:
docker history [鏡像名]
複製代碼
清理構建緩存:
docker system prune
docker system prune --volumes
複製代碼
技術關鍵點:
流程:
docker run -d -p 10086:22 --name django ubuntu-ssh
複製代碼
# mkdir /data/{server,softs} -p
# cd data/softs
# scp root@192.168.8.14:/data/softs/Django-2.1.2.tar.gz ./
複製代碼
注: scp 適用於 ssh 鏈接方式。若使用 exec 模式,能夠在啓動容器的時候 使用 -v 將項目文件掛載進來。 (TODO)
安裝基本的依賴軟件:
apt-get install python3-pip python-dev build-essential -y
複製代碼
安裝 Django 軟件:
cd /data/softs
tar xf Django-2.1.2.tar.gz cd Django-2.1.2
python3 setup.py install
複製代碼
略
設置訪問主機:
# vim itcast/settings.py
...
ALLOWED_HOSTS = ['*']
複製代碼
啓動項目:
python3 manage.py runserver 172.17.0.2:8000
複製代碼
注意: 要提早使用 ifconfig 來檢查一下當前容器的 ip,以方便接下來的測試。
在宿主機, 查看容器的ip地址
docker inspect django
複製代碼
瀏覽器、或curl查看效果:
172.17.0.2:8000/hello/
複製代碼
這一章節須要後續修改完善,實際的部署不徹底是這樣的,只是一個部署的初級版本。