docker中run和exec有什么區(qū)別示例詳解
docker run
和 docker exec
都是 Docker 中用來(lái)與容器交互的命令,但它們的用途和行為有很大的不同。下面我會(huì)詳細(xì)解釋它們之間的區(qū)別。
1. docker run
docker run
命令用于 創(chuàng)建并啟動(dòng)一個(gè)新的容器,并且可以運(yùn)行一個(gè)命令或指定一個(gè)程序。每次使用 docker run
時(shí),都會(huì)從鏡像創(chuàng)建一個(gè)新的容器實(shí)例。
用法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
特點(diǎn):
- 創(chuàng)建并啟動(dòng)容器:
docker run
會(huì)啟動(dòng)一個(gè)新的容器實(shí)例,基于指定的鏡像。 - 運(yùn)行一個(gè)命令:你可以指定一個(gè)命令來(lái)在容器中運(yùn)行(如果沒(méi)有指定命令,則會(huì)運(yùn)行鏡像的默認(rèn)命令,通常是鏡像中定義的
ENTRYPOINT
或CMD
)。 - 可以傳遞參數(shù):可以為容器指定參數(shù)(如掛載卷、設(shè)置環(huán)境變量、端口映射等)。
- 容器生命周期:運(yùn)行完指定的命令后,容器會(huì)退出,除非你通過(guò)某些方式讓容器在后臺(tái)運(yùn)行(如使用
-d
參數(shù))。
示例:
啟動(dòng)一個(gè) Ubuntu 容器,并在容器內(nèi)運(yùn)行 Bash shell:
docker run -it ubuntu bash
啟動(dòng)一個(gè)容器并運(yùn)行一個(gè)后臺(tái)應(yīng)用(如 Nginx):
docker run -d -p 80:80 nginx
啟動(dòng)一個(gè)容器并掛載一個(gè)卷:
docker run -v /host/path:/container/path ubuntu
2. docker exec
docker exec
命令用于 在正在運(yùn)行的容器中執(zhí)行一個(gè)命令。這不會(huì)創(chuàng)建新的容器,而是作用于已啟動(dòng)的容器。
用法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
特點(diǎn):
- 在現(xiàn)有容器中執(zhí)行命令:
docker exec
允許你在一個(gè)已經(jīng)在運(yùn)行的容器中執(zhí)行新的命令。 - 不會(huì)重新創(chuàng)建容器:你可以多次在同一個(gè)容器內(nèi)執(zhí)行不同的命令。
- 交互式執(zhí)行:通常使用
-it
選項(xiàng)來(lái)執(zhí)行交互式命令(如進(jìn)入容器的 shell)。 - 容器保持運(yùn)行:使用
docker exec
不會(huì)影響容器的運(yùn)行狀態(tài),容器會(huì)繼續(xù)運(yùn)行并執(zhí)行其原本的任務(wù)。
示例:
進(jìn)入一個(gè)運(yùn)行中的容器,啟動(dòng)一個(gè)交互式 Bash shell:
docker exec -it <container_id_or_name> bash
在運(yùn)行中的容器內(nèi)執(zhí)行一個(gè)簡(jiǎn)單的命令:
docker exec <container_id_or_name> ls /usr
在容器內(nèi)運(yùn)行一個(gè)后臺(tái)進(jìn)程:
docker exec -d <container_id_or_name> some_command
3. 主要區(qū)別
特性 | docker run | docker exec |
---|---|---|
容器生命周期 | 每次運(yùn)行時(shí)都會(huì)創(chuàng)建一個(gè)新的容器 | 在已有的容器中執(zhí)行命令,不會(huì)創(chuàng)建新容器 |
用途 | 啟動(dòng)一個(gè)新的容器并運(yùn)行命令/程序 | 在已運(yùn)行的容器內(nèi)執(zhí)行命令 |
交互性 | 可以使用 -it 選項(xiàng)進(jìn)行交互式運(yùn)行容器 | 使用 -it 選項(xiàng)可以交互式進(jìn)入容器,但容器已在運(yùn)行 |
容器狀態(tài) | 容器在命令執(zhí)行完成后會(huì)退出(除非使用后臺(tái)模式) | 容器會(huì)保持運(yùn)行,命令執(zhí)行完后容器繼續(xù)運(yùn)行 |
創(chuàng)建容器 | 會(huì)創(chuàng)建一個(gè)新的容器并啟動(dòng) | 不會(huì)創(chuàng)建新容器,只對(duì)現(xiàn)有容器操作 |
適用場(chǎng)景 | 適用于啟動(dòng)應(yīng)用、服務(wù)、進(jìn)程或臨時(shí)任務(wù) | 適用于調(diào)試、管理或監(jiān)控正在運(yùn)行的容器 |
4. 何時(shí)使用 docker run 和 docker exec
使用
docker run
:- 當(dāng)你需要從一個(gè)鏡像啟動(dòng)一個(gè)新的容器,并運(yùn)行某個(gè)命令時(shí)。
- 如果容器沒(méi)有運(yùn)行,你需要使用
docker run
來(lái)創(chuàng)建并啟動(dòng)容器。 - 啟動(dòng)一個(gè)新的服務(wù)或應(yīng)用。
使用
docker exec
:- 當(dāng)容器已經(jīng)在運(yùn)行時(shí),你需要進(jìn)入容器進(jìn)行調(diào)試、查看日志、執(zhí)行一些命令或修改容器內(nèi)的配置。
- 在一個(gè)已經(jīng)啟動(dòng)的容器中進(jìn)行實(shí)時(shí)操作,而不影響容器的生命周期。
附:docker exec執(zhí)行多個(gè)命令詳解
docker exec命令能夠在運(yùn)行著的容器中執(zhí)行命令。docker exec命令的使用格式:
docker exec [OPTIONS] container_name COMMAND [ARG...]
OPTIONS說(shuō)明:
- -d,以后臺(tái)方式執(zhí)行命令;
- -e,設(shè)置環(huán)境變量
- -i,交互模式
- -t,設(shè)置TTY
- -u,用戶名或UID,例如myuser:myusergroup
通常COMMAND只能是一條語(yǔ)句,為了支持多個(gè)命令的執(zhí)行,需要將多個(gè)命令連接起來(lái)交給Shell,docker exec命令的使用示例如下:
sudo docker exec myContainer bash -c "cd /home/myuser/myproject && git fetch ssh://gerrit_server:29418/myparent/myproject ${GERRIT_REFSPEC} && git checkout FETCH_HEAD"; sudo docker exec myContainer bash -c "cd /home/myuser/myproject;git fetch ssh://gerrit_server:29418/myparent/myproject ${GERRIT_REFSPEC};git checkout FETCH_HEAD";
注意:對(duì)于已經(jīng)暫停或停止了的容器,無(wú)法執(zhí)行docker exec命令,如下將拋出異常:
docker pause myContainer docker exec myContainer ...
總結(jié)
docker run
用來(lái)創(chuàng)建和啟動(dòng)一個(gè)新的容器,并執(zhí)行指定的命令。docker exec
用來(lái)在已經(jīng)運(yùn)行的容器內(nèi)執(zhí)行命令,可以多次對(duì)一個(gè)容器執(zhí)行操作。
到此這篇關(guān)于docker中run和exec有什么區(qū)別的文章就介紹到這了,更多相關(guān)docker run和exec區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker部署mysql?9.0.1的實(shí)現(xiàn)
本文主要介紹了docker部署mysql?9.0.1的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02docker啟動(dòng)報(bào)錯(cuò)問(wèn)題OCI runtime create failed: c
這篇文章主要介紹了docker啟動(dòng)報(bào)錯(cuò)問(wèn)題OCI runtime create failed: container_linux.go:380: starting container process,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08docke自定義網(wǎng)絡(luò)之容器互聯(lián)
大家好,本篇文章主要講的是docke自定義網(wǎng)絡(luò)之容器互聯(lián),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Docker部署MySQL主從復(fù)制的實(shí)現(xiàn)
本文主要介紹了Docker部署MySQL主從復(fù)制的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10Docker Compose引用環(huán)境變量的方法示例
在項(xiàng)目中,往往需要在 docker-compose.yml 文件中使用環(huán)境變量來(lái)控制不同的條件和使用場(chǎng)景。本文集中介紹 docker compose 引用環(huán)境變量的方式,感興趣的小伙伴們可以參考一下2018-12-12Docker初級(jí)網(wǎng)絡(luò)端口映射的配置
這篇文章主要介紹了Docker初級(jí)網(wǎng)絡(luò)端口映射的配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02VSCode連接遠(yuǎn)程docker環(huán)境操作步驟
這篇文章主要介紹了如何在容器內(nèi)部署和配置,包括查看Docker版本、管理容器和鏡像、構(gòu)建容器、配置容器內(nèi)部環(huán)境、安裝和配置VSCode以及遠(yuǎn)程連接和配置遠(yuǎn)程Docker容器環(huán)境,需要的朋友可以參考下2025-03-03mac通過(guò)docker一鍵部署Nexus3的過(guò)程記錄
編寫(xiě)一些簡(jiǎn)易的 shell 腳本幫我們快速的搭建服務(wù)器,猿們只要按著套路“一步一步”的操作,基本上都可以快速部署服務(wù),這篇文章主要介紹了mac通過(guò)docker一鍵部署Nexus3及安裝步驟,需要的朋友可以參考下2022-10-10