docker之容器常用命令及基本操作
docker之容器常用命令及基本操作
文章目錄
- docker之容器常用命令及基本操作
- 一、查看容器
- `docker ps`常用選項
- 二、查看容器日志
- `docker logs`命令選項
- 三、運行容器
- 補充
- 目錄掛載(容器數據卷操作)
- 匿名掛載
- 具名掛載
- 指定目錄掛載
- 查看目錄掛載關系
- 只讀/讀寫
- volumes-from(繼承)
- 四、退出容器
- 五、重啟容器
- 六、啟動容器
- 七、停止容器
- 八、強制停止容器
- 九、刪除已停止的容器
- 十、進入容器
- 2.`exec`(官方推薦使用)
- 3.nsenter
- 補充:
- 創建并進入容器
- 守護式方式創建容器
- **登錄守護式容器方式**
- 十一、復制文件
- 從容器內復制文件到宿主主機
- 從宿主機復制文件到容器
- 刪除容器
- 十二、查看容器IP地址
一、查看容器
ps:該子命令能查看當前正在運行的容器
示例:
[root@localhost ~ ]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b1a13dfe7105 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32774->80/tcp reverent_maxwell字段說明:
- CONTAINER ID:容器 ID
- IMAGE:所屬鏡像
- COMMAND:
- CREATED:創建時間
- STATUS:容器狀態
- PORTS:端口
- NAMES:容器名稱
docker ps常用選項
-a: 查看所有容器(包括運行和停止)
docker ps -a-f:查看停止的容器
docker ps -f status=exited-q:靜默模式,僅顯示ID信息
[root@localhost ~ ]# docker ps -aq b1a13dfe7105-n:列出最近創建的 n 個容器。
docker ps -n 5-l : 查看最后一次運行的容器
docker ps -linspect
該命令能夠查看該容器詳細信息
[root@localhost ~ ]# docker inspect b1a13dfe7105 [{"Id": "b1a13dfe71056d8c02fb90e52a503bbedc60301f62e9c49604fa86c2258fd310","Created": "2020-12-05T12:18:17.241753416Z","Path": "/docker-entrypoint.sh","Args": ["nginx","-g","daemon off;"。。。省略行。。。同樣支持 -f 選項過濾指定信息。
[root@localhost ~ ]# docker inspect -f '{{.Id}}' b1a13dfe7105 b1a13dfe71056d8c02fb90e52a503bbedc60301f62e9c49604fa86c2258fd310二、查看容器日志
- 格式:docker logs [option] [容器名稱或ID]
docker logs命令選項
- -f:跟蹤日志輸出。類似tail -f命令。
- –since:顯示某個開始時間的所有日志。
- -t:顯示時間戳。
- –tail N:僅列出最新N條容器日志。
示例:
[root@localhost ~ ]# docker logs b1a13dfe7105 /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf顯示時間戳:
[root@localhost ~ ]# docker logs -t b1a13dfe7105 2020-12-05T12:18:17.500960288Z /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration 2020-12-05T12:18:17.500995723Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ 。。。省略行。。。僅顯示三條日志:
# 僅查看3條日志。 [root@localhost ~ ]# docker logs --tail 3 b1a13dfe7105 192.168.112.1 - - [05/Dec/2020:13:46:53 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "http://192.168.112.129:32775/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-" 192.168.112.1 - - [05/Dec/2020:13:46:54 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-" 192.168.112.1 - - [05/Dec/2020:13:46:55 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-"查看2020年12月5日之后的日志:
# 日期格式不能錯誤。 [root@localhost ~ ]# docker logs --since="2020-12-04" b1a13dfe7105 /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Configuration complete; ready for start up /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration 。。。省略行。。。三、運行容器
docker run能將一個鏡像運行為容器。容器當中至少有一個進程運行在前臺。
- 格式:docker run [選項] [鏡像名稱|鏡像ID] [容器啟動后內部執行的命令]
docker run 命令常用選項:
-d : 以守護進程的方式運行(在 run 后面加上 -d 參數,則會創建一個守護式容器在后臺運行(這樣創建容器后不會自動登錄容器,如果只加 -i -t 兩個參數,創建容器后就會自動進容器里))
-p : 指定端口映射前者是宿主機端口,后者是容器內的映射端口。可以使用多個 -p 做多個端口映射。
# 格式 docker run -p 宿主主機端口:容器向外暴露的端口 [鏡像名稱:tag | 鏡像ID] docker run -d -p 8899:80 nginx:1.19.2-P : 隨機端口映射,隨機使用宿主機的可用端口與容器內暴露的端口映射。
docker run -d -P nginx:1.19.2–name: 指定容器的名稱(為創建的容器命名),同一臺宿主主機上的docker名稱不能重復。
docker run -d --name 自定義容器名 -P nginx:1.19.2–rm:當一個容器停止后,就立即刪除。
docker run -d --rm nginx:1.19.2-i : 表示運行容器
-t : 表示容器啟動后會進入其命令行。加入這兩個參數后,容器創建就能登錄進去。即分配一個偽終端;通常和-i連用
# 運行容器后執行bash命令。 docker run -ditP nginx bash-e : 在容器內設置一個環境變量。
docker run -d -e NGINX_NAME=nginx nginx:1.19.2–network 指定網絡模式,下篇再講docker網絡。
–link:鏈接到另一個容器。
-h:指定容器內的主機名。
-v: 映射存儲卷,可以映射文件及文件夾。表示目錄映射關系(前者是宿主機目錄,后者是映射到宿主機上的目錄),可以使用多個 -v 做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上做修改,然后共享到容器上;映射后在宿主機文件內的修改都會映射到容器內的文件中。
docker run -d -v 宿主機文件路徑:容器內文件路徑 nginx:1.19.2補充
目錄掛載(容器數據卷操作)
我們可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器,而且這個操作是雙向綁定的,也就是說容器內的操作也會影響到宿主機,實現備份功能。
但是容器被刪除的時候,宿主機的內容并不會被刪除。如果多個容器掛載同一個目錄,其中一個容器被刪除,其他容器的內容也不會受到影響。
容器與宿主機之間的數據卷屬于引用的關系,數據卷是從外界掛載到容器內部中的,所以可以脫離容器的生命周期而獨立存在,正是由于數據卷的生命周期并不等同于容器的生命周期,在容器退出或者刪除以后,數據卷仍然不會受到影響,數據卷的生命周期會一直持續到沒有容器使用它為止。
創建容器添加 -v 參數,格式為宿主機目錄:容器目錄,例如:
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7 # 多目錄掛載 docker run -di -v /宿主機目錄:/容器目錄 -v /宿主機目錄2:/容器目錄2 鏡像名目錄掛載操作可能會出現權限不足的提示。這是因為 CentOS7 中的安全模塊 SELinux 把權限禁掉了,在 docker run 時通過 --privileged=true 給該容器加權限來解決掛載的目錄沒有權限的問題。
匿名掛載
匿名掛載只需要寫容器目錄即可,容器外對應的目錄會在 /var/lib/docker/volume 中生成。
# 匿名掛載 docker run -di -v /usr/local/data --name centos7-02 centos:7 # 查看 volume 數據卷信息 docker volume ls具名掛載
具名掛載就是給數據卷起了個名字,容器外對應的目錄會在 /var/lib/docker/volume 中生成。
# 匿名掛載 docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7 # 查看 volume 數據卷信息 docker volume ls指定目錄掛載
一開始給大家講解的方式就屬于指定目錄掛載,這種方式的掛載不會在 /var/lib/docker/volume 目錄生成內容。
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7 # 多目錄掛載 docker run -di -v /宿主機目錄:/容器目錄 -v /宿主機目錄2:/容器目錄2 鏡像名查看目錄掛載關系
通過 docker volume inspect 數據卷名稱 可以查看該數據卷對應宿主機的目錄地址。
[root@localhost ~]# docker volume inspect docker_centos_data [{"CreatedAt": "2020-08-13T20:19:51+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/docker_centos_data/_data","Name": "docker_centos_data","Options": null,"Scope": "local"} ]通過 docker inspect 容器ID或名稱 ,在返回的 JSON 節點中找到 Mounts,可以查看詳細的數據掛載信息。
只讀/讀寫
# 只讀。只能通過修改宿主機內容實現對容器的數據管理。 docker run -it -v /宿主機目錄:/容器目錄:ro 鏡像名 # 讀寫,默認。宿主機和容器可以雙向操作數據。 docker run -it -v /宿主機目錄:/容器目錄:rw 鏡像名volumes-from(繼承)
# 容器 centos7-01 指定目錄掛載 docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7 # 容器 centos7-04 和 centos7-05 相當于繼承 centos7-01 容器的掛載目錄 docker run -di --volumes-from centos7-01:ro --name centos7-04 centos:7 docker run -di --volumes-from centos7-01:rw --name centos7-05 centos:7四、退出容器
- exit : 容器停止退出
- Ctrl+P+Q : 容器不停止退出
五、重啟容器
當修改了容器內某些配置文件后,可以使用此命令使配置生效
- 格式:docker restart [容器名稱 | 容器ID]
六、啟動容器
- docker start [容器ID / 容器名]
七、停止容器
- docker stop [容器ID / 容器名]
- docker stop -f $(docker ps -qa) (所有)
八、強制停止容器
- docker kill [容器ID / 容器名]
九、刪除已停止的容器
- docker rm [容器ID]
- docker rm -f $(docker ps -qa)
十、進入容器
在使用容器的過程中,我們難免需要進入容器進行排查問題。下面來介紹進入容器的四種方式。
1、attach
通過管道,連接容器內PID=1的進程,容器至少有一個進程運行前臺。attach 是最早 docker 官方推出的進入容器的命令了,不過使用該命令有一個問題。當多個窗口同時使用該命令進入該容器時,所有的窗口都會同步顯示。如果有一個窗口阻塞了,那么其他窗口也無法再進行操作,當所有窗口退出時,容器結束。
- 格式 :docker attach [容器名或ID]
2.exec(官方推薦使用)
繼attach 之后,exec 是官方推出的有一個新的進入容器的命令,這也是目前推薦使用的進入容器的方式。這個命令相當于在容器中執行一個命令。
- 格式 : docker exec [參數] [容器名或ID] [命令]
示例:
[root@localhost ~ ]# docker exec -it reverent_maxwell sh 用這種方式相當于進入該容器,并且在退出時不會將容器也停止。3.nsenter
進入容器中,但不進入容器內的進程。Nsenter 是 Linux 提供的命令。需要配合 docker inspect 來使用(早期沒有 exec 命令時,企業當中最長用的方式之一),Docker 是用 golang 語言開發,所以它也支持 go 語言的模板語法。
- 配合 docker inspect 來使用
- 格式示例:nsenter --target $( docker inspect -f {{.State.Pid}} nginxv1 ) --mount --uts --ipc --net --pid
4、ssh
在鏡像(或容器) 中安裝 SSH Server,這樣就能保證多人進入容器且相互之間不受干擾了,相信大家在當前的生產環境中(沒有使用 Docker 的情況)也是這樣做的。但是使用了 Docker 容器之后不建議使用 ssh 進入到 Docker 容器內。
- 在容器里面安裝一個 sshd 服務
補充:
創建并進入容器
下面這行命令的意思就是通過鏡像 AA 創建一個容器 BB,運行容器并進入容器的 /bin/bash
docker run -it --name 容器名稱 鏡像名稱:標簽 /bin/bash注意:Docker 容器運行必須有一個前臺進程, 如果沒有前臺進程執行,容器認為是空閑狀態,就會自動退出。
守護式方式創建容器
docker run -di --name 容器名稱 鏡像名稱:標簽登錄守護式容器方式
# 停止容器 docker stop 容器名稱|容器ID # 啟動容器 docker start 容器名稱|容器ID十一、復制文件
復制命令類似于 Linux 系統中的 scp 命令,是將宿主主機上的內容上傳到容器中,也可能是將容器中的文件下載到宿主主機中。
從容器內復制文件到宿主主機
- 格式:docker cp [容器ID:容器內文件路徑] 宿主主機路徑
示例
[root@Stupidkid ~]# docker cp d78575358e04:/usr ./ [root@Stupidkid ~]# ll 總用量 919344 -rw-------. 1 root root 1526 11月 13 20:15 anaconda-ks.cfg -rw-r--r--. 1 root root 0 12月 6 19:47 export_nginx.tar -rw-r--r--. 1 root root 2340 12月 6 10:05 pic_spider.py -rw-r--r--. 1 root root 941396992 12月 4 19:40 python3_django.tar drwxr-xr-x. 10 root root 105 11月 17 08:00 usr從宿主機復制文件到容器
-
格式 : docker cp 宿主主機路徑 [容器ID:容器內文件路徑]
-
示例:
[root@Stupidkid ~]# docker cp ./export_nginx.tar d78575358e04:/home [root@Stupidkid ~]# docker exec d78575358e04 ls /home export_nginx.tar
刪除容器
stop命令僅僅是將容器停止,若要刪除容器則使用docker rm命令。
格式:
docker rm [option] [鏡像名稱或ID]rm能刪除已停止的容器,對于正在運行的容器可以使用-f選項強制刪除,一般不推薦直接將一個正在運行的容器強制刪除。
實例:
# 查看正在運行的容器。 [root@localhost ~ ]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1a9b4ae8766b nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp pedantic_hopper # 直接使用rm無法刪除。 [root@localhost ~ ]# docker rm 1a9b4ae8766b Error response from daemon: You cannot remove a running container 1a9b4ae8766b9266f0e5256df1ac56b9647483815f60b447ae9f15d6c3355dec. Stop the container before attempting removal or force remove # 使用-f選項可以強制刪除。 [root@localhost ~ ]# docker rm -f 1a9b4ae8766b 1a9b4ae8766b使用docker ps -a與rm和stop命令配合,可以達到一個批量處理容器的方式:
# 停止所有正在運行的容器 docker stop $(docker ps)# 刪除所有容器,包括正在運行的容器 docker rm -f $(docker ps -a)十二、查看容器IP地址
我們可以通過以下命令查看容器的元信息。
docker inspect 容器名稱|容器ID也可以直接執行下面的命令直接輸出 IP 地址。
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱|容器ID總結
以上是生活随笔為你收集整理的docker之容器常用命令及基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一卡通+智慧化工厂,实现对化工厂人员定位
- 下一篇: html文字竖排垂直居中显示,CSS文字