具有中國特色的docker折騰記(上)

2021-06-22 11:18:42 字數 3136 閱讀 7184

在剛剛過去的2023年裡,docker無疑是運維工作的一項革命性創新,然而在有中國特色的網際網路環境裡,要折騰這玩意兒還真是不方便。

且不說docker.io的官網在牆外,包括它的apt源和image index都在牆外,導致使用者增加了很多不必要折騰成本,真是中國程式設計師的一大悲哀啊。真不知道docker這種純技術的東西怎麼就不河蟹了……

那麼docker究竟是個什麼東西呢?

首先,你可以認為docker是乙個類似虛擬機器(vm)的東西,你可以把你要發布的應用打包成乙個docker image,然後部署到實際的機器上。這種機器可以是實際的伺服器,也可以是vps或其它paas之類的。然後,在乙個機器環境裡,你還可以同時跑幾個docker container。image和container的關係可以理解為「類」和「例項」的關係。而且在乙個機器環境裡跑的container還可以是基於不同的image。你可以隨時把乙個container打包成乙個image作再次的部署。

其次,你在乙個container裡作的修改也可以更新到基於同一image的其它container裡。因為可以只更新修改過的部分,類似於版本控制下的更新。事實上它也有乙個類似版本管理倉庫(repositry)的東西,有docker.io提供的官方倉庫(index.docker.io,相當於github),也可以自建(叫docker-registry)。

最後,它與vm的不同之處就在於乙個字:輕。乙個vm實際上包含了一套虛擬的硬體,乙個完整的os,再加入應用程式。而docker container只是乙個隔離的應用程式執行環境,對於應用程式來說,docker環境相當於乙個完整的os,但是實際上它是跑在宿主os上的,乙個container只包含這個應用環境與宿主機環境的差異部分,非常的輕量。

更貼切的模擬應該是:類似於python的virtualenv。只不過這是乙個os層面的virtualenv。

按官方文件的安裝說明,最好是用ubuntu 13.04及以上版本,因為需要kernel版本在3.8以上。其它發行版或低版本ubuntu也不是不行,就是略不方便。至於其它平台,請使用vagrant虛擬機器方案。

因為我自己的桌面是12.04lts,懶得手工公升級kernel(公升級方法在docker的官方文件裡有),所以在freebsd伺服器上裝了個virtualbox虛擬機器,裝了個linux mint 16(基於ubuntu 13.10)。以下以此為例。

首先,docker依賴aufs,還好這個mint自帶了,如果是其它發行版或是手工公升級kernel的就要檢查一下了:

sudo apt-get update

sudo apt-get install linux-image-extra-`uname -r`

之後是增加docker的apt源。

加源之前先加證書:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36a1d7869245c8950f966e92d8576a8ba88d21e9
但是因為官方源被牆,幸好還有乙個映象源可以用:

sudo sh -c "echo deb  docker main\

> /etc/apt/sources.list.d/docker.list"

sudo apt-get update

sudo apt-get install lxc-docker

至此,理論上安裝就已經完成了。但是還不能正常使用……

如前面所說,這樣安裝完成並不能正常使用,這又是因為可恥的大中華區域網造成的,docker的index伺服器被牆了。

解決方案是:你需要有vpn或者乙個http**(如果有sock5**的話,也可以用privoxy或polipo轉成http**)。

有到國外的vpn的話,直接建立起vpn連線就可以用。以下為http**方式,先假設你已經有了乙個http**:proxy_server:8118

sudo service stop docker

sudo http_proxy=http://proxy_server:8118 docker -d &

現在終於可以內牛滿面地開始使用docker了,試試:

sudo docker run -i -t ubuntu /bin/bash
至於使用方法,你可以先在官方的模擬器上試一試,然後再到你的真實環境裡照樣做一次,應該就會有實際的體會了。

常用命令:

# 在官方倉庫搜尋image

docker search [...]

docker pull [image]

# 從指定image裡生成乙個container並在其中執行乙個命令

docker run [image] [cmd]

# 在container裡執行互動式命令,比如shell

docker run -i -t [imag] [cmd]

# 在container裡執行後台任務

docker run -d [image] [cmd]

# 列出最近乙個執行過的container,不加-l則只列出正在執行的container(比如後台任務)

docker ps -l

# 列出所有container

docker ps -a

# 檢視container詳情

docker inspect [container_id]

# 刪除某個container,其中container_id不需要輸入完整,只要能保證唯一即可

docker rm [container_id]

# 再次執行某個container

docker start [container_id]

# 檢視某個container的執行日誌

docker logs [container_id]

# 切換到後台任務container,注意:切換到後台任務以後無法用ctrl-c退出

docker attach [container_id]

# 中止後台任務container

docker stop [container_id]

# 將container儲存為乙個image

docker commit [container_id] [image_name]

# 列出當前環境中已有images

docker images

# 將image上傳到倉庫

docker push [image_name]

具有中國特色的docker折騰記(下)

原文 弄明白docker是怎麼回事以後,當然是要來做幾個自己的image。而要自建image,有兩個方法 另乙個方法則是用dockerfile。但本質上兩個方法是一樣的 因為dockerfile的內容不過是一堆的run命令而已 dockerfile的檔名一般就叫做dockerfile,這樣比較方便,...

中國特色的軟體

中國特色的軟體 我們出身在具有5000年歷史的泱泱大國,先人創造出悠久的文明,可卻在最近的200年間快速的衰落,我們在最近的50年的時間裡,開啟國門快速吸收著西方的文明與科技,接受著西方實用技術的錘煉,尋求著中華民族的偉大復興。認清自己,反省自己是乙個刻不容緩的問題。我希望通過我的思考,能讓我們找到...

談談具有中國特色的全能性程式設計師

從嚴格意義上來說,程式設計師是軟體製作中乙個環節,程式設計師有其職能的範圍,他的上層是設計人員所編寫的設計方案,他的下層是測試人員。但是,中國的程式設計師應該來說是很特別的,尤其是中國軟體業發展的初期,許多程式設計師是全能型的,這個程式設計師身兼數職,既是軟體設計人員,又是程式設計師 測試人員。有的...