docker的入門之旅

序言


從docker的出現(xiàn)以來,它就成為了互聯(lián)網(wǎng)公司的寵兒。換句話說現(xiàn)在牛逼的互聯(lián)網(wǎng)公司的架構(gòu)系統(tǒng)不使用在 Docker之上都不好意思說自己是一個純粹的互聯(lián)網(wǎng)公司。

本文章會帶領(lǐng)大家了解 Docker 的基礎(chǔ)概念,使用方式和一些使用docker的場景。

什么是docker?


或許很多同學(xué)都玩過例如這些大名鼎鼎的東西,如:Oracle VM?VirtualBox,VMware Workstation。大家都會說這不就是虛擬機嘛,是的,這些都是業(yè)界大牛公司搞出來虛擬化技術(shù)。用過的同學(xué)都說,這docker和它們都沒什么區(qū)別,感覺都是虛擬機。雖然在一定程度上它們的確很類似,但我們不能把docker當(dāng)作是虛擬機,怎么說呢。因為從docker的出現(xiàn)到現(xiàn)在,docker肯定是比傳統(tǒng)的虛擬機技術(shù)是更加強大的。首先,docker不與傳統(tǒng)的虛擬機技術(shù)一樣,它不是在你的宿主機上使用你的硬件進(jìn)行虛擬出另外一個機子。但是docker是宿主機中的一個進(jìn)程而已,它把它自身的網(wǎng)絡(luò) io都隔離成單獨一個房間(如同一棟樓,樓為進(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)的終端驗證

三大核心概念

image:

?image俗稱鏡像,是docker可分層并且可復(fù)用的,類似于一個git倉庫。

container:

container俗稱容器,是image鏡像的載體,等同于樓中的房間。具有自己的進(jìn)程,文件等等。

repository:

repository俗稱倉庫,總體來說它比較相似于git倉庫,它的作用就是將docker容器進(jìn)行構(gòu)建并且打包成一個鏡像進(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.?刪除一個不需要的鏡像

``` docker rmi?鏡像名字 ```

5.創(chuàng)建一個docker container,返回對應(yīng)的container_id(也就是容器的標(biāo)示)

``` docker create?--name?容器名字?下載好的鏡像名字 ```


6.?啟動一個docker container

``` docker start 對應(yīng)的container_name ```

7. 查詢運行中的容器

``` 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. 停止一個container

``` docker stop container_id ```

11. 刪除一個容器

```docker container?rm container_id ```

12.?強制干掉一個container

```docker container kill 容器名字或則id ```

13. 查詢一個容器的日志

```docker container logs container_id```

14.?構(gòu)建一個鏡像

```docker commit?--author"作者名字"--message"描敘信息"啟動的container_id?鏡像名字```

15. 推送到遠(yuǎn)程

```docker login?//?輸入帳號密碼后,沒有需要注冊一個docker?push?images中的名字docker?logout?//?登出 ```

DockerFile

你可以選擇使用基礎(chǔ)鏡像一步步的構(gòu)建,也可以選擇寫一個配置文件,然后一條命令(docker?build)完成構(gòu)建,顯然配置文件的方式可以更好地應(yīng)對需求的變更,這個配置文件就是Dockerfile。

整個要求必須是使用開頭?FROM 鏡像名字?指定鏡像是什么。

基本上指令很類似于linux的命令,具體我們編寫的時候還是需要參考以下官網(wǎng)文檔的。

https://docs.docker.com/engine/reference/builder/#environment-replacement

現(xiàn)在我們使用dockerfile去構(gòu)建一個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)某個鏡像單獨做一些如創(chuàng)建目錄 下載擴展等等可以使用dockerfile進(jìn)行輔助構(gòu)建。基本上docker-compose的配置很多參數(shù)都是相當(dā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配置映射和項目映射volumes:-./index.html:/usr/share/nginx/html/test/index.html:rw-./index.php:/usr/share/nginx/html/test/index.php:rw? ? ? # 項目配置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錯誤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?

如何啟動,在對應(yīng)的文件下面 ,-d表示后臺運行

docker-compose up -d

如何退出

docker-compose stop

如何重啟

docker-compose restart

更多命令可以使用--help進(jìn)行查看

查看效果:

?

總結(jié)

相對來說,docker的使用對軟件的開發(fā),或者部署等等之類的都帶來了極大的便利,雖然說只是一個入門的探究。

以上的示例代碼是作為一個學(xué)習(xí)參考,請不要直接使用到任何項目環(huán)境中,以上說明純屬個人的理解。如果你需要深入學(xué)習(xí)docker,我的建議還是需要從官方的詳細(xì)文檔進(jìn)來覽閱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容