一、容器管理
# 運行一個容器
[root@x201t ~]# docker run 參數 容器名稱[:tag] [執行的命令]
參數:
-i 保持和docker 容器內的交互,啓動容器是運行的命令結束後,容器依然存活,沒有退
出(默認是會退出,即停止的)
-t 爲容器的標準輸入虛擬一個tty
-d 後臺運行容器
--rm 容器在啓動後,執行完成命令或程序後就銷燬(不可於 -d 一起使用)
--name 給容器起一個自定義名稱
--restart docker 1.12 新增加的參數,用來指定容器的重啓策略,當前提供的策略包括:
no 默認值,如果容器掛掉不自動重啓。
on-failure 當容器以非 0 碼退出時重啓容器,同時可接受一個可選的最大重啓
次數參數 (e.g. on-failure:5).
always 不管退出碼是多少都要重啓,就算是你重啓了docker daemon 服務,
容器也會同時跟着重啓。
--cap-add 允許容器裏可以使用的功能或命令,例如:
*更改容器接口狀態
docker run --cap-add=NET_ADMIN ubuntu sh -c "ip link eth0 down"
--cpa-drop 禁止容器裏使用功能或命令,例如
* 禁止使用 chown 命令
docker run --cap-drop=CHOWN ...
注意:運行一個容器時,若只是指定了鏡像名,而沒有指定其tag,docker默認會以tag爲latest(最新版本)的鏡像去啓動容器,假如沒有這個鏡像(實際上在使用一個鏡像啓動一個容器時,當這個容器不存在於本地時,docker會去默認配置好的鏡像倉庫下載這個鏡像),則先會報錯;之後會試着下載這個鏡像,下載成功後再次運行容器和所要執行的命令。
直接指定tag的時候,就會直接用所指的的鏡像運行容器以及執行所指定的命令;如下圖:
#查看正在運行的容器狀態信息
[root@x201t ~]# docker ps
CONTAINER ID 容器ID
IMAGE 容器依賴的鏡像
COMMAND 啓動容器時執行的命令或程序
CREATED 容器啓動時到現在的相隔時間
STATUS 容器狀態
PORTS 宿主機到容器的端口映射
當運行一個容器的時候,沒有用參數--name去指定容器名時,Docker會從自己的名稱庫中隨機給這個容器起一個名字。
#查看所有的容器
[root@x201t ~]# docker ps -a
#查看最近一次啓動的那個容器信息
[root@x201t ~]# docker ps -l
當退出當前容器後,或者容器內的程序(命令)執行結束後,容器會自動進入停止狀態(除非運行時使用的參數 -d)
#重新啓動一個處於停止狀態的容器
[root@x201t ~]# docker start 容器名稱或者容器ID
#停止一個容器,比如停止後臺運行的容器
[root@x201t ~]# docker stop 容器名或者ID
#刪除一個容器
[root@x201t ~]# docker rm [-f] 容器名或者ID
-f 是刪除一個正在運行中的容器
#執行一個正在運行中的容器內的命令
語法:docker exec 容器名/容器ID(不是鏡像名/鏡像ID) 執行的名稱 [參數]
[root@x201t ~]# docker exec clever_swanson cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
# 進入到一個正在運行中的容器
當使用 -d 參數時,容器啓動後會進入後臺運行。某一些時候需要進入容器內操作,目前有兩種方法:
attach 命令和nsenter工具
[root@x201t ~]# docker attach centos
注意:這種方式,當你退出容器後(在容器裏的終端裏輸入exit或[Ctrl]+d退出時),這個容器就會處於停止狀態;不論之前他是否以後臺方式運行。以爲exit會想容器的主進程發送一個SIGKILL信號。
解決辦法是:[Ctrl]-p+[Ctrl]-q
就是先按[Ctrl]+p鍵,接着再按[Ctrl]+q鍵
還有另外一種方式(推薦):
使用nsenter工具,需要安裝 util-linux 軟件包
[root@x201t ~]# yum install util-linux -y
先獲取到運行中的容器的pid
[root@x201t ~]# docker inspect --format "``.`State`.`Pid`" clever_swansonrc
8503
再通過 nsenter 命令通過PID進入到容器,這樣再退出容器後,容器會是運行狀態
[root@x201t ~]# nsenter --target 8503 --mount --uts --net --ipc --pid
[root@cbe9955a3303 /]#
生產中經常會用到,所以應該把他編寫成一個小腳本
[root@x201t ~]# cat indocker.sh
#!/bin/bash
# 功能:用於進入到一個正在運行的容器中。
container_pid=`docker inspect --format "``.`State`.`Pid`" $1`
nsenter --target ${container_pid} --mount --net --uts --ipc --pid
# end
更簡單法方法是下載一個文件: .bashrc_docker,下載後把其文件的內容追加到.bashrc中。
這個文件中主要包含了兩個命令和一個函數
docker-pid <container> 用來獲取運行中容器的PID
docker-ip <container> 用來獲取運行中容器的IP
Docker-enter <container> 用來進入一個運行於後臺的容器
[root@x201t~]# wget -P \
~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker
[root@x201t~]# echo ~/.bashrc_docker >>~/.bashrc;source ~/.bashrc_docker
# 導入導出容器,就像是給容器做快照和恢復快照
導出容器用 docker export 命令
導入容器用 docker import 命令
把導出的容器快照文件作爲標準輸入,導入爲新的鏡像
注意:
docker import 和docker load的區別在於,load 是用來導入鏡像存儲文件到本地鏡像庫的,鏡像存儲文件是用save從本地鏡像庫保存到本地硬盤的鏡像備份文件,一般容量相對容器的快照文件較大,保存的是完整的記錄,導入時,不能重新指定標籤(log)等元數據信息;而import導入的是容器的快照文件,容器的快照文件體積較小,它丟棄了歷史記錄和元數據信息,僅僅保存容器當時的快照狀態。
#查看容器運行時的內部輸出信息,用命令 docker logs <容器ID|容器名>
#查看容器的元數據信息,有啓動時執行的命令或程序、運行時的IP、所使用的鏡像等。
命令:docker inspect <容器ID|容器名>
[root@x201t ~]# docker inspect clever_swanson
#重命名容器名稱
[root@x201t ~]# docker rename OLD_NAME NEW_NAME
#創建一個新的容器,常用於啓動一個mysql數據庫時
1. 初始化mysql
[root@x201t ~]# docker create --name mydb1 -e MYSQL_ROOT_PASSWORD=123 \
-p 3306:3306 mysql
注意:這裏mysql容器啓動的時間可能會稍長些,因爲這時候在初始化數據庫
# --name 給容器起個名字
# -e MYSQL_ROOT_PASSWORD 設置容器的ENV,這裏給數據庫root用戶設置密碼
# -p 把本地的3306端口映射到容器的3306端口
# / 這是shell命令行裏的換行符
2. 啓動這個mysql容器
[root@x201t ~]#docker start mydb1