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