目錄
1.docker是容器的管理工具;
2.官方鏡像:
docker search --filter "is-official-true" nginx
3.同一個鏡像可以啓動多個容器;
只要創建的時候,容器的名字不一樣就可以;
4.容器先停掉再移出;
5.在容器中做的修改
退出容器(exit)後,停止,重啓容器,修改的內容還會在;若把容器刪除掉,修改內容就會消失;此時就需要docker commit -a "zh" -m "message" 容器名/容器ID 新容器名:版本號
6.容器通過鏡像來創建的
7.docker run -itd
-d:表示後臺運行容器,並返回容器ID
-i:表示以交互模式運行容器
-t:爲容器重新分配
8.command是容器啓動之後,要執行的命令;
9.給某鏡像指定端口映射,並能夠成功啓動;
解決的是:客戶端發來的請求與容器交互;
docker run -itd -p 8888:80 zh-nginx:1.0.0
10.文件掛載
docker run -itd --name=nginx -p 8888:80 -v /Users/liming/index.html:/usr/share/nginx/html/index.html nginx
將宿主機的文件掛載到容器中;在宿主機中進行文件的修改,容器中也會跟着修改;
將宿主機上的程序文件掛載到容器中,調用容器裏的服務來運行;
解決的是:宿主機與容器間的交互;宿主機文件改動還是容器上的文件改動均會互相影響;
注意:宿主機和容器中的文件均需要填寫全路徑;
11.宿主機文件和容器文件進行交互複製
docker cp ...
12.容器互聯
解決的是:容器間的交互
-e是:容器啓動時會讀取參數進行操作;
MySQL修改root密碼:
alter user 'root'@'%' identified with mysql_native_password by '123456';
注意:mysql_native_password是數據庫管理插件
docker run -itd --name=mysql -p 3306:3306 -v /Users/liming/mysql/:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.27
用MySQL客戶端sequel pro即可連上;
啓動PHP容器,並關聯MySQL:
docker run -tid --name=php --link mysql:mysql -v /Users/fdfd/index.php:/index.php php
--link 被關聯的容器:被關聯的容器別名;
進入php容器:執行php腳本,發現少driver,在容器中進行安裝
安裝php_mysql 至容器中,執行:
docker-php-ext-install pdo_mysql
PHP的腳本訪問MySQL時,寫容器關聯的別名;因爲IP地址不是固定的;
php腳本:
<?php
$pdo = new \PDO('mysql:host=mysql;dbname=test','root','lihuan1114');
foreach($pdo->query('SELECT * from user') as $row){
print_r($row);
}
13.如何通過Dockerfile定製鏡像;
自制鏡像;13之上都是下載docker上的鏡像;
什麼是Dockerfile?
Dockerfile:就是名爲Dockerfile的文件,文件中包含一些Linux命令;docker通過讀取Dockerfile文件中的命令來組件鏡像;
Dockerfile文件中分爲4部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啓動時執行命令;
運行Dockerfile:
注意:tag_name可以不指定,即 docker build -t image_name . ,則默認生成lastest鏡像;
docker build -t image_name:tag_name .
也可指定-f 參數來指定Dockerfile 文件位置;
docker build -f /path/Dockerfile .
命令詳解:
FROM :指定基礎鏡像,必須是第一個命令;
MAINTAINER:可指定維護者信息,比如寫自己的名字;
RUN:構建鏡像時,執行的命令;(構建鏡像時,docker在解析Dockerfile文件時)
ADD:將本地文件添加到容器中,tar類型文件會自動解壓(網絡壓縮資源不會被解壓),可以訪問網絡資源,類似wget
COPY:功能與ADD類似,但是是不能自動解壓文件,也不能訪問網絡資源;
CMD:構建容器後調用,也就是容器啓動時,纔可以進行調用;(啓動容器中的進程)(鏡像構建完了,通過鏡像啓動容器時)
ENTRYPOINT:配置容器,使其可執行化,配置CMD可省去“application”,只使用參數;(docker run 命令後的啓動完鏡像,需執行的命令,不會把ENTRYPOINT設置的命令覆蓋掉,而會把CMD設置的啓動後執行的命令覆蓋掉;另Dockerfile中只能允許有一個ENTRYPOINT命令,若ENTRYPOINT命令多的話,後面會覆蓋前面的命令,即只會執行後面的ENTRYPOINT命令)
LABEL:用於給鏡像添加元數據;(給鏡像添加標識,比如版本號,描述等信息)
ENV:設置環境變量,即Linux中的環境變量;
EXPOST:指定於外界交互的端口;(即,容器對外暴露的端口)
VOLUME:用於指定持久化目錄;(即進行文件目錄的掛載)
WORKDIR:工作目錄,類似於cd命令;(WORKDIR /path/to/workdir《==》RUN cd /usr/local/)
USER:指定運行容器時的用戶名或UID,後續的RUN也會使用指定用戶;若運行時,通過root 用戶運行,即不用設置;
ARG:用於指定傳遞給構建運行時的變量;即,dockerfile中定義語法變量;
ONBUILD:用於設置鏡像觸發器;即當所構建的鏡像被用作其他鏡像的基礎鏡像,該鏡像中的觸發器將會被鑰觸發;
14.Dockerfile是分層的
運行Dockerfile文件時,可以看出來,標識爲:Step 1/9;所以Dockerfile是分層的,不要一層寫成多層;比如寫了很多個RUN命令,不建議;
Dockerfile文件中要有層級,保持每一層的層級,比如RUN命令要執行多個,可以使用&&\來連接多行命令;
若之前執行過Dockerfile則執行時,每層下面會顯示using cache,第一次執行 的時候,把每層進行了緩存;
FROM的內容,若本地有會直接用,若沒有則會下載,不需提前準備基礎鏡像;
執行完Dockerfile文件後,就會生成image;