Dockerfile / 官方鏡像倉庫

  • Dockerfile 主要命令
  • 官方鏡像倉庫的使用
  • Dockerfile編寫
  • 基於 Alpine的 JRE 和 Tomcat 的鏡像製做與運行
  • MySQL 5.7.22 鏡像製做與運行

 

Dockerfile 主要命令html


  ADD     ARG    CMD              COPY    ENTRYPOINT     ENVmysql

  EXPOSE     FROM    HEALTHCHECK      LABEL   MAINTAINER(棄用)    ONBUILDsql

  RUN      SHELL      STOPSIGNAL     USER     VOLUME       WORKDIRdocker

 

  • ADD 命令
    • 有兩個參數, 源和目標, 它的基本做用是從源系統的文件系統上覆制文件到目標容器的文件系統, 若是源是一個 URL, 那該 URL 的內容將被下載並複製到容器中;
    • 如 ADD run.sh /
  • ARG 命令(通常不使用)
    • 設置變量, ARG命令定義了一個變量, 在 docker build 建立鏡像的時候, 使用  --build-arg <varname>=<value> 來指定參數;
    • 若是用戶在 build 鏡像時指定了一個參數沒有定義在 Dockerfile 中, 那麼將有一個 Warning;
  • CMD
    • 和 RUN 命令類似, CMD 能夠用於執行特定的命令, 和 RUN 不一樣的是, 這些命令不是在構建鏡像的過程當中執行的, 而是在用鏡像啓動容器後被調用的;
    • 如 CMD "command" "arg1" "arg2"
  • COPY
    • 複製文件到鏡像
    • COPY <src> <dst>
    • src 只能是與 Dockerfile 同級的本地文件
    • 如:  COPY run.sh /
  • ENTRYPOINT
    • 配置一個容器使之可執行化, 若是結合 CMD 命令和 ENTRYPOINT 命令, 能夠從 CMD 命令中移除 "application" 而僅僅保留參數, 參數將傳遞給 ENTRYPOINT 命令;
    • 如:  ENTRYPOINT ["/run.sh","arg1","arg2"]
  • ENV
    • 用於設置環境變量, 這些變量以 "key=value" 的形式存在, 在 Dockerfile 中其它命令裏能夠直接引用, 並能夠在容器內被腳本或者程序調用;
    • 如:
      • ENV version=1.2.5
      • ENV release 1.0.1
  • EXPOSE
    • 用來指定容器內端口映射到外部,使容器內的應用能夠經過端口和外界交互;
    • 如: EXPOSE 8080
  • FROM -- 通常是在Dockerfile中不算註釋的第一行
    • 指定基礎鏡像
    • 如: FROM cenos:7
  • HEALTHCHECK
    • 容器健康檢查命令, 可是容器通常使用的是編排工具的健康檢查, 這個使用的別較少;
    • 語法兩種
      • HEALTHCHECK [OPTIONS] CMD command
      • HEALTHCHECK NONE
    • 第一個的功能是在容器內部運行一個命令來檢查容器的健康情況;
    • 第二個的功能是在基礎鏡像中取消健康檢查命令
  • LABEL
    • 爲鏡像定義標籤信息
    • 如: LABEL job.name="Tian" maintainer="TianFei tzhr@xxx.com"
  • MAINTAINER
    • 用於聲明鏡像維護者的信息
    • 如: MAINTAINER Tian Fei <tzhr@xxx.com>
    • 已棄用, 使用 LABEL 代替
      • LABEL maintainer="TianFei tzhr@xxx.com"
  • ONBUILD <使用的比較少>
    • 只對基於 (FROM) 當前鏡像的鏡像生效
  • RUN
    • Dockerfile執行 shell 命令的核心部分, 它接受命令做爲參數並用於建立鏡像, 不像 CMD 命令, RUN 命令做用於建立鏡像過程當中;
    • 多條命令以 "&" 或 ";" 結合
    • 如:  RUN yum update -y && \
               yum -y install vim
  • SHELL
    • 指定 shell , 影響後面的:
      • RUN
      • CMD
      • ENTRYPOINT
    • SHELL ["command", "parameters"]
  • STOPSIGNAL
    • 當容器退出時, 給系統發送什麼樣的指令
  • USER
    • 用於設置運行容器的用戶和組
    • 如:
      • USER www.www
      • USER admin
      • USER 1000
  • VOLUME
    • 建立一個能夠從本地主機或其餘容器掛載的掛載點, 通常用來存放數據庫等各類須要持久化的數據;
    • 如: VOLUME ["/data"]
  • WORKDIR
    • 用於設置CMD指明的命令的運行目錄
    • 如 WORKDIR /tmp

 

