2--Docker容器相關命令
阿新 • • 發佈:2021-07-28
目錄
一、docker容器基本操作
容器就是對外提供服務的一個例項。
容器啟動的必要條件:容器內至少有一個程序執行在前臺.
docker是一個程序隔離的軟體,所執行的程序全部都執行在作業系統之上
一個容器內部只允許執行一個應用
說明:我們有了映象才可以建立容器,Linux,下載一個centos映象來測試學習
[root@docker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
1、建立容器(執行映象)
格式
docker run [引數] [映象名稱] [執行容器的啟動命令]
# ps : 建立容器的命令(並未啟動)
docker create
[root@k8s-m-01 ~]# docker create centos bash
ecfb35a4734e91dff21f6a0dd859083364cc3def4f37434625210a250632f68b
引數
-d : 以守護程序的方式執行一個容器(後臺執行) docker run -d [映象名稱] [cmd] --name : 指定容器的名稱(將容器名稱解析到docker DNS上) docker run -d --name [容器名稱] [映象的名稱] [cmd] -p : 指定埠對映 docker run -d -p 宿主主機埠:容器內埠 [映象名稱] [cmd] -P :隨機埠對映 docker run -d -P [映象名稱] [cmd] -i : 開啟標準輸出 -t : 建立一個偽終端 docker run -it [映象名稱] [cmd] -v : 掛載目錄到容器中/做目錄對映(宿主主機和docker容器主機間的檔案共享) docker run -v 宿主主機目錄:容器內目錄 [映象名稱] [cmd] --rm : 容器生命週期結束時立即刪除該容器 docker run --rm [映象名稱] [cmd] 引數: -f 強制刪除 -e : 在容器中建立一個環境變數 docker run -e NAME=Centos -d [映象名稱] [cmd] [root@k8s-m-01 ~]# docker run -it -e NAME=linux12 centos bash [root@aa67f4bebdc1 /]# printenv ... ... NAME=linux12 ... ... --link : 連線上另外一個容器,實現網路互通 docker run --link 被連線的容器的名稱:連線別名 [映象名稱] [cmd] 注意:給連線起別名最好和被連線的容器的名稱一致 -h : 設定容器主機名 docker run -h "主機名" [映象名稱] [cmd] -m : 設定容器記憶體限制(預設:-1即為不做任何限制)
例項
[root@docker ~]# docker run -it centos /bin/bash #啟動並進入容器
WARNING: IPv4 forwarding is disabled. Networking will not work.
[root@bf0b90672aed /]# ls #檢視容器內的centos,基礎版本,很多命令都是不完善的
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@bf0b90672aed /]# exit #從容器中退回主機(容器停止並退出)
exit
Ctrl+p+q快捷鍵:容器不停止退出
#部署nginx
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4f380adfc10f 13 days ago 133MB
alpine latest d4ff818577bc 2 weeks ago 5.6MB
caodan999/alpine latest 965ea09ff2eb 20 months ago 5.55MB
nginx 1.12.2 4037a5562b03 3 years ago 108MB
[root@docker ~]# docker tag 4037a5562b03 caodan/nginx:v1.12.2
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4f380adfc10f 13 days ago 133MB
alpine latest d4ff818577bc 2 weeks ago 5.6MB
caodan999/alpine latest 965ea09ff2eb 20 months ago 5.55MB
caodan/nginx v1.12.2 4037a5562b03 3 years ago 108MB
nginx 1.12.2 4037a5562b03 3 years ago 108MB
[root@docker ~]# docker run --rm --name mynginx -d -p81:80 caodan/nginx:v1.12.2
68815d7a018f580343665524fc603032b8565c8389c2ed728bf45d8cc1971879
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68815d7a018f caodan/nginx:v1.12.2 "nginx -g 'daemon of…" 5 seconds ago Up 3 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp mynginx
[root@docker ~]# netstat -lntp |grep 81
tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN 11835/docker-proxy
tcp6 0 0 :::81 :::* LISTEN 11841/docker-proxy
[root@docker ~]# curl 127.0.0.1:81
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
... ...
docker run
執行流程
- 1、檢查本地是否用指定映象,如果沒有則去對應的倉庫下載映象
- 2、啟動容器,如果指定了命令則使用指定的命令,如果沒有則使用預設的命令
- 3、返回容器ID
2、檢視本機的容器列表
格式
docker ps [引數]
docker ps # 檢視當前系統中正在執行的容器列表
引數
-a : 檢視系統中所有的容器。
-q : 僅顯示容器的ID
-n=: 顯示最近建立的容器
狀態解釋
[root@k8s-m-01 ~]# docker ps -a
... ... ...
CONTAINER ID : 容器ID
IMAGE :映象名稱
COMMAND :容器啟動時執行的命令
CREATED :容器的建立時間
STATUS :容器的狀態(up : 正在執行, Exit:退出(停止)狀態 Created :已建立狀態)
PORTS :容器向外暴露的埠
NAMES :容器的名稱
3、停止和啟動一個容器
停止
docker stop [容器的ID|名稱]
啟動(該容器必須是系統已經存在的容器)
docker start [容器的ID|名稱]
重啟
docker restart [容器的ID|名稱]
殺死
docker kill [容器的ID|名稱]
例項
[root@docker ~]# docker run -it centos #先執行一個容器
WARNING: IPv4 forwarding is disabled. Networking will not work
[root@6f5810623fa2 /]# exit #退出並停止執行
exit
[root@docker ~]# docker ps #檢視正在執行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker ~]# docker ps -a #檢視歷史執行過的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f5810623fa2 centos "/bin/bash" 35 seconds ago Exited (0) 23 seconds ago musing_borg
[root@docker ~]# docker start 6f5810623fa2 #開始centos容器
6f5810623fa2
[root@docker ~]# docker ps #檢視正在執行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f5810623fa2 centos "/bin/bash" About a minute ago Up 12 seconds musing_borg
[root@docker ~]# docker stop 6f5810623fa2 #停止centos容器
6f5810623fa2
[root@docker ~]# docker ps #檢視正在執行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4、* 埠印射
-p host_port:container_port
docker run -p 容器外埠:容器內埠
[root@docker ~]# systemctl stop firewalld
[root@docker ~]# setenforce 0
setenforce: SELinux is disabled
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
caodan920/nginx v1.20.1 7ca45f2d188b 2 weeks ago 133MB
nginx 1.20.1 7ca45f2d188b 2 weeks ago 133MB
[root@docker ~]# docker run --rm --name mynginx -d -p81:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
b4d181a07f80: Already exists
66b1c490df3f: Pull complete
d0f91ae9b44c: Pull complete
baf987068537: Pull complete
6bbc76cbebeb: Pull complete
32b766478bc2: Pull complete
Digest: sha256:3ca76089b14cf7db77cc5d4f3e9c9eb73768b9c85a0eabde1046435a6aa41c06
Status: Downloaded newer image for nginx:latest
16e027dfab716d7d243c7d8db9367d3ec802b69b01a36fed62d0455a82d2a1f0
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16e027dfab71 nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp mynginx
[root@docker ~]# curl 127.0.0.1:81
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
... ...
5、* 掛載資料卷
docker run -v 容器外目錄:容器內目錄
[root@docker ~]# mkdir html
[root@docker ~]# cd html
[root@docker html]# wget www.baidu.com -O index.html
--2021-07-08 08:52:39-- http://www.baidu.com/
Resolving www.baidu.com (www.baidu.com)... 112.80.248.76, 112.80.248.75
Connecting to www.baidu.com (www.baidu.com)|112.80.248.76|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2381 (2.3K) [text/html]
Saving to: ‘index.html’
100%[=================================>] 2,381 --.-K/s in 0s
2021-07-08 08:52:44 (327 MB/s) - ‘index.html’ saved [2381/2381]
[root@docker html]# cat index.html
<!DOCTYPE html>
... ...
[root@docker html]# cd
[root@docker ~]# docker run -d --rm --name nginx_baidu -d -p82:80 -v /root/html:/usr/share/nginx/html nginx
a600e50b1a1ebce161b71dd5c47ce6f2bccb29f558a652adf39047e78f0151f3
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a600e50b1a1e nginx "/docker-entrypoint.…" 19 seconds ago Up 17 seconds 0.0.0.0:82->80/tcp, :::82->80/tcp nginx_baidu
16e027dfab71 nginx "/docker-entrypoint.…" 13 minutes ago Up 13 minutes 0.0.0.0:81->80/tcp, :::81->80/tcp mynginx
檢視掛載的詳細資訊
[root@docker ~]# docker inspect nginx_baidu |grep -A 9 'Mounts'
"Mounts": [
{
"Type": "bind",
"Source": "/root/html",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
6、* 傳遞環境變數
-e variate_name=variate_value
docker run -e 環境變數key:環境變數value
[root@docker ~]# docker run --rm -e E_OPTS=abcdefg nginx printenv
HOSTNAME=bd14d48c46d7
HOME=/root
PKG_RELEASE=1~buster
NGINX_VERSION=1.21.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NJS_VERSION=0.6.1
PWD=/
E_OPTS=abcdefg
#printenv:打印出環境變數的所有值
#傳遞多個環境變數
[root@docker ~]# docker run --rm -e E_OPTS=abcd -e C_OPTS=123456 nginx printenv
C_OPTS=123456
HOSTNAME=77295251509c
HOME=/root
PKG_RELEASE=1~buster
NGINX_VERSION=1.21.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NJS_VERSION=0.6.1
PWD=/
E_OPTS=abcd
7、* 容器內安裝軟體(工具)
紅帽系 yum
debian系 apt-get
alpine apt
# 進入容器並且下載
[root@docker ~]# docker exec -it nginxbaidu /bin/bash
root@acf79798ce19:/# curl
bash: curl: command not found
root@acf79798ce19:/# tee /etc/apt/sources.list << EOF
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
EOF
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
root@acf79798ce19:/# cat /etc/apt/sources.list
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
root@acf79798ce19:/# apt-get update && apt-get install curl -y
Ign:1 http://mirrors.163.com/debian jessie InRelease
... ...
安裝好後commit並且推送到倉庫
[root@alice ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
acf79798ce19 nginx:1.12.2 "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:84->80/tcp nginx_with_baidu
6ce9e4bb303b nginx:1.12.2 "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:83->80/tcp nginx
[root@alice ~]# docker commit -p acf79798ce19 mmdghh/nginx:curl
sha256:84b7a98f5ee209f0139febe7cac04a7edaaca7254ddf1c043e8ac779504204ba
[root@alice ~]# docker push docker.io/mmdghh/nginx:curl
The push refers to repository [docker.io/mmdghh/nginx]
bbadc5b62281: Pushed
4258832b2570: Mounted from library/nginx
683a28d1d7fd: Pushed
d626a8ad97a1: Mounted from library/nginx
curl: digest: sha256:f86f97bacf0ff37e3cc09f98dfb8153c486ee1e8bb9caad5046ed6aa58c43c50 size: 1160
8、刪除容器
格式
docker rm [容器名稱|ID]
引數
-f : 強制刪除docker rm -f [容器名稱|ID]
清空容器
docker rm $(docker ps -a -q)docker ps -a -q | xargs docker rm
常用的指令碼:過濾出所有鎖主機上退出的容器,然後幹掉
[root@docker ~]# for i in `docker ps -a|grep -i exit|awk '{print $1}'`;do docker rm -f $i;done
例項
[root@docker ~]# docker rm 1714ae45e360 #刪除正在執行容器會報錯
Error response from daemon: You cannot remove a running container 1714ae45e360243fee68c907f335b34c83fb70217f4216e33a615a71ca66d23a. Stop the container before attempting removal or force remove
[root@docker ~]# docker rm -f 1714ae45e360 #強制刪除
1714ae45e360
[root@docker ~]# docker ps -aq
bf0b90672aed
7518288dddfb
64a7c388b5f8
[root@docker ~]# docker rm -f $(docker ps -aq) #刪除所有容器
bf0b90672aed
7518288dddfb
64a7c388b5f8
[root@docker ~]# docker ps -aq
9、檢視容器詳細資訊
格式
docker inspect [容器名稱|ID]
怎麼監控docker執行狀態?
docker inspect -f '{{.State.Running}}' nginx
10、複製命令
將檔案複製到或複製出容器
# 1、複製到容器內
docker cp [宿主主機檔案路徑] 容器ID或名稱:容器內路徑
# 2、複製到容器外
docker cp 容器ID:容器內路徑 [宿主主機檔案路徑]
例項(從容器內拷貝檔案到主機上)
[root@docker ~]# docker run -it centos /bin/bash #先執行一個容器
WARNING: IPv4 forwarding is disabled. Networking will not work.
[root@94654381fb70 /]# cd /home #切換到家目錄
[root@94654381fb70 home]# ls
[root@94654381fb70 home]# touch test.java #建一個檔案
[root@94654381fb70 home]# ls
test.java
[root@94654381fb70 home]# exit #退出
exit
[root@docker ~]# docker ps -a #檢視程序號
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94654381fb70 centos "/bin/bash" 26 minutes ago Exited (0) 23 minutes ago
[root@docker ~]# docker cp 94654381fb70:/home/test.java /home #拷貝容器裡那個檔案到主機的家目錄
[root@docker ~]# cd /home #切換到主機的家目錄
[root@docker home]# ls #檢視拷貝的檔案
test.java
11、進入當前正在執行的容器
我們通常容器都是使用後臺方式執行的,需要進入容器,修改一些配置,進入容器一般有四種
1、exec : 在容器外向容器內執行一個命令(官方推薦)
docker exec [引數] [容器的名稱或ID] [cmd]
#例項:
[root@docker ~]# docker exec -it a428029e2e1b /bin/bash
2、attach : 在早期docker提供的進入容器的命令(缺點:當其結束時,容器也跟著結束了/ 通過程序管道連線上容器內部PID為1的程序
docker attach [容器ID|名稱]
#例項:
[root@docker ~]# docker attach a428029e2e1b
[root@a428029e2e1b /]#
3、nsenter : 建立一個管道連線上容器主ID
nsenter --target $( docker inspect -f {{.State.Pid}} 30d369d70bcd) --mount --uts --ipc --net --pid
4、ssh : 通過ssh連線
## exec和attach進入容器的區別:
- exec :進入容器後開啟一個新的終端,可以在裡面操作(常用)
- attach :進入容器正在執行的終端,不會啟動新的程序
12、檢視容器內部的日誌
#1.本身容器沒有日誌
docker logs -f -t --tail [容器ID/容器名稱]
-f :實時列印日誌
#2.執行一個程式(編寫一個指令碼)
docker run -d centos /bin/bash -c "while true; do echo 123;sleep 1;done"
-c:指定動作
#3.檢視執行的容器
[root@docker ~]# docker ps
CONTAINER ID IMAGE
73f41ee70158 centos
#4.顯示日誌
docker logs -tf --tail 10 73f41ee70158 #顯示10條日誌內容
doc
13、檢視容器內部的程序資訊
檢視容器內部的程序資訊(容器必須是執行的,必須用容器ID檢視)
[root@docker ~]# docker top a428029e2e1b
UID PID PPID C STIME TTY TIME CMD
root 16108 16088 0 01:10 pts/0 00:00:00 /bin/bash