Docker-建立和分享應用(3)

   

  Dockerfile定義容器內環境中發生的事情。對網絡接口和磁盤驅動器等資源的訪問在此環境中進行虛擬化,該環境與系統的其餘部分隔離,所以您須要將端口映射到外部世界,並具體說明要「複製」哪些文件到該環境。可是,在執行此操做以後,您能夠預期Dockerfile在此處定義的應用程序的構建 在其運行的任何位置都徹底相同。html

 

1. 快速測試Docker環境是否可用

docker run hello-world

 

2. 建立Dockerfile文件

   在一個空目錄中建立一個名爲Dockerfile的文件,內容以下:node

# 使用官方的Python環境做爲父鏡像
FROM python

# 設置工做目錄爲 /app
WORKDIR /app

# 拷貝當前目錄下的文件到容器的/app目錄下
COPY . /app

# 在容器中運行下面命令安裝 requirements.txt中的軟件
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# 暴露80端口到容器外部
EXPOSE 80

# 定義一個環境變量
ENV NAME World

# 當容器啓動時,運行'python app.py'
CMD ["python", "app.py"]

  

  

3. 在該目錄下繼續建立一個Flask應用程序和安裝文件清單

app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80) 

requirements.txt

Flask
Redis

  

 

4. 構建應用程序

咱們準備構建應用程序。確保您仍處於新目錄的頂層。這是ls應該顯示的內容:python

$ ls
Dockerfile		app.py			requirements.txt

  

建立一個Docker鏡像,咱們將使用該--tag或者-t選項命名鏡像
redis

docker build --tag=friendlyhello .

  

查看建立的鏡像docker

root@node1 docker]# docker image ls
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
friendlyhello                        latest              67bd580f29b8        21 seconds ago      937MB

  

Linux用戶的故障排除
  • 代理服務器設置

  代理服務器能夠在Web應用程序啓動並運行後阻止其鏈接。若是您位於代理服務器後面,請使用如下ENV命令將如下行添加到Dockerfile中,以指定代理服務器的主機和端口:json

# Set proxy server, replace host:port with values for your servers
ENV http_proxy host:port
ENV https_proxy host:port

  

  • DNS設置

  DNS配置錯誤可能會產生問題pip您須要設置本身的DNS服務器地址才能pip正常工做。您可能想要更改Docker守護程序的DNS設置。您能夠/etc/docker/daemon.json使用dns密鑰編輯(或建立)配置文件,以下所示:flask

{
  "dns": ["your_dns_address", "8.8.8.8"]
}

  在上面的示例中,列表的第一個元素是DNS服務器的地址。第二項是Google的DNS,可在第一項沒法使用時使用。centos

  在繼續以前,請保存daemon.json並從新啓動docker服務。瀏覽器

sudo service docker restartbash

修復後,重試運行該build命令。

 

 

5. 運行應用程序

運行應用程序,使用如下方法將計算機的端口4000映射到容器的已發佈端口80,-p是將容器的端口Publish到外部的意思。

docker run -p 4000:80 friendlyhello

 在瀏覽器訪問‘http://localhost:4000’便可訪問到內部的應用程序,按Ctrl+c便可結束應用程序。

 

後臺以分離模式運行應用程序,-d就是在後臺運行鏡像,並打印出容器ID

docker run -d -p 4000:80 friendlyhello

 

 

6. 中止應用程序所在容器的運行

docker container stop ID

  

7. 分享鏡像

若是沒有Docker賬戶,請在hub.docker.com上註冊一個賬戶 ,並記下的用戶名。

1. 在本地的計算機上登陸

docker login

 

2. 將鏡像打上標籤,該命令的語法是:

docker tag image username/repository:tag

  好比個人登陸名爲scottcho,將版本庫命名爲flask,tag爲v1

[root@node1 docker]#  docker tag friendlyhello scottcho/flask:v1

[root@node1 docker]# docker image ls scottcho/flask
REPOSITORY   TAG IMAGE ID     CREATED    SIZE
scottcho/flask v1 67bd580f29b8 30 minutes ago 937MB

  

3. 發佈鏡像

docker push scottcho/flask:v1

 在docker hup上能夠看見所建立的鏡像

 

4. 在任何計算機上能夠運行分享的鏡像

若是映像在本地不可用,則Docker會從存儲庫中提取映像。

docker run -p 4000:80 scottcho/flask:v1

  

  

 

查看容器內的改變信息

建立一個容器,會在容器的對應的鏡像上增長一個可寫層,鏡像部分是隻讀的。經過 diff命令能夠看出改變的信息。如:

 

[root@wls12c ~]$ docker run -i -t centos /bin/bash
[root@224de7986c5f /]# touch demo.ext
[root@224de7986c5f /]# echo hello docker >demo.ext 
[root@224de7986c5f /]# rm -rf anaconda-post.log 
[root@224de7986c5f /]# exit
exit
[root@wls12c ~]$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
224de7986c5f        centos              "/bin/bash"         40 seconds ago      Exited (0) 3 seconds ago                       desperate_curie     
[root@wls12c ~]$ docker diff 224d
D /anaconda-post.log
A /demo.ext
C /root
A /root/.bash_history

 

說明:每行表明一個變更的文件或目錄。其中 A 表示新增、C表示被修改、D表示被刪除

 

 

主機和容器之間的文件拷貝

容器--->主機

[root@wls12c ~]$ docker exec  -t -i 9f bin/bash
[root@9f49397623ad /]# cat demo.txt 
hello
[root@9f49397623ad /]# exit
exit
[root@wls12c
~]$ docker cp 9f:/demo.txt /test [root@wls12c ~]$ cat /test/demo.txt hello

主機-->容器

[root@wls12c ~]$  cp ~/1.txt  /var/lib/docker/aufs/mnt/9f49397623ade7dfd2beb4d84454cbdb9878a4b22a2bab2e8b5db72bcffe60a0/test 
[root@wls12c ~]$ docker exec   -t -i 9f   /bin/bash
[root@9f49397623ad /]# ls /test
1.txt

 

重命名容器

[root@wls12c ~]$ docker rename stoic_meitner demo
相關文章
相關標籤/搜索