官方鏡像倉庫的使用shell


 

     官方鏡像倉庫的地址: https:hub.docker.com數據庫

     沒有登陸信息的話,點擊 Sign up for Docker Hub ;本身進行註冊; 註冊成功或已經有帳戶, 直接使用Sign in 登陸;apache

     搜索到須要的鏡像,能夠看到生成鏡像時的 Dockerfile 文件;vim

     能夠點擊 Create a Repositort 或者 點擊 Repositories 後 點擊 create Repository 進行建立倉庫, 例: 倉庫名爲 httpdcentos

       建立完成後, 有如何使用的介紹; 如何進行推送; 或者 命令行中建立 倉庫;緩存

       OFFICIAL IMAGE 爲官方的鏡像;

     使用命令行查看鏡像 docker search 鏡像:[tags];

     Docker 登陸  docker login -u tzhr -p xxx ,會提示這樣使用不安全; 或者 docker login -u tzhr 直接回車,再按提示輸入密碼;  登陸私有倉庫 docker login -u tzhr -p xxxx 私有地址

     登陸後才能上傳鏡像;tzhr 爲登陸用戶名;

    給鏡像打標籤, 而後推送鏡像

[root@localhost ~]# docker tag tian/httpd:v.2.0 tzhr/httpd:v.1.0
[root@localhost ~]# docker push tzhr/httpd:v.1.0
The push refers to repository [docker.io/tzhr/httpd]
48ecba369a69: Pushed 
0b97b1c81a32: Pushed 
v.1.0: digest: sha256:2eb0d2b7ea219fccf26550f45d6f1b5f6706813ac39041f7548381b3e48d95f1 size: 734

      查看docker hub中登陸後已經上傳 tzhr/httpd:v.1.0

 

Dockerfile編寫


 

// 建立存放 Dockerfile 及文件的 目錄
mkdir -p /data/centos/7 && cd /data/centos/7

//編寫Dockerfile, RUN 更改時區,從 清華鏡像網站下載 epel 源; 升級; 安裝 vim ; 清理緩存.
vim Dockerfile
FROM docker.io/library/centos:7

LABEL maintainer="TianFei tzhr1225@xxx.com"

RUN ln -sfv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/centos/7/extras/x86_64/drpms/epel-release-7-6_7-9.noarc
h.drpm && \
    yum update -y && \
    yum -y install vim && \
    yum clean all

// 保存退出, 構建鏡像
[root@localhost 7]# docker build -t zxjr/centos:7 ./

// 運行容器, 查看已安裝 vim
[root@localhost 7]# docker run --name C7 --rm -it zxjr/centos:7
[root@70f88d49d901 /]# vim

 

 

// 建立 alpine , 最新版本 3.9
[root@localhost ~]# mkdir -pv /alpine/3.9
mkdir: created directory ‘/alpine’
mkdir: created directory ‘/alpine/3.9’
[root@localhost ~]# cd /alpine/3.9

// 編寫 Dockerfile, 使用 alpine:3.9 鏡像, alpine中沒有 localtime 文件, 使用本地的經過 COPY 複製到alpine中, 定義路徑地址變量爲清華大學鏡像地址; RUN中經過 echo 調用變量寫入 /etc/apk/repositories 文件中(至關於/etc/yum.repos); apk update 更新緩存; apk upgrade 更新系統; apk add curl 添加 curl;
[root@localhost 3.9]# vim Dockerfile

# Description alpine 3.9
FROM alpine:3.9

COPY localtime /etc/

ENV REPO_ADDR="https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.9"

RUN echo -e "$REPO_ADDR/main\n$REPO_ADDR/community" > /etc/apk/repositories && \
    apk update && \
    apk upgrade && \
    apk add curl

// 在/alpine/3.9 目錄中生成 localtime 文件
[root@localhost 3.9]# cp /usr/share/zoneinfo/Asia/Shanghai ./localtime

