序言
從docker的出現(xiàn)以來乎赴,它就成為了互聯(lián)網(wǎng)公司的寵兒。換句話說現(xiàn)在牛逼的互聯(lián)網(wǎng)公司的架構(gòu)系統(tǒng)不使用在 Docker之上都不好意思說自己是一個(gè)純粹的互聯(lián)網(wǎng)公司官觅。
本文章會帶領(lǐng)大家了解 Docker 的基礎(chǔ)概念件缸,使用方式和一些使用docker的場景房蝉。
什么是docker?
或許很多同學(xué)都玩過例如這些大名鼎鼎的東西公荧,如:Oracle VM?VirtualBox,VMware Workstation同规。大家都會說這不就是虛擬機(jī)嘛循狰,是的,這些都是業(yè)界大牛公司搞出來虛擬化技術(shù)券勺。用過的同學(xué)都說绪钥,這docker和它們都沒什么區(qū)別,感覺都是虛擬機(jī)关炼。雖然在一定程度上它們的確很類似程腹,但我們不能把docker當(dāng)作是虛擬機(jī),怎么說呢儒拂。因?yàn)閺膁ocker的出現(xiàn)到現(xiàn)在寸潦,docker肯定是比傳統(tǒng)的虛擬機(jī)技術(shù)是更加強(qiáng)大的。首先社痛,docker不與傳統(tǒng)的虛擬機(jī)技術(shù)一樣见转,它不是在你的宿主機(jī)上使用你的硬件進(jìn)行虛擬出另外一個(gè)機(jī)子。但是docker是宿主機(jī)中的一個(gè)進(jìn)程而已蒜哀,它把它自身的網(wǎng)絡(luò) io都隔離成單獨(dú)一個(gè)房間(如同一棟樓斩箫,樓為進(jìn)程,里面的房間都是docker它自身的玩意進(jìn)行隔離)。這樣一來那么和虛擬化相比性能就高了不少乘客,并且它能夠開啟的數(shù)量也足夠的多狐血。
安裝
docker安裝還是比較簡單的,在不同的環(huán)境下有不同的腳本易核。但是我們具體的操作還是遵循官網(wǎng)的安裝文檔進(jìn)行安裝匈织。
本文使用的macos進(jìn)行安裝,具體可以參考docker對應(yīng)的官方文檔耸成。文檔地址:??https://docs.docker.com/docker-for-mac/install/#install-and-run-docker-for-mac
以macos為例子:
安裝完成后進(jìn)行對應(yīng)的終端驗(yàn)證
三大核心概念
image:
?image俗稱鏡像报亩,是docker可分層并且可復(fù)用的,類似于一個(gè)git倉庫井氢。
container:
container俗稱容器弦追,是image鏡像的載體,等同于樓中的房間花竞。具有自己的進(jìn)程劲件,文件等等。
repository:
repository俗稱倉庫约急,總體來說它比較相似于git倉庫零远,它的作用就是將docker容器進(jìn)行構(gòu)建并且打包成一個(gè)鏡像進(jìn)行分發(fā),其他的人可以使用該鏡像進(jìn)行自己環(huán)境厌蔽。
docker命令
1. 查詢對應(yīng)的倉庫是否有包
```?
docker search?包名
```
例如我們需要安裝nginx包牵辣,我們可以使用搜索命令查看使用量最多的包
2.?進(jìn)行對應(yīng)的鏡像下載
``` docker pull 包名 ```
例如我們需要安裝hello-world包,我們可以使用搜索命令查看使用量最多的包奴饮,并且使用下載命令進(jìn)行下載纬向。
進(jìn)行下載排名第一的包
3. 如何查看本地有哪些下載好的鏡像
``` docker images ```
4.?刪除一個(gè)不需要的鏡像
``` docker rmi?鏡像名字 ```
5.創(chuàng)建一個(gè)docker container,返回對應(yīng)的container_id(也就是容器的標(biāo)示)
``` docker create?--name?容器名字?下載好的鏡像名字 ```
6.?啟動(dòng)一個(gè)docker container
``` docker start 對應(yīng)的container_name ```
7. 查詢運(yùn)行中的容器
``` docker ps ```
8. 進(jìn)入容器
``` docker exec -it 容器名字或則是container_id /bin/bash ```
9. run命令戴卜,run命令是create exec start的結(jié)合體
``` docker run --name 容器名字 鏡像名字 /bin/bash ```
10. 停止一個(gè)container
``` docker stop container_id ```
11. 刪除一個(gè)容器
```docker container?rm container_id ```
12.?強(qiáng)制干掉一個(gè)container
```docker container kill 容器名字或則id ```
13. 查詢一個(gè)容器的日志
```docker container logs container_id```
14.?構(gòu)建一個(gè)鏡像
```docker commit?--author"作者名字"--message"描敘信息"啟動(dòng)的container_id?鏡像名字```
15. 推送到遠(yuǎn)程
```docker login?//?輸入帳號密碼后逾条,沒有需要注冊一個(gè)docker?push?images中的名字docker?logout?//?登出 ```
DockerFile
你可以選擇使用基礎(chǔ)鏡像一步步的構(gòu)建,也可以選擇寫一個(gè)配置文件投剥,然后一條命令(docker?build)完成構(gòu)建师脂,顯然配置文件的方式可以更好地應(yīng)對需求的變更,這個(gè)配置文件就是Dockerfile江锨。
整個(gè)要求必須是使用開頭?FROM 鏡像名字?指定鏡像是什么吃警。
基本上指令很類似于linux的命令,具體我們編寫的時(shí)候還是需要參考以下官網(wǎng)文檔的啄育。
https://docs.docker.com/engine/reference/builder/#environment-replacement
現(xiàn)在我們使用dockerfile去構(gòu)建一個(gè)nginx汤徽,并且在根下面創(chuàng)建文件夾和文件并且寫入hello world
``` FROM nginx??
RUN mkdir test_dir \&& cd test_dir \&& touch hello.txt \&& echo "hello world" > hello.txt ```
docker-compose.yaml 配置文件構(gòu)建環(huán)境
相對dockerfile而言docker-compose等同于是寫配置文件,并且我們需要對應(yīng)某個(gè)鏡像單獨(dú)做一些如創(chuàng)建目錄 下載擴(kuò)展等等可以使用dockerfile進(jìn)行輔助構(gòu)建灸撰≮烁基本上docker-compose的配置很多參數(shù)都是相當(dāng)于命令中某些選項(xiàng)拼坎。相對而言,我還是比較喜歡用這種方式去搭建環(huán)境完疫。
我們接下來會使用docker-compose來搭建php環(huán)境泰鸡。
創(chuàng)建文件docker-compose.yml,代碼如下:
``` version: '2'?
services:nginx:restart:alwayscontainer_name:my_nginx? ? # 鏡像image:nginx? ? # 將nginx鏈接到php-fpmlinks:-phpfpm? ? # 端口內(nèi)部80映射80ports:-80:80networks:-code-network? ? # 配置nginx配置映射和項(xiàng)目映射volumes:-./index.html:/usr/share/nginx/html/test/index.html:rw-./index.php:/usr/share/nginx/html/test/index.php:rw? ? ? # 項(xiàng)目配置vhost-./nginx/conf/vhost/default.conf:/etc/nginx/conf.d/default.conf:rw? ? # command: nginx關(guān)閉守護(hù)進(jìn)程command:nginx -g "daemon off;"tty:true?phpfpm:container_name:my_php? ? # docker安裝插件 https://docs.docker.com/samples/library/php/build:./php/networks:-code-networkvolumes:-./index.html:/var/www/html/test/index.html:rw-./index.php:/var/www/html/test/index.php:rwlinks:-mysql-composer?mysql:image:mysql:5.6restart:alwaysports:-"3306:3306"command:mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --init-connect='SET NAMES utf8mb4;'? ? # 環(huán)境變量 https://docs.docker.com/samples/library/mysql/environment:MYSQL_USER:rootMYSQL_ROOT_PASSWORD:ZeIH8QHbdAT6n6uNgaDwmmjG799IZFbhnetworks:-code-network?composer:image:composer?networks:code-network:?
nginx.conf
server{listen80;server_namelocalhost;?root/usr/share/nginx/html;indexindex.html index.htm index.php;?location/ {?? ? }?location~ ^(.+\.php)(.*)${root/usr/share/nginx/html/test;fastcgi_indexindex.php;fastcgi_passphpfpm:9000;# 修改為phpfpm容器fastcgi_paramSCRIPT_FILENAME? /var/www/html/test$fastcgi_script_name;?# 加入path_info環(huán)境變量fastcgi_split_path_info ^(.+\.php)(.*)$;fastcgi_paramPATH_INFO$fastcgi_path_info;fastcgi_paramPATH_TRANSLATED$document_root$fastcgi_path_info;?if(!-e$document_root$fastcgi_script_name) {# 此處直接返回404錯(cuò)誤return404;? ? ? ? }?includefastcgi_params;? ? }}
php插件dockerfile
FROMphp:7.3-fpm?RUNphp -m?RUNdocker-php-ext-install pdo_mysqlRUNdocker-php-ext-install opcache?# redisRUNpecl install -o -f redis \&&? rm -rf /tmp/pear \&&? docker-php-ext-enable redis?
如何啟動(dòng),在對應(yīng)的文件下面 壳鹤,-d表示后臺運(yùn)行
docker-compose up -d
如何退出
docker-compose stop
如何重啟
docker-compose restart
更多命令可以使用--help進(jìn)行查看
查看效果:
?
總結(jié)
相對來說盛龄,docker的使用對軟件的開發(fā),或者部署等等之類的都帶來了極大的便利芳誓,雖然說只是一個(gè)入門的探究余舶。
以上的示例代碼是作為一個(gè)學(xué)習(xí)參考,請不要直接使用到任何項(xiàng)目環(huán)境中锹淌,以上說明純屬個(gè)人的理解匿值。如果你需要深入學(xué)習(xí)docker,我的建議還是需要從官方的詳細(xì)文檔進(jìn)來覽閱赂摆。