① 如何打開多個終端進入Docker容器
打開多個終端進入Docker容器有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。
使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。
nsenter 可宴尺以訪問另一個進程的名字空間。
為了連接到容器,你還需要找到容器的第一個進程的 PID,可以通過下面的命令獲取。
PID=$(docker inspect _format 「{{ .State.Pid }}」 <container>) //將<container>換成你的容器id
通過這個 PID,就可以連接到這個容器:
$ nsenter _target $PID _mount _uts _ipc _net _pid
更簡單的,建議大家下載 .bashrc_docker,並將內容放到 .bashrc 中。
$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
$ echo 「[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker」 >> ~/.bashrc; source ~/.bashrc
這衡鋒個文件中定義了很多方便使用 Docker 的命令,例如 docker-pid 可以獲取某個容器的 PID;而 docker-enter 可以進入容器或直接晌攔高在容器內執行命令。
$ echo $(docker-pid <container>)
$ docker-enter <container>
附.bashrc_docker文件內容:
# Some useful commands to use docker.
# Author: yeasy@github
# Created:2014-09-25
alias docker-pid=」sudo docker inspect _format 『{{.State.Pid}}』」
alias docker-ip=」sudo docker inspect _format 『{{ .NetworkSettings.IPAddress }}』」
#the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter
function docker-enter() {
if [ -e $(dirname "$0")/nsenter ]; then
# with boot2docker, nsenter is not in the PATH but it is in the same folder
NSENTER=$(dirname 「$0″)/nsenter
else
NSENTER=nsenter
fi
[ -z "$NSENTER" ] && echo 「WARN Cannot find nsenter」 && return
if [ -z "$1" ]; then
echo 「Usage: `basename 「$0″` CONTAINER [COMMAND [ARG]?]」
echo 「」
echo 「Enters the Docker CONTAINER and executes the specified COMMAND.」
echo 「If COMMAND is not specified, runs an interactive shell in CONTAINER.」
else
PID=$(sudo docker inspect _format 「{{.State.Pid}}」 「$1″)
if [ -z "$PID" ]; then
echo 「WARN Cannot find the given container」
return
fi
shift
OPTS=」_target $PID _mount _uts _ipc _net _pid」
if [ -z "$1" ]; then
# No command given.
# Use su to clear all host environment variables except for TERM,
# initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
# and start a login shell.
#sudo $NSENTER 「$OPTS」 su _ root
sudo $NSENTER _target $PID _mount _uts _ipc _net _pid su _ root
else
# Use env to clear all host environment variables.
sudo $NSENTER _target $PID _mount _uts _ipc _net _pid env -i $@
fi
fi
}
② Docker常用命令大全
基礎操作:
1 docker images 查看鏡像信息列表 鏡像是靜態的
2 docker ps -a 查看運行中的所有容器
3 docker pull [images]:[version] 從dockerhub拉取指定鏡像
4 docker run -p 8000:80 -tdi --privileged [imageID] [command] 後台啟動docker,並指定宿主機埠和docker映射埠。
-i: 以交互模式運行容器,通常與 -t 同時使用;
-d: 後台運行容器,並返回容器ID;
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
--privileged 容器將擁有訪問主機所有設備的許可權
通常情況下 [command] 填下 /bin/bash 即可。
特殊情況下,如需要在centos鏡像中使用 systemctl . 則應添加 --privileged 並設置[command ]為 init 。
5 當鏡像通過run 啟動後,便會載入到一個動態的container(容器)中運行,此時若需要進入終端交互模式:
sudo docker exec -it [containerID] /bin/bash
交互模式中,使用 ctrl+p+q退出交互 保持運行,使用 exit命令退出並停止容器。
6 在容器非交互模式下,通過docker start/stop 命令來啟動/停止已部署的容器服務。
7 docker rm [containerID] 刪除容器
8 docker rmi [imageID] 刪除鏡像
9 docker cp [YourHostFilePath] [containerID]:[DockerPath] 將宿主機內的指定文件傳輸至容器內部的指定地址。
鏡像製作:
1 docker commit [containerID] [ImageName]:[Version] 將修改後的容器重新打包成鏡像
2 docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1 將容器a404c6c174a2 保存為新的鏡像,並添加提交人信息和說明信息。
-a :提交的鏡像作者;
-c :使用Dockerfile指令來創建鏡像;
-m :提交時的說明文字;
-p :在commit時,將容器暫停。
3 docker push [ImageID] [repertory_address] 提交鏡像到雲倉庫
(暫時先記錄這些,後續再更新)
③ Docker命令全集
一:首先來理解三個名詞解釋:
1、鏡像(image)
Docker 鏡像(Image)就是一個只讀的模板。
例如:一個鏡像可以包含一個完整的操作系統環境,裡面僅安裝了 Apache 或用戶需要的其它應用程序。鏡像可以用來創建 Docker 容器,一個鏡像可以創建很多容器。
2、倉庫(repository)
倉庫(Repository)是集中存放鏡像文件的場所。
3、容器(container)
Docker 利用容器(Container)來運行應用。容器是從鏡像(Image)創建的運行實例。
二:常用的命令集合如下:
容器生命周期管理 — docker
[run|start|stop|restart|kill|rm|pause|unpause|create]
容器操作運維 — docker
[ps|exec|inspect|top|attach|events|logs|wait|export|import|port]
容器rootfs命令 — docker
[commit|cp|diff]
本地鏡像管理 — docker
[images|rmi|tag|build|history|save]
鏡像倉庫 — docker
[login|pull|push|search]
其他命令 — docker
[info|version]
詳細命令說明如下:
docker run -d --name alias-Name imageName //在後台啟動一個容器
docker start Name/ID //啟動容器
docker stop Name/ID //停止容器
docker restart Name/ID //重啟容器
docker kill -s KILL Name/ID //殺死一個運行的容器
docker rm /rm -f Name/ID //刪除容器
docker pause Name/ID //停止容器
docker unpause Name/ID //恢復容器
docker create --name CONTAINER_Name imageName //只創建容器但不啟動
docker ps / docker ps -a //查看運行的容器
docker exec -it CONTAINER_ID /bin/bash //進行一個運行中的容器,開啟一個新的終端
docker attach CONTAINER_ID //進行一個運行中的容器,不開啟一個新的終端
docker inspect CONTAINER_Name //查看容器的相關信息
docker top CONTAINER_Name //查看容器裡面的進程
docker events -f "image"="imageName" --since="1467302400" //時間戳=2016年7月1日後的相關事件
docker logs CONTAINER_Name //查看容器的日誌輸出
docker wait CONTAINER_Name //阻塞運行直到容器停止,然後列印出它的退出代碼
docker export -o test.tar CONTAINER_ID //將容器進行打包保存到本地,文件類型為tar
cat test.tar |docker import - image_name:tag //將上面保存的文件導入到鏡像庫中
docker port CONTAINER_ID //查看容器的埠映射情況
commit 從容器中創建一個新的鏡像
docker commit -a "tony test" -m "my mysql" CONTAINER_ID mymysql:v1
docker images mymysql:v1
cp 在使用的過程中會進行多個主機與容器之間的數據交換
docker cp /ruiqi/content CONTAINER_ID:/ruiqi/
diff 用來檢查容器裡面文件結構的更改
docker diff CONTAINER_ID
docker images /docker images -a //查看本地的鏡像,-a 表示是所有的鏡像
docker rmi -f image_name //刪除鏡像
docker tag mysql:v5.6 mysql:v5.7 //給鏡像做一個有別名的復本
docker build -t runoob/ubuntu:v1 . //構建一個鏡像
docker history image_name //查看當前這個鏡像的 歷史 信息
docker save -o TestFlask.tar TestFlask:v3 //將當前的鏡像保存到本地的一個tar 類型的文件
docker login //登錄鏡像倉庫
docker pull //從鏡像倉庫中拉鏡像
docker push //向鏡像倉庫推本地的鏡像文件
docker search //檢索鏡像內容
三:利用dockerfile 製作一個tomcat 運行image:
[root@localhost common]# more Dockerfile.tomcat
FROM cloud.io/centos:7
COPY jdk-8u144-linux-x64.rpm /opt/jdk-8u144-linux-x64.rpm
RUN ["rpm","-ivh","/opt/jdk-8u144-linux-x64.rpm"]
COPY security /usr/java/jdk1.8.0_144/jre/security
COPY certs /etc/pki/tls/certs
COPY tomcat /opt/tomcat
RUN ["ln","-s","/opt/tomcat","/usr/local/tomcat"]
④ 使用tmux進入docker容器
每次進入容器中都要重復執行
docker exec -it name /bin/bash 這些命令,有些還需要反復配置環境變數
使用tmux可以避免這些操作!
終端輸入 tmux 會啟動 Tmux 窗口, 底部有一個狀態欄。狀態欄的左側是窗口信息(編號和名稱,帶*的是當前窗口),右側是系統信息 。
命令行的典型使用方式是,打開一個終端窗口(乎李terminal window,以下簡稱"窗口"),在裡面輸入命令。 用戶與計算機的這種臨時的交互,稱為一次"會話"(session) 。
會話的一個重要特點是,窗口與其中啟動的進程是連在一起的。打開窗口,會話開始;關閉窗口,會話結束,會話內部的進程也會隨之終止,不管有沒有運行完。
一個典型的例子就是,SSH 登錄遠程計算機,打開一個遠程窗口執行命令。這時,網路突然斷線,再次登錄的時候,是找不回上一次執行的命令的。因為上一次 SSH 會話已經終止了,裡面的進程也隨之消失了。
為了解決這個問題,會話與窗口可以"解綁":窗口關閉時,會話並不終止,而是繼續運行,等到以後需要的時候,再讓會話"綁定"其他窗口。
Tmux 就是會話與窗口的"解綁"工具,將它們徹底分離。
(1)它允許在單個窗口中,同時訪問多個會話。這對於同時運行多個命令行程序很有用。
(2) 它陵指可以讓新窗口"接入"已經存在的會話。
(3)它允許每個歲汪遲會話有多個連接窗口,因此可以多人實時共享會話。
(4)它還支持窗口任意的垂直和水平拆分。
第一個啟動的 Tmux 窗口,編號是0,第二個窗口的編號是1,以此類推。這些窗口對應的會話,就是 0 號會話、1 號會話。
使用編號區分會話,不太直觀,更好的方法是為會話起名。
⑤ 如何進入Docker容器
步驟1:為我們的容器創建第一個鏡像#以centos鏡像作為基礎鏡像,我們啟動自己的容器並在其中執行/bin/bash命令#註:-t-i參數用於創建一個虛擬的命令行。sudodockerrun-t-icentos/bin/bash現在我們已經成功的運行了自己的第一個容器,並且進入到容器的命令行界面中。在容器中,我們執行下面的命令:yum-yupdate#更新軟體包yuminstallwhich#安裝which命令yuminstallgit#安裝Git安裝完成後,按Ctrl+d來退出容器的命令行。#執行sudodockerps-a,可以看到被我們終止的容器……da9031d3568fcentos:6.4/bin/bash5minutesago…..把我們所做的改變提交到一個新的容器:#這里我們創建一個自己的基礎容器,容器中安裝好了文章中所需的枝游常用工具。讀者的容器id可能與文章中的有所不同,以上一步dockerps-a的結果為准。sudodockercommitda90custom/base容器成功提交後,執行sudodockerimages,我們會看到剛才提交的容器(如下面的結果所示)。我們就以這個容器為基礎容器,再來創建一個新的容器。/.…步驟2:創建新的容器,並安裝apache#以custom/base容器為基礎,運行一個新的容器。sudodockerrun-t-icustom/base/bin/bash#安裝httpdyuminstallhttpd步驟3:再次提交新的容器按Ctrl+d來退出容器的命令行,然後執行命令:#這個命令會把步驟2中我們安裝httpd帶來的改變提交到新的名為custom/httpd的容器鏡像中。你的容器id可能會和文章中有所不同,以sudodockerps-a命令的結果為准。/httpd你應該已經發現了,我們創建了一個帶有http伺服器並可以復用的容器鏡像。你可以根據這種思想,為自己所需的每個組件都創建一個容器,然後把這些容器復用於開發環境或者生產環境。步驟7:運行http伺服器#-ntVM.#-v參數把主機共享給虛擬機的一個卷掛載到容器中#-;#-p參數把虛擬機的80埠映射到容器的80埠;虛擬機的80埠在Vagrantfile中被綁定到褲老主機的8080埠,也就猛純銷是:主機8080->虛擬機80->容器80sudodockerrun-t-i-p80:80-v/vagrant/htdocs:/var/www/htmlcustom/httpd/bin/bash#啟動Apacheapachectl-kstart