摘要:的主要作用是自己根據(jù)基礎(chǔ)鏡像,重新定制鏡像,而不是直接從官方倉(cāng)庫(kù)拿現(xiàn)成的使用。以接下來(lái)要構(gòu)建的環(huán)境來(lái)說(shuō)明下,下面我將要搭建一個(gè)的開(kāi)發(fā)環(huán)境,需要進(jìn)行配合。它的主要作用是持久化數(shù)據(jù),避免容器銷(xiāo)毀后內(nèi)部數(shù)據(jù)丟失暴露到宿主機(jī)的端口。
以前一直使用 Vagrant 作為自己的開(kāi)發(fā)環(huán)境,并且在上家公司也推行大家采用 Vagrant 作為開(kāi)發(fā)環(huán)境,保障公司使用的是同一套開(kāi)發(fā)環(huán)境。隨著docker的流行,越來(lái)越多的人在docker上運(yùn)行自己的項(xiàng)目,利用docker也非常方便模擬各種線上集群,相比虛擬機(jī)效率會(huì)更高,不管是搭建還是運(yùn)行。
網(wǎng)絡(luò)上關(guān)于docker搭建環(huán)境的資料非常之多了,但自己一直沒(méi)有進(jìn)行過(guò)實(shí)踐。紙上得來(lái)終覺(jué)淺,只有自己動(dòng)過(guò)手之后,才能對(duì)相關(guān)的概念更熟悉?;藢⒔?天時(shí)間折騰,終于算是把docker的開(kāi)發(fā)環(huán)境搭建好了,對(duì)他的很多概念也又了更深入的認(rèn)識(shí)。整理一下整個(gè)過(guò)程,方便以后查漏補(bǔ)缺。
下面就來(lái)開(kāi)啟docker之旅吧,打算利用docker完成以下任務(wù):
基礎(chǔ)的環(huán)境搭建:MySQL、Redis、Nginx;
搭建PHP、Golang的開(kāi)發(fā)環(huán)境;
搭建MySQL、Redis的主從;
探索一下如何監(jiān)控docker中的進(jìn)程。
涉及的命令介紹這僅僅是操作筆記,不涉及 Docker 原理什么之類(lèi)的知識(shí),重點(diǎn)是如何應(yīng)用。為了后續(xù)理解方便,先把用到的相關(guān)命令在這里進(jìn)行整體介紹。
查找鏡像? ~/home/dockerenv >docker search mysql
上面這個(gè)命令就是查找 mysql 鏡像。對(duì)應(yīng)的可以將 mysql 替換成其它想要查找的鏡像名稱(chēng)。該命令常用選項(xiàng)是: -s。可以設(shè)置搜索條件:多少個(gè)start以上的鏡像。
? ~/home/dockerenv >docker search -s 100 mysql
搜索有100個(gè)以上start的 mysql 鏡像。
獲取鏡像docker pull centos7
這個(gè)命令會(huì)把鏡像克隆到本地,就像:git clone 一樣的效果。關(guān)于什么是鏡像、容器之類(lèi)的概念不在我的講解范疇了。
查看與刪除鏡像? ~/home/dockerenv >docker image ls
會(huì)列出當(dāng)前所有的本地安裝了的鏡像。看到了有哪些鏡像,有時(shí)候一個(gè)鏡像我們用不到了,想把它干掉,為硬盤(pán)騰騰位置,可以用下面的命令:
? ~/home/dockerenv >docker rmi 0d16d0a97dd1 # 編號(hào)是 image id創(chuàng)建鏡像 - Dockerfile
docker的鏡像可以從官方直接拉取,也可也通過(guò) Dockerfile 進(jìn)行定制,寫(xiě)好 Dockerfile 文件后,可以執(zhí)行下面的命令運(yùn)行鏡像。
? ~/home/dockerenv >docker build -t nginx:1.14.0 .
這里的結(jié)尾有個(gè) . 它表示上下文,而不是說(shuō) Dockerfile 的路徑。舉例來(lái)說(shuō),在 Dockerfile 中常常用 Copy 指令,它拷貝的文件必須要在這個(gè)上下文中。
Dockerfile的主要作用是:自己根據(jù)基礎(chǔ)鏡像,重新定制鏡像,而不是直接從官方倉(cāng)庫(kù)拿現(xiàn)成的使用。
具體含義可以看這里:https://yeasy.gitbooks.io/doc...
啟動(dòng)容器? ~/home/dockerenv >docker run -it --rm php:7 bash
上面的命令會(huì)啟動(dòng)一個(gè)容器,并且分配一個(gè)偽終端,退出后容器就會(huì)被刪除。
? ~/home/dockerenv >docker run -d -p 9000:9000 php:7
這個(gè)命令會(huì)在后臺(tái)運(yùn)行一個(gè)容器,此容器不會(huì)因?yàn)橥顺鼍捅粍h除,可以重復(fù)進(jìn)行start、stop操作。
上面兩種容器啟動(dòng)的操作方式,在我的文章中其實(shí)不會(huì)出現(xiàn),我的環(huán)境是基于docker-compose + Dockerfile 來(lái)搭建的。因?yàn)楦鶕?jù)最佳實(shí)踐:一個(gè)容器內(nèi)部只包含一個(gè)進(jìn)程,像上面我需要安裝:PHP/Golang/Redis/Nginx/Mysql等,就算不算主從也需要啟動(dòng)5個(gè)容器,每次這樣啟動(dòng)都要累死,還不說(shuō)需要管理容器之間的互聯(lián)。因此我使用Compose來(lái)定義和運(yùn)行多個(gè) Docker 容器的應(yīng)用。
查看容器信息? ~/home/dockerenv >docker inspect a49dfb2e6f45 # image id
通過(guò)該命令可以看到容器的完整信息,我用這個(gè)命令主要是在進(jìn)行容器互聯(lián)的時(shí)候,檢查容器的網(wǎng)絡(luò)與IP相關(guān)的情況。
進(jìn)入容器? ~/home/dockerenv >docker exec -it e8d740a6ac7a bash # image id
上面的命令可以進(jìn)入容器,讓你感覺(jué)像是 ssh 到了遠(yuǎn)程機(jī)器一樣的感覺(jué)。
停止、啟動(dòng)? ~/home/dockerenv >docker stop a49dfb2e6f45 # image id
如果容器是在后臺(tái)啟動(dòng),可以通過(guò)該方式停止容器。停止后可以使用下面的命令啟動(dòng)容器:
? ~/home/dockerenv >docker start a49dfb2e6f45 # image id查看與刪除容器
容器也可以像鏡像一樣進(jìn)行查看
? ~/home/dockerenv >docker ps
上面的命令只會(huì)顯示啟動(dòng)了的鏡像,如果要查看所有鏡像,可以添加 -a 選項(xiàng)。
如果某個(gè)容器不需要了,可以使用下面的命令進(jìn)行刪除:
? ~/home/dockerenv >docker rm 0d848bc87fe7 # image id
容器的刪除并不會(huì)影響鏡像,鏡像可以繼續(xù)用來(lái)啟動(dòng)新的容器。并且如果依賴某個(gè)鏡像創(chuàng)建的容器沒(méi)有被刪除,該鏡像是不能直接刪除的,需要先刪除容器后才能繼續(xù)刪除鏡像。
Compose 中的啟動(dòng)與停止針對(duì)docker compose啟動(dòng)與停止用到下面的命令,個(gè)人感覺(jué)這就是批量操作,畢竟容器太多,一個(gè)一個(gè)操作太麻煩,容易遺漏等等問(wèn)題。
批量啟動(dòng):
? ~/home/dockerenv >docker-compose up -d
雖然該命令并不是單純的啟動(dòng)容器,它非常強(qiáng)大,將嘗試自動(dòng)完成包括構(gòu)建鏡像,(重新)創(chuàng)建服務(wù),啟動(dòng)服務(wù),并關(guān)聯(lián)服務(wù)相關(guān)容器的一系列操作。
如果已經(jīng)創(chuàng)建完了,也可以用下面的命令來(lái)啟動(dòng)已經(jīng)創(chuàng)建的容器。
? ~/home/dockerenv >docker-compose start
如果想要停止容器可以使用下面的命令:
? ~/home/dockerenv >docker-compose stop
當(dāng)然這些命令的運(yùn)行,要在 docker-compose.yml 文件所在的目錄下運(yùn)行,否則它也不知道該啟動(dòng)或關(guān)閉哪些容器。
基本用到的命令大概就是上面這些,接下來(lái)先說(shuō)說(shuō) docker-compose.yml 文件的編寫(xiě)。
Docker Compose構(gòu)建環(huán)境Docker Compose 可以把多個(gè)容器方便的管理起來(lái),也就是所謂的編排技術(shù)。
編排技術(shù)的核心是 docker-compose.yml 這個(gè)模版文件。它定義了容器集群里每一個(gè)容器的鏡像、數(shù)據(jù)卷掛載路徑、端口、網(wǎng)絡(luò)等。
以接下來(lái)要構(gòu)建的環(huán)境來(lái)說(shuō)明下,下面我將要搭建一個(gè)php7的開(kāi)發(fā)環(huán)境,需要Nginx/PHP-FPM/MySQL/Redis進(jìn)行配合。那么需要啟動(dòng)4個(gè)容器。對(duì)應(yīng)的也需要4個(gè)鏡像。整個(gè)環(huán)境的目錄結(jié)構(gòu)如下:
├── README.md ├── docker-compose.yml ├── logs │?? └── nginx ├── mysql │?? ├── conf │?? └── data ├── nginx │?? ├── Dockerfile │?? ├── conf │?? └── src ├── php7 │?? ├── Dockerfile │?? ├── docker-compose.yml │?? ├── etc │?? ├── extensions │?? └── src ├── redis │?? ├── Dockerfile │?? ├── conf │?? ├── data │?? └── src ├── start.sh ├── stop.sh └── www └── abc
我的MySQL是直接使用的官方提供的鏡像資源,而Redis/Nginx/PHP為了做定制化,我采用Dockerfile進(jìn)行自定義。接下來(lái)按照每一個(gè)獨(dú)立的服務(wù)分別進(jìn)行一下說(shuō)明。
MySQL服務(wù)dev.mysql.srv: image: mysql:5.7.22 volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf:/etc/mysql/conf.d ports: - "3307:3306" restart: always environment: MYSQL_ROOT_PASSWORD: 123123 networks: - default
image:是制定依賴的鏡像,這里是Docker提供的鏡像資源;
volumes:數(shù)據(jù)卷所掛載路徑設(shè)置,主要是MySQL的數(shù)據(jù)保存的路徑設(shè)置與配置文件的設(shè)置。它的主要作用是持久化數(shù)據(jù),避免容器銷(xiāo)毀后內(nèi)部數(shù)據(jù)丟失;
ports:暴露到宿主機(jī)的端口。這個(gè)沒(méi)什么太多說(shuō)的,就是為了可以在宿主機(jī)訪問(wèn)到容器內(nèi)部的服務(wù);
restart:該命令是設(shè)置容器如果在某種情況下(非認(rèn)為)退出了,容器重啟的策略;
environment:設(shè)置鏡像的環(huán)境變量,你可以進(jìn)入鏡像通過(guò):echo $MYSQL_ROOT_PASSWORD 查看其值;
networks:設(shè)置網(wǎng)絡(luò),讓所有的容器在一個(gè)網(wǎng)絡(luò)中,方便容器互聯(lián)互通。
這里還有一個(gè)點(diǎn)需要注意,dev.mysql.srv ,是我為mysql服務(wù)取的名字。取一個(gè)好的名字,非常便于后續(xù)容器互聯(lián)的使用,比如這個(gè)名字,如果php代碼需要填寫(xiě)mysql的host。我則可以直接使用它。
其它服務(wù)剩下的三種服務(wù)配置方式基本上大同小異。我放在一起說(shuō)明。
dev.nginx.srv: image: lei_nginx:1.14.0 build: ./nginx volumes: - ./nginx/conf:/home/work/app/nginx/conf - ./www:/home/work/www ports: - "80:8080" - "443:443" restart: always networks: - default depends_on: - dev.php-fpm.srv dev.redis.srv: image: lei_redis:3.2.11 build: ./redis volumes: - ./redis/conf:/home/work/app/redis/conf - ./redis/data:/home/work/app/redis/data ports: - "6379:6379" restart: always networks: - default dev.php-fpm.srv: image: lei_php:7.2.6 build: ./php7 volumes: - ./php7/etc:/home/work/app/php/etc - ./www:/home/work/www ports: - "9000:9000" restart: always networks: - default
這里與MySQL最大的一個(gè)區(qū)別是多了一個(gè) build 選項(xiàng)。這就是上面說(shuō)到的這三個(gè)鏡像都是我用Dockerfile定制的有關(guān)。你可以在對(duì)應(yīng)的 build 指定的目錄下看到 Dockerfile 這個(gè)文件。
另外一個(gè)需要注意的地方是Nginx中配置的 depends_on 選項(xiàng),他的作用是指定依賴,因?yàn)镹ginx中我配置了php-fpm。所以它啟動(dòng)前要確保php-fpm已經(jīng)啟動(dòng)后,他才能正常的啟動(dòng)。
啟動(dòng)為了減少太多概念的東西,你可以先直接從github拉取這部分配置,然后運(yùn)行
? ~/home/dockerenv >./start.sh Starting dockerenv_dev.php-fpm.srv_1 ... done Starting dockerenv_dev.redis.srv_1 ... done Starting dockerenv_dev.mysql.srv_1 ... done Creating dockerenv_dev.nginx.srv_1 ... done
如果你是第一次運(yùn)行 start.sh ,他還會(huì)去docker hub上拉取鏡像,以及根據(jù)Dockerfile來(lái)定制鏡像。所以會(huì)有非常多的輸出信息。
然后訪問(wèn):http://localhost 。應(yīng)該就能夠看到 phpinfo() 輸出的信息。
總結(jié)經(jīng)過(guò)自己的熟悉,對(duì)基本的docker命令,以及docker的三個(gè)基礎(chǔ)概念:倉(cāng)庫(kù)、鏡像、容器有了充分的認(rèn)識(shí)。利用 docker compose 搭建一個(gè)環(huán)境后,對(duì)于容器的互聯(lián)也有了更深刻的體會(huì),并且經(jīng)過(guò)這種一個(gè)容器運(yùn)行一個(gè)進(jìn)程的方式,對(duì)系統(tǒng)也有了一些更深的認(rèn)識(shí)。在利用Dockerfile定制鏡像的過(guò)程中,通過(guò)反復(fù)的 build 鏡像,對(duì)理解容器的分層、如何確保鏡像體積更小方面有了相當(dāng)多的實(shí)踐,特別是在ENTRYPOINT的設(shè)置上,認(rèn)識(shí)到了docker的啟動(dòng)流程。
由于篇幅限制,把 Dockerfile 的內(nèi)容在拆出一篇來(lái)進(jìn)行說(shuō)明,以及把遇到的一些問(wèn)題也進(jìn)行一些整理。
我的docker環(huán)境:https://github.com/helei112g/...
以后換機(jī)裝換機(jī),再也不擔(dān)心了
微信公眾號(hào):
參考資料:
https://yeasy.gitbooks.io/doc...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39982.html
摘要:的主要作用是自己根據(jù)基礎(chǔ)鏡像,重新定制鏡像,而不是直接從官方倉(cāng)庫(kù)拿現(xiàn)成的使用。以接下來(lái)要構(gòu)建的環(huán)境來(lái)說(shuō)明下,下面我將要搭建一個(gè)的開(kāi)發(fā)環(huán)境,需要進(jìn)行配合。它的主要作用是持久化數(shù)據(jù),避免容器銷(xiāo)毀后內(nèi)部數(shù)據(jù)丟失暴露到宿主機(jī)的端口。 以前一直使用 Vagrant 作為自己的開(kāi)發(fā)環(huán)境,并且在上家公司也推行大家采用 Vagrant 作為開(kāi)發(fā)環(huán)境,保障公司使用的是同一套開(kāi)發(fā)環(huán)境。隨著docker的流...
摘要:上一篇文章對(duì)整體結(jié)構(gòu)進(jìn)行了簡(jiǎn)單記錄,這一篇介紹下關(guān)于自定義鏡像以及各個(gè)服務(wù)的配置。在選擇基礎(chǔ)鏡像方面,推薦使用,然后再它上面進(jìn)行定制,因?yàn)樗浅5男H。 上一篇文章對(duì)整體結(jié)構(gòu)進(jìn)行了簡(jiǎn)單記錄,這一篇介紹下關(guān)于Dockerfile自定義鏡像以及各個(gè)服務(wù)的配置。 其實(shí) https://hub.docker.com/ 上面各種基礎(chǔ)鏡像非常完善,特別是官方的鏡像質(zhì)量非常之高,而我再搗騰一次完全是...
摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。必填用于執(zhí)行命令,當(dāng)執(zhí)行完畢后,將產(chǎn)生一個(gè)新的文件層??蛇x指定此鏡像啟動(dòng)時(shí)默認(rèn)執(zhí)行命令。可選用于指定需要暴露的網(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...
摘要:如果不用我們可能將上述講的命令每搭建一次就需要執(zhí)行一遍,有沒(méi)有能統(tǒng)一管理的有,就是在環(huán)境搭建中的作用快速創(chuàng)建鏡像,快速創(chuàng)建并運(yùn)行容器,實(shí)現(xiàn)統(tǒng)一管理。 前言 初學(xué)者在dcoker學(xué)習(xí)過(guò)程中,可能不太清楚docker中那么多的命令,參數(shù),工具在lnmp環(huán)境搭建中起了什么作用,下面跟著我來(lái)熟悉一下。(本文面向的是不怎么熟悉linux的:phper) 鏡像,容器,倉(cāng)庫(kù) 鏡像:Docker 鏡像...
閱讀 2926·2021-11-19 09:40
閱讀 3610·2021-10-09 09:43
閱讀 2688·2021-09-22 15:31
閱讀 1741·2021-07-30 15:31
閱讀 798·2019-08-30 15:55
閱讀 3274·2019-08-30 15:54
閱讀 1175·2019-08-30 11:26
閱讀 1923·2019-08-29 13:00