- Dockerfile 主要命令
- 官方鏡像倉庫的使用
- Dockerfile編寫
- 基於 Alpine的 JRE 和 Tomcat 的鏡像制作與運行
- MySQL 5.7.22 鏡像制作與運行
Dockerfile 主要命令
ADD ARG CMD COPY ENTRYPOINT ENV
EXPOSE FROM HEALTHCHECK LABEL MAINTAINER(棄用) ONBUILD
RUN SHELL STOPSIGNAL USER VOLUME WORKDIR
- 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"]
- 指定 shell , 影響后面的:
- STOPSIGNAL
- 當容器退出時, 給系統發送什么樣的指令
- USER
- 用於設置運行容器的用戶和組
- 如:
- USER www.www
- USER admin
- USER 1000
- VOLUME
- 創建一個可以從本地主機或其他容器掛載的掛載點, 一般用來存放數據庫等各種需要持久化的數據;
- 如: VOLUME ["/data"]
- WORKDIR
- 用於設置CMD指明的命令的運行目錄
- 如 WORKDIR /tmp
官方鏡像倉庫的使用
官方鏡像倉庫的地址: https:hub.docker.com
沒有登錄信息的話,點擊 Sign up for Docker Hub ;自己進行注冊; 注冊成功或已經有賬戶, 直接使用Sign in 登錄;
搜索到需要的鏡像,可以看到生成鏡像時的 Dockerfile 文件;
可以點擊 Create a Repositort 或者 點擊 Repositories 后 點擊 create Repository 進行創建倉庫, 例: 倉庫名為 httpd
創建完成后, 有如何使用的介紹; 如何進行推送; 或者 命令行中創建 倉庫;
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