虛擬機器技術每家公司發展到一定規模都必須考慮的,更好的環境隔離,更好的事故排查,更好的服務部署
- docker的原理
- docker更換阿里源
- docker容器的相關命令
- Dockerfile檔案編寫
- docker映象的相關命令
關注公眾號,一起交流,微信搜一搜: 潛行前行
1 docker的原理
- Docker 利用Linux 中的核心分離機制,例如Cgroups,以及Linux的核心Namespace(名字空間)來建立獨立的容器。一句話概括起來Docker就是利用Namespace做資源隔離,用Cgroup做資源限制,利用Union FS做容器檔案系統的輕量級虛擬化技術。Docker容器的本質還是一個直接執行在宿主機上面的特殊程式,看到的檔案系統是隔離後的,但是作業系統核心是共享宿主機OS,所以說Docker是輕量級的虛擬化技術
docker 映象分層
- docker 容器,理解為一個或多個執行程式,而這些執行程式將佔有相應的記憶體,相應的CPU計算資源,相應的虛擬網路裝置以及相應的檔案系統資源。而 docker 映象,則像一個未執行的軟體包,為 docker 容器的執行提供檔案資源。
- docker 映象是分層的。啟動映象時,一個新的可寫層會載入到映象的頂層。這一層通常稱為"容器層",之下是"映象層",可能存在多個層。容器層可以讀寫,容器所有發生檔案變更寫都發生在這一層。映象層只允許讀取,read-only
- 在容器層的檔案增刪操作,命令安裝,都會被記錄下來。我們可以通過 commit 命令來建立一個新的映象
2 docker 更換阿里源
# vi /etc/apt/sources.list
~~更新源
# sudo apt-get clean
# sudo apt-get update
~~ 安裝vim
# apt-get install vim
- ubuntu 18 的阿里映象檔案。使用下面的資料替換原 sources.list 裡的資料
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容器的相關命令
run 例項化容器
- 建立一個新的容器並執行:
docker run [options] image [command]
。image 可以是映象ID 也可以是倉庫名+Tag名:repository[:tag]
options 常用引數
-i 以互動模式執行容器,通常與 -t 同時使用
-t 為容器重新分配一個偽輸入終端,通常與 -i 同時使用
-d 後臺執行容器,並返回容器ID
--name=<name> 為容器指定一個名稱
-p 指定埠對映,格式為:主機(宿主)埠:容器埠
--net="bridge" 指定容器的網路連線型別,支援bridge/host/none/container: 四種型別
-e ="v" 設定環境變數
- 示例
[root@lwl]# docker run -it -p 80:80 --name mynginx nginx:latest /bin/bash
root@b8573233d675:/#
~~ 如果容器的啟動命令是依賴偽終端執行,則需要 -it,如 ubuntu:14.04 映象
~~ 沒有依賴偽終端執行的啟動命令,可去掉-it,因為-d 引數會直接返回容器ID
[root@lwl]# docker run -it -d -p 80:80 --name mynginx nginx:latest
315cc38afc2f06abb5a2fbb075ebca16455367b2de685cf0c5ba828ab62dd5a1
[root@lwl]#
start、stop、restart 啟動與停止
~~ 啟動已被停止的容器 。 container 可以是容器名 也可以是容器ID
# docker start container
~~ 停止執行中的容器
# docker stop container
~~ 重啟容器
# docker restart container
ps 容器查詢
// 列出容器
# docker ps [-options]
-a :顯示所有的容器,包括未執行的。
-f :根據條件過濾顯示的內容。
--format :指定返回值的模板檔案。
-l :顯示最近建立的容器。
-n :列出最近建立的n個容器。
--no-trunc :不截斷輸出。
-q :靜默模式,只顯示容器編號。
-s :顯示總的檔案大小
// 相當於在 container 容器裡使用 top命令
# docker top container
rm 刪除容器
# docker rm container
cp 檔案傳輸
- 本機和 docker 容器之前的檔案傳輸
~~ 複製本地目錄 srcPath 到 容器 container 的目錄 destPath
# docker cp srcPath container:destPath
~~ 複製容器 container 的目錄 srcPath 到本地目錄 destPath
# docker cp container:destPath srcPath
exec 在執行的容器中執行命令
docker exec [options] container command
-d :分離模式: 在後臺執行
-i :即使沒有附加也保持STDIN 開啟
-t :分配一個偽終端
~~ 在容器 mynginx 中以互動模式執行容器內 /root/run.sh 指令碼
# docker exec -it mynginx /bin/sh /root/run.sh
~~ 在容器 mynginx 中開啟一個互動模式的終端
# docker exec -it mynginx /bin/bash
logs 獲取容器的日誌
docker logs [options] container
-f 跟蹤日誌輸出
--since 顯示某個開始時間的所有日誌
-t 顯示時間戳
--tail 僅列出最新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:指定基礎映象,必須為第一個命令,格式:
FROM <image>
FROM <image>:<tag>
// 2 MAINTAINER: 維護者資訊 格式:
MAINTAINER <name>
// 3 ENV:設定環境變數 格式
// 4 ARG:用於指定傳遞給構建執行時的變數 格式:
ARG <name>[=<default value>]
// 5 WORKDIR:工作目錄,類似於cd命令 格式:
WORKDIR /path/to/workdir
ENV <key>=<value
// 6 ADD:將本地檔案新增到容器中,可以訪問網路資源,類似wget
ADD <src>... <dest>
// 7 COPY:功能類似ADD,但是是不會自動解壓檔案
// 8 RUN:構建映象時執行的命令 格式
RUN <command>
// 9 CMD:構建容器後呼叫,也就是在容器啟動時才進行呼叫
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 檔案放在當前目錄下,拷過去會自動解壓
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
# RUN 執行以下命令
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 相當於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 執行以下命令
CMD ["nginx"]
5 docker 映象的相關命令
- 映象檢視列舉:
docker images
- 映象搜尋:
docker search <imageName>
;imageName 是 repository[:tag] 的模糊詞 - 拉取:
docker pull repository[:tag]
- 刪除單個映象:
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=[] 設定映象建立時的變數
-t 映象的名字及標籤,通常 name:tag 或者 name 格式
-f 指定要使用的Dockerfile路徑
~~ 根據正在執行的 container 容器 構建映象
# docker commit [options] container repository[:tag]
options 引數
-a :提交的映象作者;
-c :使用Dockerfile指令來建立映象;
-m :提交時的說明文字;
-p :在commit時,將容器暫停
- 推送:
docker push repository[:tag]