玩轉docker
你將學會什麼?這是一個最小的閉環,可以動手別BB, 做一遍你會明白很多
- 可以把docker 運行起來;
- 可以定製化自己的容器;
- 怎樣推送自己的鏡像;
- 讓你學會怎樣寫一個簡單的dockerfile;
環境準備
從哪裏下手? 先有一個docker 環境,至於docker 怎麼搭建環境,請參考:docker 官方文檔
爲什麼要自己構建鏡像?
1.自己把測試環境裝一遍? 這個時間成本太高,所以docker 鏡像能讓你快速的複製一個可用的測試環境;
構建自己的基礎鏡像
我們以python 爲例,構建一個flask 的鏡像環境,並推送到自己的鏡像倉庫;
如果沒有鏡像倉庫怎麼辦? 到這裏註冊一個:https://www.docker.com/
實在不想註冊,那本地玩玩也行,就不用管本文檔裏面介紹的登錄和推送鏡像倉庫相關的步驟;
1.先從登錄開始
docker login #默認登錄的是 https://hub.docker.com , 如果你有自己搭建的倉庫,後面可以跟自己倉庫的地址
2.查找鏡像
我們如果需要定製化一個自己的python 鏡像,就需要先找一個合適的基礎鏡像;
docker search python #查找所有python 的鏡像
docker search python:3.7.4 #查找指定版本的鏡像
3.拉取鏡像
既然找到了,那就把鏡像拉到你自己的機器上
docker pull python:3.7.4 #第一次獲取會比較慢,畢竟要下很多東西,截圖裏我是已經下過的,所以就會先從本地查找
4.有鏡像了,怎麼把容器跑起來?
docker run -d python:3.7.4 #這時會返回一個容器ID, 只需要前面一部分字符串就可以了, -d 是後臺運行的命令參數
docker exec -it 6bee4548e3e7aa0b6388d6a bash #當你試圖進入容器的時候,報錯了
PS: 這是因爲你docker run 的時候,容器會默認的執行它設置好的命令執行完,容器就結束了
要想自己手動的交互式的執行命令,那麼你就需要使用 下面的命令:
docker run -d -it python:3.7.4 #多了 -it 參數,用來指定是手動執行命令
docker exec -it 4be1f2f8779439a6bda /bin/bash #docker exec -it 容器ID /bin/bash 進入容器手動執行命令,並指定 shell 的版本
python -V #查看python 版本
pip -V #查看pip版本
5.修改你的容器
已經進去了,接下來要做什麼呢? 當然是安裝你的flask 相關環境了;
那麼假如你有一個依賴文件需要copy 到容器裏面? 怎麼搞
step1: 先退出容器,exit 命令就可以
step2: docker cp requirements.txt 4be1f2f8779439a6bda:/tmp #docker cp 文件名 容器ID前幾位:容器裏面的目錄
step3: 進入容器,我們看下文件
docker exec -it 4be1f2f8779439a6bda /bin/bash
cd /tmp
ls
cat requirements.txt
step4: 開始安裝 pip install -r requirements.txt
呦呦~~呦呦~
安裝完了,接下來怎麼搞? 簡單寫個flask頁面吧
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == "__main__":
app.run("0.0.0.0", 8080, True)
把它copy 到容器裏面
docker cp app.py 4be1f2f8779439a6bda:/tmp
容器裏面運行一下, 證明你的容器環境是OK 的
python /tmp/app.py
OK 沒有問題,先退出容器:exit
我們來搞下一步,保存對容器的修改
docker commit -m “構建基礎鏡像” -a “安裝flask環境” 4be1f2f8779439a6bda #把修改內容提交到容器裏面,備註修改內容
docker images #查看新生成的副本
docker tag 51d96631de36 assless/you2b:python3.7.4 #docker tag 新副本容器ID 倉庫地址:tag_name
推送到鏡像倉庫
docker push assless/you2b:python3.7.4 #assless/you2b 是鏡像地址, python3.7.4 是tag名
鏡像也提交了,接下來做什麼?
6.寫個dockerfile 運行一下
dockerfile
FROM assless/you2b:python3.7.4
MAINTAINER [email protected]
EXPOSE 8080
WORKDIR /tmp
CMD python app.py
運行之前需要先build一下,把運行命令加進去
把dockerfile 和 需要用到的文件放到同一個乾淨的目錄下
docker build -t flask_text . #不要忘記最後的那個"." 點,命令需要和 dockerfile 在同一目錄下執行
構建好了,那麼我們來運行一下
docker run -d -p 8089:8080 flask_test
那麼最後見證奇蹟的時刻到了,本地訪問下 127.0.0.1:8089
你就能訪問到容器裏面的程序了~
7.善後處理
本地搞了一些測試的東西,需要刪除掉
清理容器:
docker container ls #查看正在運行的容器
docker container stop 容器ID #停止容器, 停止的容器,可以用: docker container start 容器ID 重新啓動
docker container rm 容器ID #刪除的就無法重新啓動了
docker stop $(docker ps -a -q) #停止所有容器
docker rm $(docker ps -aq) #批量刪除所有容器
docker rm $(docker ps -f "status=exited" -q) #刪除狀態是退出的容器
清理鏡像:
docker images #查看本地的鏡像
docker rmi 容器ID #注意如果有容器在使用這個鏡像,那麼你是刪不掉的,需要先停止和刪除容器(如果這個容器不再使用的話)