Docker 實踐 部分操作命令

Docker是什麼
鏡像,容器,倉庫。
docker與System的關系 
容器虛擬化的是操作系統而不是硬件,容器之間是共享同一套操作系統資源的。
虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操作系統。因此容器的隔離級別會稍低一些。
傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。
獲取鏡像
$ docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標簽]
#docker pull –help 查看更多
#docker COMMAND –help 命令幫助
#列出本地鏡像
docker images
#搜索鏡像
docker search mysql
#例如docker pull badapple9/speedtest-x,拉取speedtest-x項目,用戶名badapple9/軟件名#speedtest-x,此處表示默認地址是 Docker #Hub(docker.io)
#倉庫名若不給出,則表示官方鏡像
如docker pull ubuntu:18.04
沒有給出地址,默認docker hub,沒有給出倉庫名,實際地址docker.io/library/ubuntu:18.04
運行容器(進入)
#ubuntu18為例
docker run -it –rm ubuntu:18.04 bash
-i: 交互式操作-t: 終端–rm: 容器退出後刪除ubuntu: 18.04:基礎鏡像bash: 交互式命令
docker run [可選參數] image
–name=”名字” 指定容器名字-d 後臺方式運行-it 使用交互方式運行,進入容器查看內容-p 指定容器的端口(-p ip:主機端口:容器端口 配置主機端口映射到容器端口-p 主機端口:容器端口-p 容器端口)-P 隨機指定端口(大寫的P)
列出下載鏡像
需要明白鏡像和容器的關系:
鏡像是靜態的定義,容器是鏡像運行的實體,容器實際上是在鏡像的上面加瞭一層讀寫層,在運行的容器裡做任何改動都是寫入到讀寫層。刪除容器之後,等於刪除讀寫層,對文件的改動也會丟失。

#列出頂層鏡像
docker image ls
#列出活動容器
docker ps
#列出所有容器
docker ps -a
#更多命令
docker ps –help
docker容器大小可能會比實際鏡像大小大,鏡像是壓縮存儲在倉庫中,而實際使用時需要展開。由於 Docker 鏡像是多層存儲結構,並且可以繼承、復用,因此不同鏡像可能會因為使用相同的基礎鏡像,從而擁有共同的層。由於 Docker 使用 Union FS,聯合文件系統是docker鏡像的基礎,鏡像可以通過分層來繼承,相同的層隻需要保存一份即可,因此實際鏡像硬盤占用空間很可能要比這個列表鏡像大小的總和要小的多。
docker中間層
相同的層隻會存一遍,而這些鏡像是別的鏡像的依賴,因此並不會因為它們被列出來而多存瞭一份,無論如何你也會需要它們。隻要刪除那些依賴它們的鏡像後,這些依賴的中間層鏡像也會被連帶刪除。
刪除鏡像
docker image rm [OPTIONS] IMAGE ID [IMAGE…](docker rmi -f 鏡像id)
IMAGE ID 通常取ID前三個字符(人工刪除的情況下)
[OPTIONS]可選 -f 強制移除
構建簡單web容器
-d 後臺運行, -p 端口映射 宿主機端口:容器端口 ,nginx 作為基礎鏡像,–name 自定義名字
docker run –name webserver -d -p 80:80 nginx
Docker容器與宿主機直接文件拷貝
#拷貝容器的文件到主機中
docker cp 容器id:容器內路徑 目的主機路徑

#拷貝宿主機的文件到容器中
docker cp 目的主機路徑 容器id:容器內路徑

docker cp containerid:/opt/testnew/file.txt /opt/test/
docekr cp /opt/test containerid:/opt/testnew/file.txt
#容器是否啟動均會拷貝,且相同文件會替代
進入容器
#進入容器,修改存儲層
docker exec -it webserver bash
#例如修改默認的index.html
MySQL的部署
下載並運行
#拉取並運行容器
docker run -d –name mysql-5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
#參數說明:
-p 3306:3306 :映射容器服務的 3306 端口到宿主機的 3306 端口,外部主機可以直接通過 宿主機ip:3306 訪問到 MySQL 的服務。
MYSQL_ROOT_PASSWORD=123456:設置 MySQL 服務 默認賬號root 用戶的密碼。

進入容器查看mysql服務 進入容器,並通過賬號root查看MySQL服務能否正常連接
docker exec -it 9b3aad6819ff /bin/bashell
mysql -h localhost -u root -p