// 構建鏡像
[root@localhost 3.9]# docker build -t tzhr/alpine:3.9 ./

// 使用新的鏡像運行容器, 交互式驗證; alpine鏡像沒有 bash , 因此須要指定 /bin/sh
[root@localhost 3.9]# docker run --name A110 --rm -it tzhr/alpine:3.9 /bin/sh
/ # curl www.baidu.com                      // 安裝curl成功
<!DOCTYPE html>
/ # apk search bash                           // 查看能夠安裝的包
/ # apk add bash                                // 安裝 bash
(1/5) Installing ncurses-terminfo-base (6.1_p20190105-r0)
(2/5) Installing ncurses-terminfo (6.1_p20190105-r0)
(3/5) Installing ncurses-libs (6.1_p20190105-r0)
(4/5) Installing readline (7.0.003-r1)
(5/5) Installing bash (4.4.19-r1)
Executing bash-4.4.19-r1.post-install
Executing busybox-1.29.3-r10.trigger
OK: 16 MiB in 24 packages              // 表示容器多大, 安裝了多少個包
/ # apk del bash                                 // 卸載
OK: 7 MiB in 19 packages

// 安裝上bash 後, 能夠不指定/bin/sh 進行登陸
[root@localhost 3.9]# docker run --name A110 --rm -it tzhr/alpine:3.9
/ #

 

基於 Alpine的 JRE 和 Tomcat 的鏡像製做與運行


 

// 須要安裝 jre 環境,, 首先啓動alpine容器查看一下 jre 版本;
[root@localhost ~]# docker run --name A0 --rm -it alpine:3.9 /bin/sh
/ # apk update
/ # apk upgrade
/ # apk search jre
openjdk7-jre-7.211.2.6.17-r0
jreen-dev-1.3.0-r0
openjdk7-jre-lib-7.211.2.6.17-r0
texlive-20170524-r6
openjdk8-jre-base-8.212.04-r0
jreen-1.3.0-r0
openjdk8-jre-lib-8.212.04-r0
openjdk7-jre-base-7.211.2.6.17-r0
openjdk8-jre-8.212.04-r0

// 建立鏡像目錄並進入
[root@localhost ~]# mkdir -p /data/alpine/tomcat/
[root@localhost ~]# cd /data/alpine/tomcat/

// 編寫 Dockerfile, 使用openjdk8-jre; 經過清華鏡像網站下載tomcat包
[root@localhost tomcat]# vim Dockerfile

FROM alpine:3.9

LABEL maintainer="TianFei tzhr1225@xxx.com"

RUN apk update && \
    apk upgrade && \
    apk add curl openjdk8-jre && \
    curl -Ljk https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.21/bin/apache-tomcat-9.0.21.tar.gz | tar zxf - && \
    mv apache-tomcat-9.0.21 /usr/local/tomcat

CMD ["/usr/local/tomcat/bin/catalina.sh","run"]

// 構建鏡像,這樣只有85MiB, 如何使用centos的話, 加上jre和tomcat得200多兆;
[root@localhost tomcat]# docker build -t tzhr/tomcat:v.1.0 .
... ...
OK: 85 MiB in 57 packages
... ...

// 使用鏡像後臺運行容器,
[root@localhost tomcat]# docker run -d tzhr/tomcat:v.1.0
fda814531df36ddf33bdfa6045bee7683e35f721faaaee42ab0ac31cc3924842
[root@localhost tomcat]# docker ps -a |grep tomcat
fda814531df3        tzhr/tomcat:v.1.0   "/usr/local/tomcat/b…"   6 seconds ago       Up 5 seconds                                    quizzical_shaw

// 查看容器信息,獲取IP地址
[root@localhost tomcat]# docker container inspect fda814531df3
... ...
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "dd54f129406eb1e595af66fc0abe6a6b1cba8d0c69bff35a4a1eba549e3fb820",
                    "EndpointID": "e58fe4263092664dbbe7db8a7713ab9a58769b8f8eeb75815cb2f40c1b718424",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.6",
... ...

// 訪問 IP:8080 端口
[root@localhost tomcat]# curl -I 172.17.0.6:8080
HTTP/1.1 200 
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 26 Jun 2019 03:11:27 GMT

 

 

