docker 進階總結

Dockerfile

定義

Dockerfile相似於咱們學習過的腳本,將咱們在上面學到的docker鏡像,使用自動化的方式實現出來。html

做用

  1. 找一個鏡像: ubuntu
  2. 建立一個容器: docker run ubuntu
  3. 進入容器: docker exec -it 容器 命令
  4. 操做: 各類應用配置
  5. ...
  6. 構建新的鏡像

Dockerfile 使用準則

記得網上有一個最佳實踐,能夠🔍搜索一下。python

  1. 大:首字符必須大寫
  2. 空:儘可能將 Dockerfile 放在空目錄中
  3. 單: 每一個容器儘可能只有一個功能
  4. 少: 執行的命令越少越好

Dockerfile 基礎四指令

  • 基礎鏡像信息: 從哪裏來
  • 維護者信息: 我是誰
  • 鏡像操做指令: 怎麼幹
  • 容器啓動時執行指令: 嗨 !!!

Dockerfile 使用命令

構建鏡像命令格式:nginx

docker build -t [鏡像名]:[版本號] [Dockerfile所在目錄]
複製代碼

構建樣例:web

docker build -t nginx:v0.2 /opt/dockerfile/nginx/
複製代碼
  • -t: 指定構建以後的鏡像信息
  • /opt/dockerfile/nginx/ 表明 Dockerfile 的存放位置,若是是當前的目錄,可使用 . 表示。

快速入門

準備環境

建立 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

格式:

FROM <image>
FROM <image>:<tag>
複製代碼

解釋:

FROM 是 Dockerfile裏的第一條並且只能是除了首行註釋以外的第一條指令。

MAINTAINER

格式:

MAINTAINER <name>
複製代碼

解釋:

指定該 dockerfile 文件的維護者信息。相似咱們在 docker commit 時候使用-a 參數指定的信息

RUN

格式:

RUN <command>
RUN["executable", "param1", "param2"] 
複製代碼

解釋: shell模式:相似於 /bin/bash-ccommand 舉例: RUN echo hello exec 模式:相似於 RUN ["/bin/bash", "-c", "command"] 舉例: RUN ["echo", "hello"]

EXPOSE

格式:

EXPOSE <port> [<port>...]
複製代碼

解釋: 設置 Docker 容器對外暴露的端口號,Docker 爲了安全,不會自動對外打開端口,若是須要外部提供訪問,還須要啓動容 器時增長-p 或者-P 參數對容器的端口進行分配。

ENTRYPOINT

格式:

ENTRYPOINT ["executable", "param1","param2"] (exec 模式) 
ENTRYPOINT command param1 param2 (shell 模式)
複製代碼

解釋: 每一個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。

文件編輯指令詳解

ADD

格式:

ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
複製代碼

解釋:

  • 將指定的 文件複製到容器文件系統中的
  • src 指的是宿主機,dest 指的是容器
  • 若是源文件是個壓縮文件,則 docker 會自動幫解壓到指定的容器中(不管目標是文件仍是目錄,都會當成目錄處理)

COPY

格式:

COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
複製代碼

解釋: 單純複製文件場景,Docker 推薦使用 COPY

VOLUME

格式:

VOLUME ["/data"]
複製代碼

解釋:

  • VOLUME 指令能夠在鏡像中建立掛載點,這樣只要經過該鏡像建立的容器都有了掛載點
  • 經過 VOLUME 指令建立的掛載點,沒法指定主機上對應的目錄,是自動生成的。 舉例: VOLUME ["/var/lib/tomcat7/webapps/"]
  • 參考: segmentfault.com/q/101000000…

實踐

首先在當前目錄下面建立一個用於測試的壓縮文件:

而後建立一個測試的單個文件 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 環境設置指令

格式:

ENV <key> <value>
ENV <key>=<value> ...
複製代碼

解釋: 設置環境變量,能夠在 RUN 以前使用,而後 RUN 命令時調用,容器啓動時這些環境變量都會被指定。

WORKDIR

格式:

WORKDIR /path/to/workdir (shell 模式)
複製代碼

解釋: 切換目錄,爲後續的 RUN、CMD、ENTRYPOINT 指令配置工做目錄。 至關於 cd 能夠屢次切換(至關於 cd 命令),也可使用多個 WORKDIR 指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑

舉例:

WORKDIR /a 
WORKDIR b 
WORKDIR c
RUN pwd
複製代碼

則最終路徑爲 /a/b/c。

ENV 實踐

在上一個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 環境變量)

Dockerfile 的構建過程

  • 從基礎鏡像 1 運行一個容器 A
  • 遇到一條 Dockerfile 指令,就對容器 A 進行一次修改
  • 執行完一條命令,提交生成一個新鏡像 2
  • 再基於新的鏡像 2 運行一個容器 B
  • 遇到一條 Dockerfile 的指令,都對容器進行一次修改操做
  • 執行完一條指令,提交生成一個新鏡像 3
  • ...

構建過程當中的鏡像介紹

構建過程當中,建立了不少鏡像,這些中間鏡像,咱們能夠直接使用來啓動容器,經過查看容器效果,從側面能看到咱們每次構建的效果。提供了鏡像調試的能力

咱們能夠經過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 
複製代碼

使用 Dockfile 構建 Django 環境 (FIXME)

技術關鍵點:

  1. docker環境部署:
    • 使用docker鏡像啓動一個容器便可
  2. django環境部署
    • django軟件的依賴環境
    • django軟件的基本環境配置
  3. django項目部署
    • django框架的下載
    • 項目文件配置
    • 啓動django項目
  4. 測試
    • 宿主機測試

流程:

docker 環境配置

  1. 獲取 docker 鏡像,這裏就使用前面建立的 ubuntu-ssh 鏡像

2. 啓動 docker 容器,名稱叫作 django

docker run -d -p 10086:22 --name django ubuntu-ssh
複製代碼

  1. 進入容器: (可使用 ssh ip -p 10086 的形式進入) 由於 MacOs開啓了鏈接保護,因此我使用 exec 進入

docker 環境部署

# 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
複製代碼

Django 項目部署

項目啓動

設置訪問主機:

# 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/
複製代碼

這一章節須要後續修改完善,實際的部署不徹底是這樣的,只是一個部署的初級版本。

相關文章
相關標籤/搜索