Docker之容器管理
目錄
一、建立容器
使用 docker container run 命令建立容器,該命令有很多的選項,這些選項可以讓容器執行時具備我們想要的狀態。
$ docker container run --help
docker container run 常用選項:
OPTIONS | DESCRIBE |
-i,--interactive | 互動式介面 |
-t,--tty | 分配一個偽終端 |
-d,--detach | 在後臺執行容器 |
-e,--env | 設定環境變數 |
-p,--publish list | 釋出容器埠到主機 |
-P,--publish-all | 釋出容器所有EXPOSE的埠到主機的隨機埠 |
--name STRING | 指定容器別名 |
-h,--hostname | 設定容器主機名 |
--ip STRING | 指定容器ip,只能用於自定義網路 |
--network | 連線容器到一個網路 |
--mount mount | 將檔案系統附加到容器 |
-v,--volume list | 繫結掛載一個卷 |
--rm | 當容器退出時自動移除它 |
Example:
建立一個 tomcat 容器,取名 tomcat_1,並放入後臺執行
$ docker container run --name tomcat_1 -d tomcat:7.0 154038abdd941bd62ae252fd814effc15e595a72fa900fb0a9fe13ea180caad5
列出當前正在跑的容器
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
154038abdd94 tomcat:7.0 "catalina.sh run" 56 seconds ago Up 55 seconds 8080/tcp tomcat_1
欄位說明:
CONTAINER ID:隨機生成的容器ID
IMAGE:該容器是基於哪個映象建立的
COMMAND:啟動容器執行的命令
CREATED:容器建立時間
STATUS:執行狀態
PORTS:容器監聽的埠
NAMES:該容器的名稱
指定容器名稱、主機名和設定環境變數:
$ docker container run -d --name tomcat_2 -e VAR="hello,world" -h tomcat_2.example.com tomcat:7.0
ba11428a6b30a6829cb096fc9019a82b9845016d51a1a8b56a3c9d7155f19b46
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba11428a6b30 tomcat:7.0 "catalina.sh run" 32 seconds ago Up 31 seconds 8080/tcp tomcat_2
154038abdd94 tomcat:7.0 "catalina.sh run" 9 minutes ago Up 9 minutes 8080/tcp tomcat_1
進入容器 tomcat_2
$ docker container exec -it tomcat_2 /bin/bash
檢視變數VAR和主機名
[email protected]_2:/usr/local/tomcat# echo $VAR
hello,world
[email protected]_2:/usr/local/tomcat# hostname
tomcat_2.example.com
退出容器
Ctrl + p + q
建立一個容器 tomcat_3,從主機上暴露一個 8899埠 到容器的 8080埠,代表主機監聽 0.0.0.0 的 8899埠,將訪問這個埠的請求轉發到該容器的 8080埠
$ docker container run -d --name tomcat_3 -p 8899:8080 tomcat:7.0
6db0b5bb72c405d47a0dbf0d3c8f7c7676ad34b13a51ffc64fec05b74de5d02d
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6db0b5bb72c4 tomcat:7.0 "catalina.sh run" 8 seconds ago Up 7 seconds 0.0.0.0:8899->8080/tcp tomcat_3
ba11428a6b30 tomcat:7.0 "catalina.sh run" 8 minutes ago Up 8 minutes 8080/tcp tomcat_2
154038abdd94 tomcat:7.0 "catalina.sh run" 17 minutes ago Up 17 minutes 8080/tcp tomcat_1
二、容器資源管理
容器是密集型的,啟動大量的容器,如果不對其進行資源限制,難免會因為某個容器佔用大量資源,導致宿主機資源耗盡。
資源限制常用選項:
OPTIONS | DESCRIBE |
-m,--memory |
容器可以使用的最大記憶體 |
--memory-swap | 允許交換到磁碟的記憶體量 |
--memory-swappiness (0 to 100) (default -1) | 容器使用Swap分割槽交換的百分比 |
--oom-kill-disable | 禁用 OOM Killer |
--cpus | 可以使用的CPU數量 |
--cpuset-cpus (0-3, 0,1) | 限制容器使用的CPU核心 |
--cpu-shares | CPU共享(相對權重) |
Example:
限制容器最多使用500M記憶體和600M交換分割槽,並禁用OOM Killer。
$ docker container run -d --name nginx_1 --memory="500m" --memory-swap="600m" --oom-kill-disable nginx:1.14
b6321b45c90db555bb8df98b3c45a5aa7b89acff7e4f0e737c72171d4ffa1034
檢視 nginx_01 的記憶體限制及使用
$ docker stats --no-stream nginx_1
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b6321b45c90d nginx_1 0.00% 2.594MiB / 500MiB 0.52% 648B / 0B 0B / 0B 2
允許容器最多可以使用兩個半的CPU
$ docker container run -d --name nginx_02 --cpus="2.5" nginx:1.14
d220b844a18466aff1f55ad9142fd87516f6d2a84ebbba56f894a83d82182369
允許容器最多使用50%的CPU
$ docker container run -d --name nginx_03 --cpus=".5" nginx:1.14
184f4e8277e612c791c84295bc3de021a0ea05b7153ba169cc068ec50b7bb68d
建議設定 --memory 再禁用 OOM Killer,CPU使用率不超過 50%
三、資料管理
隨著容器刪除,容器裡產生的資料也會刪除,並且在容器裡操作的是最上層的可寫層,會經過儲存驅動管理,這種額外的抽象會降低效能。
容器的可寫層儲存資料,有一些缺陷:
當容器停止允許時,資料將不會持續存在,如果另一個程序需要這些資料,則很難將資料從容器中取出。並且容器刪除後,資料也會隨著刪除。容器的可寫層與容器允許的主機耦合度緊密,無法輕鬆地將資料移動到其它地方。容器的可寫層需要儲存驅動程式來管理檔案系統。儲存驅動程式使用Linux核心提供的聯合檔案系統,與直接在宿主機上寫入檔案相比,這種額外的抽象會降低效能。
(1)volumes:Docker管理宿主機檔案系統的一部分(/var/lib/docker/volumes/)。儲存資料的最佳方式。
(2)bind mounts:將宿主機上的任意位置的檔案或目錄掛載到容器中。
(3) tmpfs:掛載儲存在主機系統的記憶體中,而不會寫入主機的檔案系統。如果不希望將資料持久儲存在任何位置,可以使用tmpfs,同時避免寫入容器可寫層以提高效能。
1. volumes
特點:
多個容器之間共享資料。
當容器停止或被移除時,該卷依然存在。
多個容器可以同時掛載相同的卷。
當明確刪除卷時,卷才會被刪除。
$ docker volume --help
建立一個卷 nginx-vol
$ docker volume create nginx-vol
列出卷
$ docker volume ls
DRIVER VOLUME NAME
local nginx-vol
檢視卷的詳細資訊
$ docker volume inspect nginx-vol
[
{
"CreatedAt": "2018-09-27T04:24:26+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
允許容器時,使用上面建立的卷
$ docker container run -d --name nginx_04 -v nginx-vol:/usr/share/nginx/html nginx:1.14
6e80f1e4a5f99f9ff70eea842a00e7a7b73498b0ad0bdde9b42124b7da265032
進入容器 nginx_04,在 /usr/local/nginx/html 下建立一個測試檔案,然後在宿主機上 /var/lib/docker/volumes/ 目錄下進行檢視
$ docker container exec -it nginx_04 /bin/bash
[email protected]:/# echo "Hello,World!" > /usr/share/nginx/html/hello.txt
$ sudo cat /var/lib/docker/volumes/nginx-vol/_data/hello.txt
Hello,World!
移除卷,需要先停止容器,刪除容器,然後再移除卷
$ docker container stop nginx_04
$ docker container rm nginx_04
$ docker volume rm nginx-vol
也可以使用 nfs 共享儲存
$ docker volume create
--driver local \
--opt type=nfs \
--opt o=addr=192.168.5.101,rw \
--opt device=:/home/shares \
nginx-vol
2. bind mounts
特點:
從主機共享配置檔案到容器。
在Docker主機上的開發環境和容器之間共享程式碼。
當Docker主機的檔案或目錄結構保證與容器所需的繫結掛載一致時
在宿主機本地建立目錄,作為掛載源路徑
$ mkdir /home/qkc/www
$ echo 'How are you?' > /home/qkc/www/test.html
執行一個容器,掛載宿主機目錄。進入容器驗證。
注意:如果原始檔或目錄沒有存在,--mount 選項不會自動建立,而是會丟擲一個異常。
$ docker container run -d --name nginx_05 -v /home/qkc/www/:/usr/share/nginx/html nginx:1.14
58d7d1a821c5e43db31bad02dedf8c65d3bd83a064a7b9fecfeea7456ff5c907
$ docker exec -it nginx_05 /bin/bash
[email protected]:/# cat /usr/share/nginx/html/test.html
How are you?
$ docker inspect -f '{{.Mounts}}' nginx_05
[{bind /home/qkc/www /usr/share/nginx/html true rprivate}]
清理
$ docker container stop nginx_05
$ docker container rm nginx_05
四、容器管理
$ docker container --help
常用命令:
OPTIONS | DESCRIBE |
ls [-a] | 列出容器 |
inspect [-f] | 檢視一個或多個容器詳細資訊 |
exec | 在執行容器中執行命令 |
commit | 建立一個新映象來自一個容器 |
cp | 拷貝檔案或資料夾到一個容器 |
logs | 獲取一個容器的日誌 |
port | 列出或指定容器埠對映 |
top | 顯示一個容器執行的程序 |
stats | 顯示容器資源使用統計 |
stop/start/restart | 停止/啟動/重啟一個或多個容器 |
rm | 刪除一個或多個容器 |
列出當前正在執行的容器
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
038bc1d162df nginx:1.14 "nginx -g 'daemon of…" 8 seconds ago Up 6 seconds 0.0.0.0:8888->80/tcp nginx_07
列出所有容器,包括已停止的
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
038bc1d162df nginx:1.14 "nginx -g 'daemon of…" 9 seconds ago Up 7 seconds 0.0.0.0:8888->80/tcp nginx_07
ccced98a1397 nginx:1.14 "nginx -g 'daemon of…" About an hour ago Exited (0) 45 minutes ago nginx_04
檢視容器詳細資訊 JSON格式
$ docker container inspect nginx_07
在容器裡執行命令
$ docker container exec nginx_07 hostname
038bc1d162df
進入容器終端
$ docker container exec -it nginx_07 /bin/bash
[email protected]:/#
拷貝檔案或目錄到容器
$ touch test.py
$ docker container cp ./test.py nginx_07:/tmp/
$ docker container exec nginx_07 ls /tmp/
test.py
檢視容器日誌
$ docker container inspect -f '{{.NetworkSettings.IPAddress}}' nginx_07
172.17.0.2
$ docker container logs nginx_07
192.168.5.1 - - [26/Sep/2018:22:02:04 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063" "-"
檢視容器埠對映
$ docker container port nginx_07
80/tcp -> 0.0.0.0:8888
顯示容器執行的程序
$ docker container top nginx_07
UID PID PPID C STIME TTY TIME CMD
root 2155 2139 0 05:55 ? 00:00:00 nginx: master process nginx -g daemon off;
101 2189 2155 0 05:55 ? 00:00:00 nginx: worker process
root 2485 2139 0 05:57 pts/0 00:00:00 /bin/bash
顯示容器資源統計
$ docker container stats --no-stream nginx_07
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
038bc1d162df nginx_07 0.00% 1.836MiB / 3.842GiB 0.05% 2.58kB / 2.02kB 18.1MB / 0B 3
$ docker container stats nginx_07 # 動態生成
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
038bc1d162df nginx_07 0.00% 1.836MiB / 3.842GiB 0.05% 2.58kB / 2.02kB 18.1MB / 0B 3
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
038bc1d162df nginx_07 0.00% 1.836MiB / 3.842GiB 0.05% 2.58kB / 2.02kB 18.1MB / 0B 3
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
038bc1d162df nginx_07 0.00% 1.836MiB / 3.842GiB 0.05% 2.58kB / 2.02kB 18.1MB / 0B 3
匯出本地容器,這樣將匯出容器快照到本地檔案
$ docker container export nginx_07 > nginx07.tar
$ ls nginx07.tar
nginx07.tar
匯入容器,從容器快照檔案中再匯入映象
$ cat nginx07.tar | docker import - nginx:07
sha256:783dda08f8579c1f77b4447e1af10f9a23e0abcc15d61c7ba80469316d29eb20
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 07 783dda08f857 4 seconds ago 107MB
tomcat 7.0 372bd73e50e7 5 days ago 357MB
nginx 1.14 86898218889a 3 weeks ago 109MB
停止/啟動/刪除容器
$ docker container stop nginx_07
$ docker container start nginx_07
$ docker container stop nginx_07
$ docker container rm nginx_07
五、容器網路
Docker支援五種網路模式
(1)bridge
--net=bridge
預設網路,Docker啟動後建立一個 docker0 網橋,預設建立的容器也是新增到這個網橋中。
(2)host
--net=host
容器不會獲得一個獨立的 network namespace,而是與宿主機共用一個。這就意味著容器不會有自己的網絡卡資訊,而是使用宿主機的。這個預設下,容器除了網路,其它都是隔離的。
(3)none
--net=none
獲取獨立的 network namespace,但不為容器進行任何網路配置,需要我們手動配置。
(4)container
--net=container:Name/ID
與指定的容器使用同一個 network namespace,具有同樣的網路配置資訊,兩個容器除了網路,其它都還是隔離的。
(5)自定義網路
與預設的 bridge 原理一樣,但自定義網路具備內部 DNS 發現,可以通過容器名或者主機名容器之間網路通訊。
建立自定義網路,起兩個 busybox 容器都加入到該自定義網路中,驗證互相能夠解析
$ docker network create net_qkc
46cfda654093abdb11b450ffa096f7c474fde9f6729c09738e1c77161805da0e
$ docker run -d --name=c1 --net=net_qkc -it busybox:latest
$ docker run -d --name=c2 --net=net_qkc -it busybox:latest
$ docker exec c2 ping -c4 c1
PING c1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.100 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.122 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.067 ms
64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.101 ms
檢視指定網路的詳細資訊
$ docker network inspect net_qkc
容器網路訪問原理
Docker啟動後會建立一個 docker0 的網橋,當建立容器時,Docker 會使用 vethpair 建立一對虛擬網絡卡,一端放到新建立的容器中,並重命名 eth0,另一端放到宿主機上,以 veth+隨機7個字串命名,並將這個網路裝置加入到 docker0 網路中,網橋自動為容器分配一個 IP,並設定 docker0 的 IP 為容器預設閘道器。同時在 iptables 新增 SNAT 轉換網路段 IP 預設網段,以便容器訪問外網。
$ ip a | grep veth*
18: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-46cfda654093 state UP group default
20: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-46cfda654093 state UP group default
iptables 規則
$ sudo iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 32 packets, 2090 bytes)
pkts bytes target prot opt in out source destination
12 664 MASQUERADE all -- * !br-46cfda654093 172.18.0.0/16 0.0.0.0/0
0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
容器訪問外網時,資料包從容器 eth0 發出到 veth0,到達自己閘道器,也就是 docker0,到了主機走預設閘道器,匹配 iptables NAT 規則轉發,將資料包源 IP 地址轉換成 eth0 地址傳送出去。
外部訪問容器時,資料包線到達宿主機,宿主機收到資料包後匹配 iptables NAT 規則轉發給 docker0,docker0根據基於 Mac地址轉發到 veth0 介面的另一端容器裡的 eth0,容器處理資料,處理結果原路返回。
相關推薦
docker之容器管理常用命令篇
多個 filesyste 啟動 acc code ppi -- ike ces 常用命令如下表: 選項 描述 ls 列出容器 inspect 查看一個或多個容器詳細信息 exec 在運行容器中執行命令 commit 創建一個新鏡像來自一個容器 cp 拷貝
Docker之容器管理
目錄 一、建立容器 使用 docker container run 命令建立容器,該命令有很多的選項,這些選項可以讓容器執行時具備我們想要的狀態。 $ docker container run --help docker container run
docker之容器管理篇
error ats 無法 ofo 說明 label start pub new 一、創建容器常用選項 1.1常用選項如下表: 選項 描述 -i, --interactive 交互式 -t, --tty 分配一個偽終端 -d, --detach 運行容器到
docker之容器網絡篇
支持 status tro afa 主機名 nta creat ipa idg 一、docker網絡模式 Docker支持五種網絡模式:A、bridge--net=bridge默認網絡,Docker啟動後創建一個docker0網橋,默認創建的容器也是添加到這個網橋中。B、h
Docker之容器常見操作
some ports ctrl+ exec 信息 參數說明 守護 all -h 一、啟動容器 啟動容器有兩種方式,一種是基於鏡像新建一個容器並啟動,另外一個是將在終止狀態(stopped ) 的容器重新啟動。因為 Docker 的容器實在太輕量級了,很多時候用戶都是隨時刪除
Docker之容器日期解決
將業務應用製作成映象,以容器的方式執行之後,發現在容器中獲取的日期不是國內使用的東八區時間,這肯定不行的,應用與時間緊密相關,所以要解決這個問題。 由於我們的應用是基於Springboot的,所以通過Dockerfile的形式製作為映象。解決方法是在D
docker之倉庫管理
倉庫認識 docker 倉庫,即所謂registry,實現了映象的管理、分發,同時還包括使用者的認證。dockerregistry倉庫是一個無狀態的、高可靠的伺服器應用程式,用來儲存docker映象。docker.io為docker官方的倉庫,預設所有的pull
Docker之容器的基本操作
1.1.啟動容器 docker run IMAGE [COMMAND] [ARG...] 在新容器中執行命令 1.1.1.樣例 -輸出hello world www.0001.GA@gaoxinfu MINGW64 /d/Program Files/Docker Toolb
Docker之映象管理及Dockerfile
目錄 映象: 1. 一個分層儲存的檔案: 優點:易於擴充套件、優化儲存空間 2. 一個軟體的環境 3. 一個映象可以用於建立多個容器 4. 一種標準化的交付 一、映象工作原理 映象不是一個單一的檔案,而是有多層構成。
docker之容器訪問和網絡連接(三)
-name 應用容器 network http containe 地址 ins ODB names 前言 當一臺服務器上部署了多個應用容器,它們直接可能需要相互通信,比如web應用容器需要訪問mysql數據庫容器。 主機訪問容器 通過映射端口的形式我們可以在外部訪問容器內的
11、《每天5分鐘玩轉Docker容器技術》學習-Docker命令之容器生命周期管理
hostman cloudman cloud openstack docker a) Docker create 命令docker create :創建一個新的容器但不啟動它docker create [OPTIONS] IMAGE [COMMAND] [ARG...]-a stdin:
docker數據管理與網絡通信之數據卷與數據卷容器
file var 個數 exe 運行 roc 80端口 兩種 watermark 管理Docker容器中數據主要有兩種方式:數據卷和數據卷容器。 數據卷 數據卷是一個供容器使用的特殊目錄,位於容器中,可將宿主機的目錄掛載到數據卷上,雖對數據卷的修改操作立刻可見,並且更新數據
docker筆記之初體驗(容器管理)
容器基本操作: 建立一個容器 [[email protected] ~]# docker run -itd ubuntu 3635f4dd3ae30a4377fc4f2eafc191b7890bbe5873bb4e5f9e5077f794466ec4 檢視容器
Docker容器技術之映象管理基礎(三)
上一篇文章連結:Docker容器技術基礎用法(二) 目錄 一、回顧 1.1docker容器的狀態 1.2docker容器管理時常用的命令 1.3docker的架構形式 二、About Docker Images 2.1 關於docker映象的作用
Docker之搭建2048遊戲,四種網路模式的學習,容器和管理,資料卷的管理,用Dockerfile建立映象
1.映象管理 物理機上: 軟體包: docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm [
docker一: 鏡像與容器管理
docker 鏡像 容器 Docker的優勢:1、啟動非常快,秒級實現。2、資源利用率高,在機器中以進程的方式存在,一臺機器可以跑上百個docker容器。3、創建和配置後可以在任意地方運行docker,只需將其上傳到docker倉庫,用到時拉下來就可以4、易遷移,平臺依賴性不強。Docker的主要
docker鏡像、容器管理
dockerDocker優勢1) 更高效的利用系統資源無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。2)更快速的啟動時間Docker 容器應用,由於直接運行於宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟動時間。3)一致的運行環境Docker 的鏡像提供了除內核
Docker容器管理
發送 停止 一段時間 一個 con doc 實現 ons style 創建容器: docker create -it [NAME]:[TAG] 啟動容器: docker start ID 創建並啟動容器: docker run -it [NAME]:[TAG]
Docker(十二):Docker集群管理之Compose
png eas version pull 是否 com a star reat volume 1、Compose安裝 curl -L https://github.com/docker/compose/releases/download/1.1.0/docker-com
Docker系列(三)容器管理
mozilla http 格式 file tor centos determine dia 進程 3.1 新建容器並啟動所需要的命令主要為docker run [root@localhost ~]# docker run centos /bin/echo "syavi