MySQL 5.7.22 鏡像製做與運行


 在相應的目錄中建立 Dockerfile ,init-db.sh(初始化數據庫的腳本) , run.sh(啓動mysql的腳本) 三個文件;

// 建立並進入目錄
[root@localhost ~]# mkdir -p /data/mysql/
[root@localhost ~]# cd /data/mysql/

// 編寫生成 Dockerfile 文件
[root@localhost mysql]# vim Dockerfile 


FROM centos:7                       // 基層調用 centos:7 鏡像

ENV MYSQL_VERSION="5.7.22-1"        // 定義 mysql 版本變量

COPY run.sh /                       // 複製 run.sh 腳本到鏡像中
COPY init-db.sh /                   // 複製 init-db.sh腳本

RUN yum update -y && \              // 更新系統
    yum install -y libaio-devel numactl-libs net-tools perl perl-Data-Dumper-Names perl-Data-Dumper perl-DBI && \         // 安裝基礎包
    yum clean all && \              // 清空 yum 緩存
    for pkg in common libs devel client server; \                    // for 循環,安裝mysql的rpm 包, 從清華鏡像網站安裝;
    do rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql57-community-el7/mysql-community-$pkg-$MYSQL_VERSION.el7.x86_64.rpm; done && \
    chmod 755 /run.sh /init-db.sh && rm -rf /var/lib/mysql           // 給 run.sh 及 init-db.sh 腳本可執行權限, 刪除 mysql 的數據存儲目錄

ENTRYPOINT ["/run.sh"]              // 啓動容器後運行run.sh腳本

 

 

// 編寫 mysql 初始化腳本 init-db.sh
[root@localhost mysql]# vim init-db.sh 

#!/bin/bash

# -------------------------------
# - Create by Tian, 2019.06.26  -
# -       I'm tzhr1225@xxx.com  -
# -------------------------------

# The passwd for mysql
M_P="Zxjr@tian"                             // 定義mysql的密碼變量

DBDIR="/var/lib/mysql"                      // 定義存儲目錄

test -d "$DBDIR/mysql" || mysqld --initialize               // 測試有沒有mysql庫, 沒有的話進行初始化, 5.7 之前使用mysql_install_db;
chown -R mysql:mysql $DBDIR                 // 改MySQL存儲目錄的屬主屬組爲 mysql;

echo "Start MySQL Server"
su - mysql -s /bin/bash -c "mysqld &"       // 切換到 mysql 用戶,啓動MySQL;

echo "Wait 5 seconds for MySQL start"
sleep 5              // 等待 5 秒鐘;

echo "Set password for root(default is :$M_P)"
mysqladmin -u root password $M_P            // 修改數據庫 root 用戶的密碼

echo "Update privilege for root"
mysql -u root -p$M_P -e "grant all on *.* to root@'%' identified by '$M_P' with grant option;"         // 受權,全部的地址可登陸

# Stop MySQL Server & Start MySQL Server
PID=`ps aux |grep "[m]yslq" |awk '{print $2}'`    // 定義PID變量
kill -9 $PID                                      // 殺掉mysql進程;

 

 

// 編寫 MySQL 的啓動腳本 run.sh
[root@localhost mysql]# vim run.sh 

#!/bin/bash

# -------------------------------------
# - Create by statemood, 2019.06.26   -
# -           I'm tzhr1225@xxx.com    -
# -------------------------------------

if [ -z "$@" ]                                  // $@ 表示腳本後面的參數, -z判斷爲空時; $# 參數的數量
then
    if [ ! -z "$MYSQL_CONFIG_FILE" ]            // MySQL配置文件變量不爲空時
    then
        test -f $MYSQL_CONFIG_FILE && cp -fv $MYSQL_CONFIG_FILE /etc/my.cnf               // 配置文件不爲空時, 複製生成my.cnf
    fi

    DIR="/var/lib/mysql/mysql"                  // 定義存儲目錄變量;

    test -d "$DIR" && chown -R mysql:mysql $(dirname $DIR) || /init-db.sh                // 測試存儲目錄存在, 給定義的目錄上一層目錄修改屬主屬組爲mysql, 不然執行初始化腳本;
    mysqld --user=mysql                         // 指定用戶啓動mysql
else
    "$@"
fi
相關文章
相關標籤/搜索