鏡像構成/容器打包成鏡像
鏡像是多層存儲,每一層是在前一層的基礎上進行的修改;而容器同樣也是多層存儲,是在以鏡像為基礎層,在其基礎上加一層作為容器運行時的存儲層。利用nginx作為基礎容器,構建webserver
運行一個容器,並對容器內容做修改,而不使用掛載文件夾(卷),對其內部任何的修改都將保存在存儲層,如果想將修改之後的容器保存成鏡像,方便在其他設備使用,docker中提供docker commit 命令
docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標簽>]]
#舉例 \換行符 webserver 容器名 倉庫nginx 標簽 v2
docker commit \
–author “MAOBUNI <[email protected]>” \
–message “alter default index html” \
webserver \
nginx:v2
使用docker commit 意味著所有對鏡像的操作都是黑箱操作,生成的鏡像也被稱為 黑箱鏡像,除瞭制作鏡像的人知道執行過什麼命令、怎麼生成的鏡像,別人根本無從得知。而且,即使是這個制作鏡像的人,過一段時間後也無法記清具體的操作。黑箱鏡像難以維護,並且docker的是分層存儲,修改僅僅影響當前層,層層累計,鏡像臃腫。考慮使用Dockerfile 構建鏡像。
Dockerfile
#創建文件Dockerfile
touch Dockerfile
#編輯
vim Dockerfile
FROM nginx
RUN echo ‘<h1>Hello, Docker!</h1>’ > /usr/share/nginx/html/index.html
#Dockerfile所在目錄執行
#docker build [OPTIONS] PATH | URL | –
#RUN命令會構建一個容器來執行命令,隨後得到一個新的鏡像並刪除原執行容器
docker bulid -t nginx:v1 .
FROM: 指定基礎鏡像(FROM scratch 空白鏡像,不以任何鏡像為基礎鏡像,服務類鏡像nginx, redis等,語言類鏡像python,golang等,基礎操作系統鏡像centos,alpine等)
RUN:shell格式的run:RUN [命令](例如 RUN echo ‘hello’ >> /usr/share/nginx/html/index.html)exec格式:RUN [“可執行文件”, “參數1”, “參數2”]
Docker每個RUN指令都會構建一層,將復雜的shell腳本表現為多個RUN命令,導致鏡像臃腫 ,且容易出錯。(Union FS 是有最大層數限制的,比如 AUFS,曾經是最大不得超過 42 層,現在是不得超過 127 層。)
例:以debian為基礎鏡像,安裝redis,構建新的鏡像,多個RUN命令
FROM debian:stretch

RUN apt-get update
RUN apt-get install -y gcc libc6-dev make wget
RUN wget -O redis.tar.gz “http://download.redis.io/releases/redis-5.0.3.tar.gz”
RUN mkdir -p /usr/src/redis
RUN tar -xzf redis.tar.gz -C /usr/src/redis –strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install
Dockerfile正確寫法
FROM debian:stretch

RUN set -x; buildDeps=’gcc libc6-dev make wget’ \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz “http://download.redis.io/releases/redis-5.0.3.tar.gz” \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis –strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y –auto-remove $buildDeps
撰寫 Dockerfile 的時候,要經常提醒自己,這並不是在寫 Shell 腳本,而是在定義每一層該如何構建。(Dockerfile文件名僅是默認習慣,且位置默認放在上下文目錄中)
其他構建鏡像方法
docker build 其他用法
git repo構建
docker build -t name:tag URL
tar壓縮包構建
docker build http://server/context.tar.gzDocker 引擎會下載這個包,並自動解壓縮,以其作為上下文,開始構建。
標準輸入讀取Dockerfile構建
docker build – < Dockerfile (cat Dockerfile | docker build -)沒有上下文,因此不可以像其他方法那樣可以將本地文件 COPY 進鏡像之類的事情。
Dockerfile指令詳解
。。。
操作容器
當利用 docker run 來創建容器時,Docker 在後臺運行的標準操作包括:

檢查本地是否存在指定的鏡像,不存在就從 registry 下載
利用鏡像創建並啟動一個容器
分配一個文件系統,並在隻讀的鏡像層外面掛載一層可讀寫層
從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
從地址池配置一個 ip 地址給容器
執行用戶指定的應用程序
執行完畢後容器被終止
再次啟動命令 docker container start

查看容器中運行的進程
進入容器之後,可以使用ps或top命令,即可以觀察到docker的輕便。
守護態/後臺運行:docekr run -d
查看容器日志:docker container logs [container ID or NAMES]
終止容器:docker container stop
重啟一個容器:docker container restart
進入容器
docker attach 和 docker exec 命令
exec命令
docker exec 後常 用 -i 和-t 命令
-i並沒分配偽終端,操作結果返回在宿主機
#例子
docker exec -it container ID bash
ls
index.html result.html …
#退出不會導致容器停止運行
exit
attach命令
docker run -itd -p 9001:80 badapple9/speedtest-x
#attach
docekr attach container ID
#進入容器執行命令
#退出 會導致容器停止運行
exit
容器快照導出/導入
docker export container ID > filename.tar
cat filename.tar | docker import – test/ubuntu:v1.0
(容器快照體積更小,僅記錄容器狀態,丟棄原始標簽等數據)
刪除容器
刪除處於停止狀態的容器:docker container rm name
清理所有處於停止狀態的容器:docker container prune

本文出自快速备案,转载时请注明出处及相应链接。

本文永久链接: https://kuaisubeian.cc/47385.html

kuaisubeian