摘要:最近很火,所以,也跟著未來(lái)的大趨勢(shì)學(xué)下,并將應(yīng)用到項(xiàng)目開(kāi)發(fā)中。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口類似的更重要的是容器性能開(kāi)銷極低。在中搜索搜索的范圍是官方鏡像和所有個(gè)人公共鏡像。的應(yīng)用都是以這種格式發(fā)布到倉(cāng)庫(kù)中,供大家使用。
Docker 最近很火,所以,也跟著未來(lái)的大趨勢(shì)學(xué)下docker,并將docker 應(yīng)用到項(xiàng)目開(kāi)發(fā)中。一、什么是docker
Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,基于 Go 語(yǔ)言 并遵從Apache2.0協(xié)議開(kāi)源。Docker 可以讓開(kāi)發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。
容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類似 iPhone 的 app),更重要的是容器性能開(kāi)銷極低。
那么應(yīng)用容器長(zhǎng)什么樣子呢,一個(gè)做好的應(yīng)用容器長(zhǎng)得就好像一個(gè)裝好了一組特定應(yīng)用的虛擬機(jī)一樣。比如我現(xiàn)在想用MySQL那我就找個(gè)裝好MySQL的容器,運(yùn)行起來(lái),那么我就可以使用 MySQL了。
那么我直接裝個(gè) MySQL不就好了,何必還需要這個(gè)容器這么詭異的概念?話是這么說(shuō),可是你要真裝MySQL的話可能要再裝一堆依賴庫(kù),根據(jù)你的操作系統(tǒng)平臺(tái)和版本進(jìn)行設(shè)置,有時(shí)候還要從源代碼編譯報(bào)出一堆莫名其妙的錯(cuò)誤,可不是這么好裝。而且萬(wàn)一你機(jī)器掛了,所有的東西都要重新來(lái),可能還要把配置在重新弄一遍。但是有了容器,你就相當(dāng)于有了一個(gè)可以運(yùn)行起來(lái)的虛擬機(jī),只要你能運(yùn)行容器,MySQL的配置就全省了。而且一旦你想換臺(tái)機(jī)器,直接把這個(gè)容器端起來(lái),再放到另一個(gè)機(jī)器就好了。硬件,操作系統(tǒng),運(yùn)行環(huán)境什么的都不需要考慮了。
在公司中的一個(gè)很大的用途就是可以保證線下的開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境和線上的生產(chǎn)環(huán)境一致。當(dāng)年在 Baidu 經(jīng)常碰到這樣的事情,開(kāi)發(fā)把東西做好了給測(cè)試去測(cè),一般會(huì)給一坨代碼和一個(gè)介紹上線步驟的上線單。結(jié)果代碼在測(cè)試機(jī)跑不起來(lái),開(kāi)發(fā)就跑來(lái)跑去看問(wèn)題,一會(huì)兒啊這個(gè)配置文件忘了提交了,一會(huì)兒啊這個(gè)上線命令寫(xiě)錯(cuò)了。找到了一個(gè) bug 提上去,開(kāi)發(fā)一看,啊我怎么又忘了把這個(gè)命令寫(xiě)在上線單上了。類似的事情在上線的時(shí)候還會(huì)發(fā)生,變成啊你這個(gè)軟件的版本和我機(jī)器上的不一樣……在 Amazon 的時(shí)候,由于一個(gè)開(kāi)發(fā)直接擔(dān)任上述三個(gè)職位,而且有一套自動(dòng)化部署的機(jī)制所以問(wèn)題會(huì)少一點(diǎn),但是上線的時(shí)候大家還是膽戰(zhàn)心驚。
若果利用容器的話,那么開(kāi)發(fā)直接在容器里開(kāi)發(fā),提測(cè)的時(shí)候把整個(gè)容器給測(cè)試,測(cè)好了把改動(dòng)改在容器里再上線就好了。通過(guò)容器,整個(gè)開(kāi)發(fā)、測(cè)試和生產(chǎn)環(huán)境可以保持高度的一致。
此外容器也和VM一樣具有著一定的隔離性,各個(gè)容器之間的數(shù)據(jù)和內(nèi)存空間相互隔離,可以保證一定的安全性。
三、安裝docker在 ubuntu 下使用 curl 命令進(jìn)行安裝
sudo apt install -y curl;
sudo curl -sSL https://get.docker.com/ | sh;
windows 安裝請(qǐng)參考 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]
鏡像倉(cāng)庫(kù) — docker [login|pull|push|search]
本地鏡像管理 — docker [images|rmi|tag|build|history|save|import]
其他命令 — docker [info|version]
docker images
其中我們可以根據(jù)REPOSITORY來(lái)判斷這個(gè)鏡像是來(lái)自哪個(gè)服務(wù)器,如果沒(méi)有 / 則表示官方鏡像,類似于username/repos_name表示Github的個(gè)人公共庫(kù),類似于regsistory.example.com:5000/repos_name則表示的是私服。
IMAGE ID列其實(shí)是縮寫(xiě),要顯示完整則帶上--no-trunc選項(xiàng)。
搜索的范圍是官方鏡像和所有個(gè)人公共鏡像。NAME列的 / 后面是倉(cāng)庫(kù)的名字。
docker search sameersbn3、從docker registry server 中下拉image或repository(pull)
Usage: docker pull [OPTIONS] NAME[:TAG]
上面的命令需要注意,在docker v1.2版本以前,會(huì)下載官方鏡像的centos倉(cāng)庫(kù)里的所有鏡像,而從v.13開(kāi)始官方文檔里的說(shuō)明變了:will pull the centos:latest image, its intermediate layers and any aliases of the same id,也就是只會(huì)下載tag為latest的鏡像(以及同一images id的其他tag)。
也可以明確指定具體的鏡像:
docker run 命令首先會(huì)從特定的image創(chuàng)之上create一層可寫(xiě)的container,然后通過(guò)start命令來(lái)啟動(dòng)它。停止的container可以重新啟動(dòng)并保留原來(lái)的修改。run命令啟動(dòng)參數(shù)有很多,以下是一些常規(guī)使用說(shuō)明,更多部分請(qǐng)參考http://www.cnphp6.com/archive...
當(dāng)利用 docker run 來(lái)創(chuàng)建容器時(shí),Docker 在后臺(tái)運(yùn)行的標(biāo)準(zhǔn)操作包括:
檢查本地是否存在指定的鏡像,不存在就從公有倉(cāng)庫(kù)下載
利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器
分配一個(gè)文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫(xiě)層
從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中去
從地址池配置一個(gè) ip 地址給容器
執(zhí)行用戶指定的應(yīng)用程序
執(zhí)行完畢后容器被終止
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
啟動(dòng)一個(gè)本地鏡像:鏡像名REPOSITORY+鏡像TAG
> docker run -d sameersbn/postgresql:9.6-2 e527ef6698ea52bb78803facd5d2a6a8cbcdeb98ba052b3a0cdf78478d9acc535、停止運(yùn)行容器
根據(jù)容器IDCONTAINER ID來(lái)使運(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
或者使用容器的別名來(lái)啟動(dòng):
docker start MyWordPress
更多命令請(qǐng)看:docker常用命令詳解
四、幾個(gè)重要的概念在使用docker時(shí),我們得先弄清楚docker的幾個(gè)重要的名詞。
Docker生態(tài)Docker生態(tài)就像 iPhone 的生態(tài)一樣,Docker倉(cāng)庫(kù)相當(dāng)于 IPhone 的 App Store,docker自身程序相當(dāng)于IOS系統(tǒng)。
鏡像與容器鏡像(image):指的是以分層的、可以被 LXC/libcontainer 理解的文件存儲(chǔ)格式。Docker的應(yīng)用都是以這種格式發(fā)布到Docker倉(cāng)庫(kù)中,供大家使用。
容器(container):把應(yīng)用鏡像從 Docker 倉(cāng)庫(kù)下載到本地機(jī)器上,以鏡像為模板,在一個(gè)容器類虛擬機(jī)中把這個(gè)應(yīng)用啟動(dòng),這個(gè)虛擬機(jī)叫做容器。
可以先簡(jiǎn)單的理解,倉(cāng)庫(kù)中的應(yīng)用都以鏡像存在,從倉(cāng)庫(kù)中拉取鏡像到本地的,叫容器。
五、安裝鏡像docker-gitlabgitlab環(huán)境配置要求比較高,可用內(nèi)存必須2G以上,2核CPU,否則跑不起來(lái)。
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,安裝好之后,我們可以通過(guò)命令來(lái)查看 docker 進(jìn)程
docker ps
再次啟動(dòng)容器命令:
前邊我們已經(jīng)安裝鏡像到本地,如果關(guān)閉docker服務(wù)之后,容器就會(huì)停止運(yùn)行,再次啟動(dòng)docker之后,我們不需要再次使用 docker run -d images,而只需啟動(dòng)容器即可。
docker ps:查看運(yùn)行的容器。
docker ps -a:查看所有已經(jīng)安裝的容器
開(kāi)啟容器:
docker start gitlab-postgresql2.測(cè)試gitlab
使用 ifconfig 命令查看本機(jī)IP,因?yàn)間itlab默認(rèn)的服務(wù)為 10080,所以,我們可以根據(jù)我們的IP和端口訪問(wèn)到gitlab服務(wù):http://192.168.1.101:10080/
gitlab頁(yè)面:
在 gitlab 上新建一個(gè) test 測(cè)試庫(kù):
使用 docker 搭建 gitlab服務(wù)是不是超級(jí)方便,不用做什么配置^_^。
相關(guān)文章:GitLab的簡(jiǎn)單使用
六、項(xiàng)目管理系統(tǒng)RedmineRedmine 是一套跨平臺(tái)的管理系統(tǒng),它通過(guò)“項(xiàng)目(project)”的形式把成員、任務(wù)(問(wèn)題)、文檔、討論及各種形式的資源整合在一起,大家參與更新任務(wù)、文檔等內(nèi)容來(lái)推動(dòng)項(xiàng)目的進(jìn)度,另外,它還集成了wiki文檔、版本控制、bug跟蹤等功能。
1.搭建Redmine服務(wù)在這里,我們使用 sameersbn/docker-redmine 鏡像,項(xiàng)目地址為:https://github.com/sameersbn/...。
拉取鏡像:
docker pull sameersbn/redmine:latest
快讀啟動(dòng):
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.測(cè)試
Redmine
Docker指令中,我們把Redmine的對(duì)外服務(wù)端口映射到10083,所以,我們可以通過(guò)
訪問(wèn)該地址:http://192.168.1.101:10083/,查看該服務(wù)是否安裝成功。
安裝成功,^_^
七、docker容器名稱沖突我們使用ps -a這個(gè)命令,我們可以觀察到gitlab-postgresql的狀態(tài)為已經(jīng)存在了。
我們用rm命令刪除這個(gè)容器,如下面命令所示:
sudo docker rm gitlab-postgresql
重新建立gitlab-postgresql這個(gè)容器:
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 容器名稱沖突問(wèn)題解決
八、掛載目錄使用鏡像 nginx:latest,以后臺(tái)模式啟動(dòng)一個(gè)容器,將容器的 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
如果直接掛載會(huì)報(bào)出這樣的錯(cuò)誤:
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掛載目錄時(shí),需要先在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前幾位,通過(guò)上邊的命令即可進(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)境下重啟容器或整個(gè)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í)例的時(shí)候會(huì)拷貝宿主機(jī)的到容器里邊,如果宿主機(jī)的DNS改變了,則需要重新加載容器的)
[root@bfc6f9d528a5 /]# cat /etc/resolv.conf
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/27133.html
摘要:當(dāng)前版本針對(duì)于安裝版概要整體流程貫通,基本可以達(dá)到實(shí)用級(jí)別。仍舊有很多需要提高的地方發(fā)布構(gòu)建時(shí)部署上線服務(wù)器卡頓嚴(yán)重,基本不可以多項(xiàng)目發(fā)布。 該文章旨在描述從零開(kāi)始搭建環(huán)境,中間遇到的問(wèn)題以及最終的經(jīng)驗(yàn)總結(jié)。當(dāng)前版本針對(duì)于2.0 docker安裝版 概要 整體流程貫通,基本可以達(dá)到實(shí)用級(jí)別。滿足2-5臺(tái)服務(wù)器,少量的應(yīng)用部署是完全可以的,但達(dá)到一定規(guī)模之后則Walle和Jenkins...
摘要:安裝環(huán)境后,從官網(wǎng)下載。配置首先更換下鏡像源,國(guó)內(nèi)的網(wǎng)絡(luò)情況得適應(yīng),建議使用阿里云鏡像。到阿里云官網(wǎng)注冊(cè)個(gè)賬戶,有就直接進(jìn)入控制臺(tái)。 showImg(https://segmentfault.com/img/remote/1460000013793047); 在上一篇[[.net core項(xiàng)目實(shí)戰(zhàn)之回顧總結(jié)]](http://www.bug2048.com/netcor...,從本篇開(kāi)...
摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。必填用于執(zhí)行命令,當(dāng)執(zhí)行完畢后,將產(chǎn)生一個(gè)新的文件層??蛇x指定此鏡像啟動(dòng)時(shí)默認(rèn)執(zhí)行命令??蛇x用于指定需要暴露的網(wǎng)絡(luò)端口號(hào)??蛇x向鏡像中掛載一個(gè)卷組。 時(shí)間:2017年09月16日星期六說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com 教學(xué)源碼:無(wú) 學(xué)習(xí)源碼:無(wú) 第一章:課程簡(jiǎn)介 1-1 課程介紹 Docke...
閱讀 1998·2021-11-24 09:39
閱讀 992·2021-11-11 16:55
閱讀 1448·2021-10-09 09:43
閱讀 1434·2021-10-08 10:17
閱讀 1667·2021-08-25 09:41
閱讀 438·2019-08-30 13:02
閱讀 641·2019-08-29 15:14
閱讀 1017·2019-08-29 13:53