1. 程式人生 > >Docker系列(三):docker自定義容器映象

Docker系列(三):docker自定義容器映象

將容器程式設計映象:

docker commit [repo:tag]
網上有這句話:當我們在製作自己的映象的時候,會在container中安裝一些工具、修改配置,如果不做commit儲存 起來,那麼container停止以後再啟動,這些更改就消失了。

docker create --name myjava -it java /bin/bash
docker ps  得到container  id   假如是123
docker start myjava
docker exec -it  123 /bin/bash
mkdir test
ls
--------------------
------以上操作是在容器中加了一個test檔案 docker stop 123(containerid) docker start 123 ls --------------------------發現還是有的。

說明網上說的是錯誤的。

優點:方便、快速 缺點:不規範、無法自動化

Buildfile

一個Java映象的buildfile

FROM nimmis/ubuntu:14.04 (建議是linux的基礎映象例如centos等)
MAINTAINER nimmis <kjell.[email protected].com>  (由哪個人維護的人  郵箱)
# disable interactive functions ENV DEBIAN_FRONTEND noninteractive # set default java environment variable ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64 (環境變數) RUN apt-get install -y software-properties-common && \ add-apt-repository ppa:openjdk-r/ppa -y && \ apt-get update &&
\ apt-get install -y --no-install-recommends openjdk-8-jre && \ rm -rf /var/lib/apt/lists/* DATAGURU專業 (執行的命令,行尾的\是執行完本次命令執行下個命令)

docker build -t java . ( -t: 映象的名字及標籤,通常 name:tag 或者 name 格式;可以在一次構建中為一個映象設定多個標籤。 java是映象名稱 .是在當前目錄找buildfile檔案)

step1:
step2:
...

注意:所有的每一步不是再docker的宿主機上執行的,是在docker容器中執行的!
證實案例:
在宿主機中/bin 下建立hello.sh
在上面的buildfile中加入如下語句:

ADD hello.sh /bin/hello.sh
RUN /bin/hello.sh

分析:如果只加入RUN /bin/hello.sh的話,是會報錯的,因為雖然宿主機有這個檔案,但是執行命令的時候是在容器中,容器中是沒有這個檔案的,所以要在容器中建立ADD hello.sh /bin/hello.sh,這就充分的驗證了“所有的每一步不是再docker的宿主機上執行的,是在docker容器中執行的”
證實案例:
在上面的buildfile中加入如下語句:

ENV http_proxy=http:///xxxx 
RUN curl http://baidu.com

如果只加入RUN curl http://baidu.com的話,會出現timeout,雖然宿主機是配置了proxy的,但是容器中並沒有配置,加上env,執行成功,同樣驗證了上面的觀點

複雜案例實戰:製作ubuntu+java+tomcat+ssh server映象

FROM ubuntu
MAINTAINER yongboy "[email protected]"
# 更新源,安裝ssh server
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
# 設定root ssh遠端登入密碼為123456
RUN echo "root:123456" | chpasswd
# 新增orache java7源,一次性安裝vim,wget,curl,java7,tomcat7等必備軟體
RUN apt-get install python-software-properties
RUN add-apt-repository ppa:webupd8team/java
RUN apt-get update
RUN apt-get install -y vim wget curl oracle-java7-installer tomcat7

# 設定JAVA_HOME環境變數
RUN update-alternatives --display java
RUN echo "JAVA_HOME=/usr/lib/jvm/java-7-oracle">> /etc/environment RUN echo "JAVA_HOME=/usr/lib/jvm/java-7-oracle">> /etc/default/tomcat7
# 容器需要開放SSH 22埠 這裡的22根據實際情況而定
EXPOSE 22
# 容器需要開放Tomcat 8080EXPOSE 8080
# 設定Tomcat7初始化執行,SSH終端伺服器作為後臺執行 
ENTRYPOINT service tomcat7 start && /usr/sbin/sshd -D
#ENTERPOINT 是docker run後面的引數 一個buildfile只能有一個,多個最後的會覆蓋前面的,
#並且不可被 docker run 提供的引數覆蓋

#關於CMDENTERPOINT的區別:https://blog.csdn.net/allocator/article/details/70490218

Using Supervisor with Docker(多程序)

允許docker同時執行多個程序,在配置檔案中進行配置,把Supervisor作為docker的啟動程序。
優點:如果某個程序死了,會自動將它重新啟動起來。,所以他是一個監管者。
supervisord.conf

[supervisord]
nodaemon=true
[program:sshd] c
ommand=/usr/sbin/sshd -D
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"

映象製作中的問題

ssh server是否應該包含到映象裡 ?
不要,容器不是虛擬機器,再者ssh有配置,寫死在容器中,洩密的話,需要重新打。
一個容器究竟執行幾個程式?
最好是一個,如果有程序死了是不知道的,只有前臺的程序知道。
程式引數和配置檔案到底放在哪的問題 ?
放在環境變數中(不適合引數多的)
程式日誌輸出的問題
1.繫結到本地磁碟輸出 2.埠寫入

docker友好程式架構

Docker images------->(配置剝離到)-------->Etcd/Zookeeper(key value形式)
coreos內嵌了etcd kuberbetes也把etcd作為資源排程的核心