技能篇:docker的(de)簡易教程
虛拟機技術每家公司發展到(dào)一(yī / yì /yí)定規模都必須考慮的(de),更好的(de)環境隔離,更好的(de)事故排查,更好的(de)服務部署
docker的(de)原理
docker更換阿裏源
docker容器的(de)相關命令
Dockerfile文件編寫
docker鏡像的(de)相關命令
1 docker的(de)原理
Docker 利用Linux 中的(de)核心分離機制,例如Cgroups,以(yǐ)及Linux的(de)核心Namespace(名字空間)來(lái)創建獨立的(de)容器。一(yī / yì /yí)句話概括起來(lái)Docker就(jiù)是(shì)利用Namespace做資源隔離,用Cgroup做資源限制,利用Union FS做容器文件系統的(de)輕量級虛拟化技術。Docker容器的(de)本質還是(shì)一(yī / yì /yí)個(gè)直接運行在(zài)宿主機上(shàng)面的(de)特殊進程,看到(dào)的(de)文件系統是(shì)隔離後的(de),但是(shì)操作系統内核是(shì)共享宿主機OS,所以(yǐ)說(shuō)Docker是(shì)輕量級的(de)虛拟化技術
docker 鏡像分層
docker 容器,理解爲(wéi / wèi)一(yī / yì /yí)個(gè)或多個(gè)運行進程,而(ér)這(zhè)些運行進程将占有相應的(de)内存,相應的(de)CPU計算資源,相應的(de)虛拟網絡設備以(yǐ)及相應的(de)文件系統資源。而(ér) docker 鏡像,則像一(yī / yì /yí)個(gè)未運行的(de)軟件包,爲(wéi / wèi) docker 容器的(de)運行提供文件資源。
docker 鏡像是(shì)分層的(de)。啓動鏡像時(shí),一(yī / yì /yí)個(gè)新的(de)可寫層會加載到(dào)鏡像的(de)頂層。這(zhè)一(yī / yì /yí)層通常稱爲(wéi / wèi)"容器層",之(zhī)下是(shì)"鏡像層",可能存在(zài)多個(gè)層。容器層可以(yǐ)讀寫,容器所有發生文件變更寫都發生在(zài)這(zhè)一(yī / yì /yí)層。鏡像層隻允許讀取,read-only
在(zài)容器層的(de)文件增删操作,命令安裝,都會被記錄下來(lái)。我們可以(yǐ)通過 commit 命令來(lái)創建一(yī / yì /yí)個(gè)新的(de)鏡像
2 docker 更換阿裏源
# vi /etc/apt/sources.list ~~更新源 # sudo apt-get clean # sudo apt-get update ~~ 安裝vim # apt-get install vim
ubuntu 18 的(de)阿裏鏡像文件。使用下面的(de)數據替換原 sources.list 裏的(de)數據
deb http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe
3 docker容器的(de)相關命令
run 實例化容器
創建一(yī / yì /yí)個(gè)新的(de)容器并運行:
docker run [options] image [command]
。image 可以(yǐ)是(shì)鏡像ID 也(yě)可以(yǐ)是(shì)倉庫名+Tag名:repository[:tag]
options 常用參數 -i 以(yǐ)交互模式運行容器,通常與 -t 同時(shí)使用 -t 爲(wéi / wèi)容器重新分配一(yī / yì /yí)個(gè)僞輸入終端,通常與 -i 同時(shí)使用 -d 後台運行容器,并返回容器ID --name=<name> 爲(wéi / wèi)容器指定一(yī / yì /yí)個(gè)名稱 -p 指定端口映射,格式爲(wéi / wèi):主機(宿主)端口:容器端口 --net="bridge" 指定容器的(de)網絡連接類型,支持bridge/host/none/container: 四種類型 -e ="v" 設置環境變量
示例
[root@lwl]# docker run -it -p 80:80 --name mynginx nginx:latest /bin/bash root@b8573233d675:/# ~~ 如果容器的(de)啓動命令是(shì)依賴僞終端執行,則需要(yào / yāo) -it,如 ubuntu:14.04 鏡像 ~~ 沒有依賴僞終端執行的(de)啓動命令,可去掉-it,因爲(wéi / wèi)-d 參數會直接返回容器ID [root@lwl]# docker run -it -d -p 80:80 --name mynginx nginx:latest 315cc38afc2f06abb5a2fbb075ebca16455367b2de685cf0c5ba828ab62dd5a1 [root@lwl]#
start、stop、restart 啓動與停止
~~ 啓動已被停止的(de)容器 。 container 可以(yǐ)是(shì)容器名 也(yě)可以(yǐ)是(shì)容器ID # docker start container ~~ 停止運行中的(de)容器 # docker stop container ~~ 重啓容器 # docker restart container
ps 容器查詢
// 列出(chū)容器 # docker ps [-options] -a :顯示所有的(de)容器,包括未運行的(de)。 -f :根據條件過濾顯示的(de)内容。 --format :指定返回值的(de)模闆文件。 -l :顯示最近創建的(de)容器。 -n :列出(chū)最近創建的(de)n個(gè)容器。 --no-trunc :不(bù)截斷輸出(chū)。 -q :靜默模式,隻顯示容器編号。 -s :顯示總的(de)文件大(dà)小 // 相當于(yú)在(zài) container 容器裏使用 top命令 # docker top container
rm 删除容器
# docker rm container
cp 文件傳輸
本機和(hé / huò) docker 容器之(zhī)前的(de)文件傳輸
~~ 複制本地(dì / de)目錄 srcPath 到(dào) 容器 container 的(de)目錄 destPath # docker cp srcPath container:destPath ~~ 複制容器 container 的(de)目錄 srcPath 到(dào)本地(dì / de)目錄 destPath # docker cp container:destPath srcPath
exec 在(zài)運行的(de)容器中執行命令
docker exec [options] container command -d :分離模式: 在(zài)後台運行 -i :即使沒有附加也(yě)保持STDIN 打開 -t :分配一(yī / yì /yí)個(gè)僞終端 ~~ 在(zài)容器 mynginx 中以(yǐ)交互模式執行容器内 /root/run.sh 腳本 # docker exec -it mynginx /bin/sh /root/run.sh ~~ 在(zài)容器 mynginx 中開啓一(yī / yì /yí)個(gè)交互模式的(de)終端 # docker exec -it mynginx /bin/bash
logs 獲取容器的(de)日志
docker logs [options] container -f 跟蹤日志輸出(chū) --since 顯示某個(gè)開始時(shí)間的(de)所有日志 -t 顯示時(shí)間戳 --tail 僅列出(chū)最新N條容器日志 [root@lwl]# docker logs -f mynginx 192.168.239.1 - - [10/Jul/2021:16:53:33 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-" 2021/07/10 16:53:33 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.239.1, server: localhost, request: "GET /favicon.ico HTT ....
4 Dockerfile文件編寫
# docker build -f /path/to/a/Dockerfile
// 1 FROM:指定基礎鏡像,必須爲(wéi / wèi)第一(yī / yì /yí)個(gè)命令,格式: FROM <image> FROM <image>:<tag> // 2 MAINTAINER: 維護者信息 格式: MAINTAINER <name> // 3 ENV:設置環境變量 格式 // 4 ARG:用于(yú)指定傳遞給構建運行時(shí)的(de)變量 格式: ARG <name>[=<default value>] // 5 WORKDIR:工作目錄,類似于(yú)cd命令 格式: WORKDIR /path/to/workdir ENV <key>=<value // 6 ADD:将本地(dì / de)文件添加到(dào)容器中,可以(yǐ)訪問網絡資源,類似wget ADD <src>... <dest> // 7 COPY:功能類似ADD,但是(shì)是(shì)不(bù)會自動解壓文件 // 8 RUN:構建鏡像時(shí)執行的(de)命令 格式 RUN <command> // 9 CMD:構建容器後調用,也(yě)就(jiù)是(shì)在(zài)容器啓動時(shí)才進行調用 CMD command param1 param2 (執行shell内部命令) // 10 ENTRYPOINT:配置容器,使其可執行化 ENTRYPOINT command param1 param2 (shell内部命令)
Dockerfile 示例
# 基礎鏡像 FROM centos # 維護者信息 MAINTAINER tianfeiyu #ENV 設置環境變量 ENV PATH /usr/local/nginx/sbin:$PATH #ADD 文件放在(zài)當前目錄下,拷過去會自動解壓 ADD nginx-1.8.0.tar.gz /usr/local/ ADD epel-release-latest-7.noarch.rpm /usr/local/ # RUN 執行以(yǐ)下命令 RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all RUN useradd -s /sbin/nologin -M www # WORKDIR 相當于(yú)cd WORKDIR /usr/local/nginx-1.8.0 RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install RUN echo "daemon off;" >> /etc/nginx.conf # CMD 運行以(yǐ)下命令 CMD ["nginx"]
5 docker 鏡像的(de)相關命令
鏡像查看列舉:
docker images
鏡像搜索:
docker search <imageName>
;imageName 是(shì) repository[:tag] 的(de)模糊詞拉取:
docker pull repository[:tag]
删除單個(gè)鏡像:
docker rmi 鏡像ID
或者docker rmi repository[:tag]
給鏡像打别名(标簽):
docker tag oldRepository[/:oleTag] newRepository][/:newTag]
# docker tag ubuntu:15.10 lwl/ubuntu:v3
構建鏡像
~~ 根據 Dockerfile 構建鏡像 # docker build -t repository[:tag] dir # docker build -t lwl/ubuntu:v1 . options 參數 --build-arg=[] 設置鏡像創建時(shí)的(de)變量 -t 鏡像的(de)名字及标簽,通常 name:tag 或者 name 格式 -f 指定要(yào / yāo)使用的(de)Dockerfile路徑
~~ 根據正在(zài)運行的(de) container 容器 構建鏡像 # docker commit [options] container repository[:tag] options 參數 -a :提交的(de)鏡像作者; -c :使用Dockerfile指令來(lái)創建鏡像; -m :提交時(shí)的(de)說(shuō)明文字; -p :在(zài)commit時(shí),将容器暫停
推送:
docker push repository[:tag]
歡迎指正文中錯誤
創作不(bù)易,如果對大(dà)家有所幫助,希望大(dà)家點贊支持,有什麽問題也(yě)可以(yǐ)在(zài)評論區裏讨論