12章程式碼
本文轉自本人部落格
Docker 架構
- 映象(Image):Docker 映象(Image),就相當於是一個 root 檔案系統。比如官方映象 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 檔案系統。
- 容器(Container):映象(Image)和容器(Container)的關係,就像是面向物件程式設計中的類和例項一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。
- 倉庫(Repository):倉庫可看成一個程式碼控制中心,用來儲存映象。
可以這麼認為
- 集裝箱(映象): 會將所有需要的內容放到不同的集裝箱,誰需要這些環境就直接拿走(pull)這個集裝箱就可以了,而docker有一個大碼頭,所有的集裝箱都放在這裡(中央倉庫
- 隔離性: Docker在執行集裝箱內內容時,會在Linux的核心中,單獨開閉一片空間,這片空間不會影響到其他應用程式,一定程度上增加了安全性
- 容器:執行起來的映象
Docker 安裝
烏班圖系統可使用以下命令一鍵安裝
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
或者使用daocloud一鍵安裝
curl -sSL https://get.daocloud.io/docker | sh
安裝成功之後,手動啟動,設定為開機自啟,並測試一下Docker
# 啟動Docker服務 systemctl start docker # 設定開機自動啟動 systemctl enable docker # 測試 docker run hello-world
Docker 映象加速
安裝完之後建議換源,否則從中央倉庫拖容器的時候巨慢無比,建議使用阿里雲的Docker映象加速
阿里雲映象獲取地址:
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
登陸後,左側選單選中映象加速器就可以看到你的專屬地址了:
https://********.mirror.aliyuncs.com
獲取連結之後,在/etc/docker/daemon.json
中寫入如下內容(如果檔案不存在請新建該檔案):
{"registry-mirrors":["https://********.mirror.aliyuncs.com"]}
修改之後重啟服務
sudo systemctl daemon-reload
sudo systemctl restart docker
此外,可以嘗試使用國內的一些倉庫,本人常用的是
http://hub.daocloud.io/
映象的操作
拉取映象
從中央倉庫拉取映象到本地
docker pull 映象名稱[:tag]
# 如: docker pull daocloud.io/library/nginx:latest
# docker pull php:5.6-fpm
檢視本地映象
檢視本地以及安裝過的映象資訊,包含標識,名稱,版本,更新時間,大小
docker images
刪除本地映象
映象會佔用磁碟空間,可以手動刪除
docker rmi 映象的標識
映象的匯入和匯出
# 將本地的映象匯出
docker save -o 匯出的路徑 映象id
# 載入本地的映象檔案
docker load -i 映象檔案
# 修改映象名稱
docker tag 映象id 新映象名稱:版本
容器的操作
執行容器
執行容器需要制定具體映象,如果就像不存在則直接下載
# 簡易操作
docker run 映象的標識|映象名稱[:tag]
# 常見引數
docker run -d -p 宿主機埠:容器埠 --name 容器名稱 映象的標識|映象名稱[:tag]
# -d: 標識後臺執行容器
# -p 宿主機埠:容器埠: 為了對映當前Linux的埠和容器的埠
# --name 容器名稱: 指定容器的名稱
檢視正在執行的容器
docker ps [-qa]
# -a: 檢視全部的容器,包括沒有執行的
# -q: 只檢視容器的標識
檢視容器日誌
docker logs -f 容器id
# -f: 可以滾動檢視日誌的最後幾行
進入容器內部
# 可以進入容器內部進行操作
docker exec -it 容器id bash
複製內容到容器
# 講宿主機的檔案複製到容器內部的指定目錄
docker cp 檔名稱 容器id:容器內部路徑
重啟&啟動&停止&刪除容器
# 重新啟動容器
docker restart 容器id
# 啟動停止執行的容器
docker start 容器id
# 停止指定的容器(得先停止容器再刪除)
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -qa)
# 刪除指定的容器
docker rm 容器id
# 停止全部容器
docker rm $(docker ps -qa)
資料卷
資料卷: 講宿主機的一個目錄對映到容器的一個目錄中
可以在宿主機中操作目錄中的內容,那麼容器內部對映的檔案,也會跟著一起改變
建立資料卷
# 建立資料卷之後,預設會存放在一個目錄下 /var/lib/docker/volumes/
docker volume create 資料卷名稱
檢視全部資料卷
# 檢視全部資料卷資訊
docker volume ls
檢視資料卷詳情
# 檢視資料卷的詳細資訊,可以查詢到存放的路徑,建立時間等等
docker volume inspect 資料卷名稱
刪除資料卷
# 刪除指定的資料卷
docker volume rm 資料卷名稱
容器對映資料卷
對映有兩種方式:
通過資料卷名稱對映,如果資料卷不存在。Docker會幫你自動建立,會將容器內部自帶的檔案,儲存在預設的存放路徑中。
通過路徑對映資料卷,直接指定一個路徑作為資料卷的存放位置。但是這個路徑下是空的。
# 通過資料卷名稱對映
docker run -v 資料卷名稱:容器內部的路徑 映象id
# 通過路徑對映資料卷
docker run -v 路徑:容器內部的 映象id
Dockerfile
我們可以通過建立Dockerfile來自定義建立映象
from : 指定當前自定義映象依賴的環境
copy : 講相對路徑下的內容複製到自定義映象中
workdir : 宣告映象的預設工作目錄
run : 執行的命令,可以編寫多個
cmd : 需要執行的命令(在workdir下執行,cmd可以寫多個,只以最後一個為準
EXPOSE [埠號] :對映到宿主機的埠,這個命令主要體現在啟動容器時所執行的命令,
下面以AntSword-Labs\bypass_disable_functions\1
為例
# 拉取apache映象
FROM php:5.6.11-apache
# 複製檔案到容器內部
COPY src/shell.php /var/www/html/index.php
COPY src/shell.php /var/www/html/ant.php
COPY src/php.ini /usr/local/etc/php/php.ini
COPY src/start.sh /start.sh
# 執行系統命令
RUN set -x \
&& chmod +x /start.sh \
&& chown -R www-data:www-data /var/www/html
# 對映80埠
EXPOSE 80
# 執行命令檔案
ENTRYPOINT [ "/start.sh" ]
通過dockerfile製作映象
編寫完Dockerfile後需要通過命令將其製作為映象,並且要在Dockerfile的當前目錄下,之後即可在映象中檢視相關資訊,注意最後的 .
# 製作映象
docker build -t 映象名稱[:tag] .
Docker-compose
可以通過Docker-Compose編寫映象引數,而且Docker-Compose可以幫助我們批量的管理容器,這些資訊只需要通過一個docker-compose.yml去維護
Docekr-compose的安裝
推薦使用pip一鍵式操作
pip install docker-compose
安裝完成之後嘗試輸入
docker-compose -version
# 出現類似以下資訊即為安裝成功
# docker-compose version 1.26.2, build unknown
Docker-Compose管理容器
這裡以AntSword-Labs\bypass_disable_functions\1
為例
version: '2' # 說明yml檔案的版本號,一般使用2或3
services: # yml檔案的主體,定義服務配置
web: # 服務名稱,可自定義
build: # 構建自定義映象
context: ./ # 指定fockerfile的所在路徑
dockerfile: Dockerfile # 指定Dockerfile檔名稱
image: antswordproject/antsword-labs:bypass_disable_functions_1 # 指定檔案路徑
ports:
- "18080:80" # 對映埠,相當於之前的-p
再來一個mysql
的yml
version: '3.1'
services:
mysql: # 服務的名稱
restart: always # 代表只要docker啟動,那麼這個容器就跟著一起啟動
image: daocloud.io/library/mysql:5.7.4 # 指定映象路徑
container_name: mysql # 指定容器名稱
ports:
- 3306:3306 # 指定埠號的對映
environment:
MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT使用者登入密碼
TZ: Asia/Shanghai # 指定時區(TimeZone)
volumes:
- /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql # 對映資料卷
使用docker-compose命令管理容器
在使用docker-compose的命令時,預設會在當前目錄下找docker-compose.yml檔案
# 1.基於docker-compose.yml啟動管理的容器
docker-compose up -d
# 如果自定義映象不存在,會幫助我們構建出自定義映象,如果自定義映象存在,則直接執行這個映象,如果需要重構
# 重新構建自定義映象
docker-compose build
# 運行當前內容,並重新構建
docker-compose up -d --build
# 2.關閉並刪除容器
docker-compose down
# 3.開啟|關閉|重啟已經存在的由docker-compose維護的容器
docker-compose start|stop|restart
# 4.檢視由docker-compose管理的容器
docker-compose ps
# 5.檢視日誌
docker-compose logs -f