Docker實作營

實作步驟及摘要

1 環境準備

2 搜尋並取得映像檔

3 利用映像檔建立容器

  • 網路設定

    • 建立容器時,使用網路預設值(即bridge)

    • 建立容器時,設定port mapping

    • 建立容器時,使用host network

  • 同步容器資料

    • 同步本機資料

  • 傳入環境變數

4 撰寫及使用Dockerfile

  • git clone from Github

  • 調整Dockerfile後,建立映像檔

5 Docker Compose

6 Docker Push到倉庫

實作1 環境準備

  • 按下Start開始

  • 按下左邊的 + ADD NEW INSTANCE,即可開始作業

實作2 搜尋並取得映像檔

docker search搜尋nginx

$ docker search nginx
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                              Official build of Nginx.                        13505               [OK]                
jwilder/nginx-proxy                Automated Nginx reverse proxy for docker con…   1841                                    [OK]
richarvey/nginx-php-fpm            Container running Nginx + PHP-FPM capable of…   780                                     [OK]
linuxserver/nginx                  An Nginx container, brought to you by LinuxS…   122                                     
bitnami/nginx                      Bitnami nginx Docker Image                      87                                      [OK]
tiangolo/nginx-rtmp                Docker image with Nginx using the nginx-rtmp…   85                                      [OK]
jc21/nginx-proxy-manager           Docker container for managing Nginx proxy ho…   72                                      
alfg/nginx-rtmp                    NGINX, nginx-rtmp-module and FFmpeg from sou…   71                                      [OK]
  • Docker Hub搜尋nginx,並過濾tag = 1.13-alpine,找到docker pull指令

  • 執行docker pull nginx:1.13-alpine下載nginx映像檔

實作3 利用映像檔建立容器

  • 利用docker pull下載cutejaneii/docker.python_demo映像檔

  • 將上述映像檔,再上一個新的tag : myapp

  • 利用docker images查看所有映像檔

  • myapp映像檔建立容器

    • 建立容器時,使用網路預設值(即bridge)

    • 建立容器時,設定port mapping

    • 建立容器時,使用host network

建立完成後,可用curl測試看看是否成功

$ curl 127.0.0.1:8080
Hello World! (Python 2.7.16) everyone!!
$ curl 127.0.0.1:80
Hello World! (Python 2.7.16) everyone!!
  • 同步容器資料

    • 同步本機資料

本機建立一個app資料夾,加入以下的main.py,再用-v的方式建立容器,docker run -d -p 8888:80 -v /app:/app myapp

import os
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Good Morning!!!!! " + os.environ['owner']

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

最後用curl測試看看是否成功

$ curl 127.0.0.1:8888
Good Morning!!!!! everyone!!
  • 傳入環境變數 docker run -d -p 9999:80 -e "owner=Jennifer" myapp

curl測試看看是否成功

$ curl 127.0.0.1:9999
Hello World (Python 2.7.16) Jennifer

實作4 撰寫及使用Dockerfile

  • git clone from Github

$ git clone https://github.com/cutejaneii/docker.python_demo.git
Cloning into 'docker.python_demo'...
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (7/7), done.
Receiving objects: 100% (10/10), done.
remote: Total 10 (delta 1), reused 0 (delta 0), pack-reused 0
Resolving deltas: 100% (1/1), done.
  • 調整Dockerfile後,建立映像檔

$ docker build -t myapp .

實作5 Docker Compose

撰寫docker-compose.yml

  version: '3'
  services:
    app:
      image: myapp
      ports:
        - 5566:80
      restart: always
      environment:
        - owner=LIAO

執行docker-compose

$ docker-compose -f docker-compose.yml up
Recreating root_app_1 ... done
Attaching to root_app_1
app_1  |  * Serving Flask app "main" (lazy loading)
app_1  |  * Environment: production
app_1  |    WARNING: This is a development server. Do not use it in a production deployment.
app_1  |    Use a production WSGI server instead.
app_1  |  * Debug mode: on
app_1  |  * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
app_1  |  * Restarting with stat
app_1  |  * Debugger is active!
app_1  |  * Debugger PIN: 162-450-668

curl看看

$ curl 192.168.0.8:5566
Hello World! (Python 2.7.16) LIAO

實作5 Docker Push到倉庫

Docker Push到公用倉庫Docker Hub

  • Docker Login

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: cutejaneii
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
  • Docker Tag:在推送到自己的repository之前,要先tag

$ docker tag myapp cutejaneii/myapp
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cutejaneii/myapp    latest              7aba68965779        40 minutes ago      696MB
myapp               latest              7aba68965779        40 minutes ago      696MB
  • Docker Push

$ docker push cutejaneii/myapp
The push refers to repository [docker.io/cutejaneii/myapp]
4e5b25e56255: Pushed 
27ca79121151: Pushed 
e1a81b1589ce: Pushed 
f8093b983c20: Pushed 
ebac8a5e2f5b: Pushed 
ebd94299f5d0: Pushed 
ff1c70957ceb: Pushed 
1bb42387f7cb: Pushed 
94119923fb5e: Pushed 
a11003618325: Pushed 
668c51fd0cef: Pushed 
latest: digest: sha256:cd0d1e36474560d95f081fb96efe9d3182802a196a89fd9b2f617b058515d807 size: 2635

成功後在Docker Hub上就可以看到這個映像檔

Last updated