摘要:最近很火,所以,也跟著未來的大趨勢學(xué)下,并將應(yīng)用到項(xiàng)目開發(fā)中。容器是完全使用沙箱機(jī)制,相互之間不會有任何接口類似的更重要的是容器性能開銷極低。在中搜索搜索的范圍是官方鏡像和所有個人公共鏡像。的應(yīng)用都是以這種格式發(fā)布到倉庫中,供大家使用。
Docker 最近很火,所以,也跟著未來的大趨勢學(xué)下docker,并將docker 應(yīng)用到項(xiàng)目開發(fā)中。一、什么是docker
Docker 是一個開源的應(yīng)用容器引擎,基于 Go 語言 并遵從Apache2.0協(xié)議開源。Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。
容器是完全使用沙箱機(jī)制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
那么應(yīng)用容器長什么樣子呢,一個做好的應(yīng)用容器長得就好像一個裝好了一組特定應(yīng)用的虛擬機(jī)一樣。比如我現(xiàn)在想用MySQL那我就找個裝好MySQL的容器,運(yùn)行起來,那么我就可以使用 MySQL了。
那么我直接裝個 MySQL不就好了,何必還需要這個容器這么詭異的概念?話是這么說,可是你要真裝MySQL的話可能要再裝一堆依賴庫,根據(jù)你的操作系統(tǒng)平臺和版本進(jìn)行設(shè)置,有時候還要從源代碼編譯報(bào)出一堆莫名其妙的錯誤,可不是這么好裝。而且萬一你機(jī)器掛了,所有的東西都要重新來,可能還要把配置在重新弄一遍。但是有了容器,你就相當(dāng)于有了一個可以運(yùn)行起來的虛擬機(jī),只要你能運(yùn)行容器,MySQL的配置就全省了。而且一旦你想換臺機(jī)器,直接把這個容器端起來,再放到另一個機(jī)器就好了。硬件,操作系統(tǒng),運(yùn)行環(huán)境什么的都不需要考慮了。
在公司中的一個很大的用途就是可以保證線下的開發(fā)環(huán)境、測試環(huán)境和線上的生產(chǎn)環(huán)境一致。當(dāng)年在 Baidu 經(jīng)常碰到這樣的事情,開發(fā)把東西做好了給測試去測,一般會給一坨代碼和一個介紹上線步驟的上線單。結(jié)果代碼在測試機(jī)跑不起來,開發(fā)就跑來跑去看問題,一會兒啊這個配置文件忘了提交了,一會兒啊這個上線命令寫錯了。找到了一個 bug 提上去,開發(fā)一看,啊我怎么又忘了把這個命令寫在上線單上了。類似的事情在上線的時候還會發(fā)生,變成啊你這個軟件的版本和我機(jī)器上的不一樣……在 Amazon 的時候,由于一個開發(fā)直接擔(dān)任上述三個職位,而且有一套自動化部署的機(jī)制所以問題會少一點(diǎn),但是上線的時候大家還是膽戰(zhàn)心驚。
若果利用容器的話,那么開發(fā)直接在容器里開發(fā),提測的時候把整個容器給測試,測好了把改動改在容器里再上線就好了。通過容器,整個開發(fā)、測試和生產(chǎn)環(huán)境可以保持高度的一致。
此外容器也和VM一樣具有著一定的隔離性,各個容器之間的數(shù)據(jù)和內(nèi)存空間相互隔離,可以保證一定的安全性。
三、安裝docker在 ubuntu 下使用 curl 命令進(jìn)行安裝
sudo apt install -y curl;
sudo curl -sSL https://get.docker.com/ | sh;
windows 安裝請參考 docker 官網(wǎng)。
docker常用命令容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
容器操作運(yùn)維 — docker [ps|inspect|top|attach|events|logs|wait|export|port]
容器rootfs命令 — docker [commit|cp|diff]
鏡像倉庫 — docker [login|pull|push|search]
本地鏡像管理 — docker [images|rmi|tag|build|history|save|import]
其他命令 — docker [info|version]
docker images
其中我們可以根據(jù)REPOSITORY來判斷這個鏡像是來自哪個服務(wù)器,如果沒有 / 則表示官方鏡像,類似于username/repos_name表示Github的個人公共庫,類似于regsistory.example.com:5000/repos_name則表示的是私服。
IMAGE ID列其實(shí)是縮寫,要顯示完整則帶上--no-trunc選項(xiàng)。
搜索的范圍是官方鏡像和所有個人公共鏡像。NAME列的 / 后面是倉庫的名字。
docker search sameersbn3、從docker registry server 中下拉image或repository(pull)
Usage: docker pull [OPTIONS] NAME[:TAG]
上面的命令需要注意,在docker v1.2版本以前,會下載官方鏡像的centos倉庫里的所有鏡像,而從v.13開始官方文檔里的說明變了:will pull the centos:latest image, its intermediate layers and any aliases of the same id,也就是只會下載tag為latest的鏡像(以及同一images id的其他tag)。
也可以明確指定具體的鏡像:
docker run 命令首先會從特定的image創(chuàng)之上create一層可寫的container,然后通過start命令來啟動它。停止的container可以重新啟動并保留原來的修改。run命令啟動參數(shù)有很多,以下是一些常規(guī)使用說明,更多部分請參考http://www.cnphp6.com/archive...
當(dāng)利用 docker run 來創(chuàng)建容器時,Docker 在后臺運(yùn)行的標(biāo)準(zhǔn)操作包括:
檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
利用鏡像創(chuàng)建并啟動一個容器
分配一個文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫層
從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中去
從地址池配置一個 ip 地址給容器
執(zhí)行用戶指定的應(yīng)用程序
執(zhí)行完畢后容器被終止
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
啟動一個本地鏡像:鏡像名REPOSITORY+鏡像TAG
> docker run -d sameersbn/postgresql:9.6-2 e527ef6698ea52bb78803facd5d2a6a8cbcdeb98ba052b3a0cdf78478d9acc535、停止運(yùn)行容器
根據(jù)容器IDCONTAINER ID來使運(yùn)行的容器停止 docker stop CONTAINER ID。
? docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f72ed57c80f8 sameersbn/redis:latest "/sbin/entrypoint.sh" 8 minutes ago Up 8 minutes 6379/tcp wonderful_bassi e527ef6698ea sameersbn/postgresql:9.6-2 "/sbin/entrypoint.sh" 14 minutes ago Up 13 minutes 5432/tcp pensive_keller ? docker stop f72ed57c80f8
或者使用容器的別名來啟動:
docker start MyWordPress
更多命令請看:docker常用命令詳解
四、幾個重要的概念在使用docker時,我們得先弄清楚docker的幾個重要的名詞。
Docker生態(tài)Docker生態(tài)就像 iPhone 的生態(tài)一樣,Docker倉庫相當(dāng)于 IPhone 的 App Store,docker自身程序相當(dāng)于IOS系統(tǒng)。
鏡像與容器鏡像(image):指的是以分層的、可以被 LXC/libcontainer 理解的文件存儲格式。Docker的應(yīng)用都是以這種格式發(fā)布到Docker倉庫中,供大家使用。
容器(container):把應(yīng)用鏡像從 Docker 倉庫下載到本地機(jī)器上,以鏡像為模板,在一個容器類虛擬機(jī)中把這個應(yīng)用啟動,這個虛擬機(jī)叫做容器。
可以先簡單的理解,倉庫中的應(yīng)用都以鏡像存在,從倉庫中拉取鏡像到本地的,叫容器。
五、安裝鏡像docker-gitlabgitlab環(huán)境配置要求比較高,可用內(nèi)存必須2G以上,2核CPU,否則跑不起來。
1.安裝gitlab 鏡像地址:docker-gitlab
Step 1. Launch a postgresql container
docker run --name gitlab-postgresql -d --env "DB_NAME=gitlabhq_production" --env "DB_USER=gitlab" --env "DB_PASS=password" --env "DB_EXTENSION=pg_trgm" --volume $HOME/docker/gitlab/postgresql:/var/lib/postgresql sameersbn/postgresql:9.6-2
Step 2. Launch a redis container
docker run --name gitlab-redis -d --volume $HOME/docker/gitlab/redis:/var/lib/redis sameersbn/redis:latest
Step 3. Launch the gitlab container
docker run --name gitlab -d --link gitlab-postgresql:postgresql --link gitlab-redis:redisio --publish 10022:22 --publish 10080:80 --env "GITLAB_PORT=10080" --env "GITLAB_SSH_PORT=10022" --env "GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string" --env "GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alpha-numeric-string" --env "GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alpha-numeric-string" --volume $HOME/docker/gitlab/gitlab:/home/git/data sameersbn/gitlab:10.2.2
--volume 方法解釋:
--volume $HOME/docker/gitlab/postgresql:/var/lib/postgresql
? ~ echo $HOME /Users/kaiyiwang
注意: --volume $HOME/docker 是宿主機(jī)的環(huán)境,/var/lib/為容器環(huán)境.
OK,安裝好之后,我們可以通過命令來查看 docker 進(jìn)程
docker ps
再次啟動容器命令:
前邊我們已經(jīng)安裝鏡像到本地,如果關(guān)閉docker服務(wù)之后,容器就會停止運(yùn)行,再次啟動docker之后,我們不需要再次使用 docker run -d images,而只需啟動容器即可。
docker ps:查看運(yùn)行的容器。
docker ps -a:查看所有已經(jīng)安裝的容器
開啟容器:
docker start gitlab-postgresql2.測試gitlab
使用 ifconfig 命令查看本機(jī)IP,因?yàn)間itlab默認(rèn)的服務(wù)為 10080,所以,我們可以根據(jù)我們的IP和端口訪問到gitlab服務(wù):http://192.168.1.101:10080/
gitlab頁面:
在 gitlab 上新建一個 test 測試庫:
使用 docker 搭建 gitlab服務(wù)是不是超級方便,不用做什么配置^_^。
相關(guān)文章:GitLab的簡單使用
六、項(xiàng)目管理系統(tǒng)RedmineRedmine 是一套跨平臺的管理系統(tǒng),它通過“項(xiàng)目(project)”的形式把成員、任務(wù)(問題)、文檔、討論及各種形式的資源整合在一起,大家參與更新任務(wù)、文檔等內(nèi)容來推動項(xiàng)目的進(jìn)度,另外,它還集成了wiki文檔、版本控制、bug跟蹤等功能。
1.搭建Redmine服務(wù)在這里,我們使用 sameersbn/docker-redmine 鏡像,項(xiàng)目地址為:https://github.com/sameersbn/...。
拉取鏡像:
docker pull sameersbn/redmine:latest
快讀啟動:
Step 1. Launch a postgresql container
docker run --name=postgresql-redmine -d --env="DB_NAME=redmine_production" --env="DB_USER=redmine" --env="DB_PASS=password" --volume=$HOME/docker/redmine/postgresql:/var/lib/postgresql sameersbn/postgresql:9.6-2
Step 2. Launch the redmine container
docker run --name=redmine -d --link=postgresql-redmine:postgresql --publish=10083:80 --env="REDMINE_PORT=10083" --volume=$HOME/docker/redmine/redmine:/home/redmine/data sameersbn/redmine:latest2.測試
Redmine
Docker指令中,我們把Redmine的對外服務(wù)端口映射到10083,所以,我們可以通過
訪問該地址:http://192.168.1.101:10083/,查看該服務(wù)是否安裝成功。
安裝成功,^_^
七、docker容器名稱沖突我們使用ps -a這個命令,我們可以觀察到gitlab-postgresql的狀態(tài)為已經(jīng)存在了。
我們用rm命令刪除這個容器,如下面命令所示:
sudo docker rm gitlab-postgresql
重新建立gitlab-postgresql這個容器:
docker run --name gitlab-postgresql -d --env "DB_NAME=gitlabhq_production" --env "DB_USER=gitlab" --env "DB_PASS=password" --env "DB_EXTENSION=pg_trgm" --volume $HOME/docker/gitlab/postgresql:/var/lib/postgresql sameersbn/postgresql:9.6-2
docker 容器名稱沖突問題解決
八、掛載目錄使用鏡像 nginx:latest,以后臺模式啟動一個容器,將容器的 80 端口映射到主機(jī)的 80 端口,主機(jī)的目錄 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
將Mac的本地目錄掛栽倒容器tensorflow/tensorflow的/notebooks目錄
docker run -it -v /Users/kaiyiwang/Code/ai/notebooks:/notebooks -d tensorflow/tensorflow
如果直接掛載會報(bào)出這樣的錯誤:
44a574c965c83688221798c5d70fff2a7badd3aad04dd071246d8f487bda5225 docker: Error response from daemon: Mounts denied: The path /AI/tensorflow is not shared from OS X and is not known to Docker. You can configure shared paths from Docker -> Preferences... -> File Sharing. See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
在mac上面使用Docker掛載目錄時,需要先在Docker->preference中添加該目錄,才能進(jìn)行掛載!
再重試一次掛載:
? tensorflow docker run -it -v /Users/kaiyiwang/Code/ai/notebooks:/notebooks -d tensorflow/tensorflow d1fceb76e44c4050c878a6ce996f59d8252c59d082293674db2ac043e8607f14 ? tensorflow
可以看到掛載成功
九、進(jìn)入容器內(nèi)部// 進(jìn)入容器內(nèi)部 sudo docker exec -it c7efe /bin/bash
c7efe 為容器ID前幾位,通過上邊的命令即可進(jìn)入容器內(nèi)部。
進(jìn)入jupyter? tensorflow docker exec -it c7efe /bin/bash root@c7efe77f377a:/notebooks# root@c7efe77f377a:/notebooks# jupyter notebook list Currently running servers: http://localhost:8888/?token=44077e3f129fdbf0b26676b5414a36ce8b6a56627ad84a6e :: /notebooks root@c7efe77f377a:/notebooks#十、Docker重啟
在宿主機(jī)環(huán)境下重啟容器或整個docker
[corwien@lnp php_log]$ sudo docker ps # 查看docker進(jìn)程 [corwien@lnp php_log]$ sudo docker restart bfc6 # docker 容器重啟 # service docker restart sudo systemctl restart docker 如果網(wǎng)絡(luò)斷了,則重啟docker就可以了
查看DNS(docker容器在創(chuàng)建實(shí)例的時候會拷貝宿主機(jī)的到容器里邊,如果宿主機(jī)的DNS改變了,則需要重新加載容器的)
[root@bfc6f9d528a5 /]# cat /etc/resolv.conf
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/27133.html
摘要:當(dāng)前版本針對于安裝版概要整體流程貫通,基本可以達(dá)到實(shí)用級別。仍舊有很多需要提高的地方發(fā)布構(gòu)建時部署上線服務(wù)器卡頓嚴(yán)重,基本不可以多項(xiàng)目發(fā)布。 該文章旨在描述從零開始搭建環(huán)境,中間遇到的問題以及最終的經(jīng)驗(yàn)總結(jié)。當(dāng)前版本針對于2.0 docker安裝版 概要 整體流程貫通,基本可以達(dá)到實(shí)用級別。滿足2-5臺服務(wù)器,少量的應(yīng)用部署是完全可以的,但達(dá)到一定規(guī)模之后則Walle和Jenkins...
摘要:安裝環(huán)境后,從官網(wǎng)下載。配置首先更換下鏡像源,國內(nèi)的網(wǎng)絡(luò)情況得適應(yīng),建議使用阿里云鏡像。到阿里云官網(wǎng)注冊個賬戶,有就直接進(jìn)入控制臺。 showImg(https://segmentfault.com/img/remote/1460000013793047); 在上一篇[[.net core項(xiàng)目實(shí)戰(zhàn)之回顧總結(jié)]](http://www.bug2048.com/netcor...,從本篇開...
摘要:時間年月日星期六說明本文部分內(nèi)容均來自慕課網(wǎng)。必填用于執(zhí)行命令,當(dāng)執(zhí)行完畢后,將產(chǎn)生一個新的文件層。可選指定此鏡像啟動時默認(rèn)執(zhí)行命令。可選用于指定需要暴露的網(wǎng)絡(luò)端口號。可選向鏡像中掛載一個卷組。 時間:2017年09月16日星期六說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com 教學(xué)源碼:無 學(xué)習(xí)源碼:無 第一章:課程簡介 1-1 課程介紹 Docke...
閱讀 1983·2021-11-24 09:39
閱讀 978·2021-11-11 16:55
閱讀 1425·2021-10-09 09:43
閱讀 1415·2021-10-08 10:17
閱讀 1648·2021-08-25 09:41
閱讀 420·2019-08-30 13:02
閱讀 627·2019-08-29 15:14
閱讀 1001·2019-08-29 13:53