docker的常用命令
]# yum -y install docker #安裝docker
]# systemctl start docker #啓動docker
]# docker search centos #網上搜索images
]# docker pull docker.io/centos #網上下載鏡像
]# docker images #列出本地鏡像 、
]# docker run -i -t centos /bin/bash #運行一個鏡像
]# docker ps -a #列出本機上所有的容器
需要root權限,不足的時候,報錯
1. 容器的基本操作
啓動容器(run命令)
實例:
docker run --name web -p 9003:80 -p 9023:22 -d -v /src/webapp:/opt/webapp -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine
說明:
-p (小寫的)使用格式 ip:hostPort:containerPort
將本地的 9003 端口 映射到容器的端口 80x,查看用 docker port <容器名或ID>
-v 將加載主機的/src/webapp目錄到容器的/opt/webapp
-d, --detach=false Detachedmode: run command in the background
-i, --interactive=false Keep STDINopen even if not attached
-t, --tty=false Allocate apseudo-TTY
]# docker run -d -i --name web -v /src/webapp:/opt/webapp docker.io/centos /bin/bash
2cf377fa8d0219678b95036ee1a28d2634c49ca30ff62f2896ad8e6ab5c0a37d
]# docker exec -i -t web /bin/bash
一個容器連接到另一個容器
docker run -it --name sonar -d --link mmysql:db tpires/sonar-server
sonar容器連接到mmysql容器,並將mmysql容器重命名爲db。
這樣,sonar容器就可以使用db的相關的環境變量了。
這樣在 容器sonar 內 查看 /etc/hosts文件的時候,發現增加一條記錄,映射主機名到一條IP地址。
這樣在容器sona內,就可以直接解析db了。
進入容器(exec attach命令)
使用docker attach
使用SSH,不建議使用
使用nsenter
使用exec,使用較多
]# docker exec -it containerID /bin/bash
]# docker exec -it myTest /bin/sh
]# docker attach --sig-proxy=false containerID
刪除所有容器(rm命令)
docker rm $(docker ps -a -q)
這個命令分兩步,
docker ps -a -q,以安靜模式列出所有的容器,也就是隻列出隨機唯一名字(numericID)
docker rm ,依次(循環)刪除列表中的容器,刪除正在運行的,會報錯。
docker rm -f<容器名orID> ,強制刪除
docker stop <容器名orID>
docker start <容器名orID>
docker restart <容器名orID>
docker kill <容器名orID>
docker ps -a #查看所有容器
還有三個與暫停相關的命令pause,unpause,wait
文件系統相關
docker diff <容器名or ID> 查看容器內文件的改變
docker cp 在容器和主機之間複製文件
統計相關
docker top <容器名or ID>顯示容器內進程信息
docker stats <容器名or ID>顯示容器內統計信息
docker port <容器名or ID> 顯示容器與主機端口映射信息
docker inspect <容器名or ID>顯示容器底層細節
其他
docker logs -f <容器名or ID> 查看運行日誌
docker logs <容器名or ID> #獲取容器的輸出信息
docker rename <容器名> <新名字> 改名
容器的導入導出
docker export -o <文件名> <容器名orID> 導出文件到tar包
docker import 導入成爲鏡像
#docker export mos > testrun.tar
#cat testrun.tar |docker import - test/cenosme
[root@localhost ~]# docker run -d -i --name mos docker.io/centos /bin/bash
41aa9eb50a97fb2c4ac6c29ca4a9d77cb673787ab5a3e13e6d3f82014b0e9b0b
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest ff426288ea90 5 days ago 207.2 MB
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41aa9eb50a97 docker.io/centos "/bin/bash" 12 seconds ago Up 11 seconds mos
[root@localhost ~]# docker export mos > testrun.tar
[root@localhost ~]# ls
anaconda-ks.cfg install_salt.sh testrun.tar zookeeper-3.3.6.tar.gz
[root@localhost ~]# cat testrun.tar |docker import - test/cenosme
sha256:2d6416e6c649f14728b1d3e9a1b73ad1181b80f7359c9fbacdd39b6263b390f2
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/cenosme latest 2d6416e6c649 7 seconds ago 207.2 MB
docker.io/centos latest ff426288ea90 5 days ago 207.2 MB
[root@localhost ~]#
2.鏡像操作
刪除所有鏡像
docker rmi $(docker images -q)
docker images -q 只列出了鏡像的ID
docker rmi 用於刪除鏡像
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
docker images | grep none | awk '{print$3}' | sort -r只列出untaggedimages,也就是鏡像名字爲<None>的,取出ID,降序排列
docker search <keywords>
docker history <鏡像名>
docker commit <容器名or ID> <新鏡像名> #保存對容器的修改
docker build <標籤> <Docker-file路徑>
構建鏡像
三種方式 :基於已有鏡像的容器創建、基於本地模板導入、基於Dockerfile創建
1) docker commit <容器名or ID> <新鏡像名>
2) cat ubuntu-xxx.tar.gz | docker import -ubuntu:14.04
ubuntu-xxx.tar.gz 是一個操作系統模板文件
3) docker build -t <鏡像名> <Dockerfile路徑>
如Dockerfile在當前路徑:docker build -t xx/gitlab .
鏡像遷移
當需要把一臺機器上的鏡像遷移到另一臺機器的時候,需要保存鏡像與加載鏡像。
機器1:
docker save busybox > /home/save.tar
使用scp將save.tar拷到 機器2上,然後:
docker load < /home/save.tar
推拉鏡像
一、安裝Registry:
很簡單,只需要運行一個Registry容器即可(包括下載鏡像和啓動容器、服務)
docker run -d -p 5000:5000 -v /data/registry:/var/lib/registry --name registry --restart=always registry
二、使用Registry
去除默認是需要https證書支持的.
修改/etc/docker/daemon.json文件
#vi /etc/docker/daemon.json
{ "insecure-registries":["192.168.1.100:5000"] }
#systemctl daemon-reload
#systemctl restart docker
注:<ip>:Registry的機器ip地址,在安裝registry的節點和客戶端需要訪問私有Registry的節點都需要執行此步操作。
三、通過 docker tag重命名鏡像,使之與registry匹配
docker tag inits/nginx1.8 192.168.1.100:5000/nginx1.8:latest
四、上傳鏡像到Registry
docker push 192.168.1.100:5000/nginx1.8:latest
五、查看Registry中所有鏡像信息
curl http://192.168.1.100:5000/v2/_catalog
返回:
{"repositories":["centos6.8","jenkins1.638","nginx","redis3.0","source2.0.3","zkdubbo"]}
六、其他Docker服務器下載鏡像
需要先設置
#vi /etc/docker/daemon.json
{ "insecure-registries":["192.168.1.100:5000"] }
#systemctl daemon-reload
#systemctl restart docker
docker pull 192.168.1.100:5000/nginx1.8:latest
七、啓動鏡像
docker run -it <ip>:5000/nginx1.8:latest /bin/bash
Dockerfile 命令
Dockerfile有十幾條命令可用於構建鏡像,下文將簡略介紹這些命令。
ADD
ADD命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上覆制文件到目標容器的文件系統。如果源是一個URL,那該URL的內容將被下載並複製到容器中。
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder
CMD
和RUN命令相似,CMD可以用於執行特定的命令。和RUN不同的是,這些命令不是在鏡像構建的過程中執行的,而是在用鏡像構建容器後被調用。
# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"
ENTRYPOINT
配置容器啓動後執行的命令,並且不可被 docker run 提供的參數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
ENTRYPOINT 幫助你配置一個容器使之可執行化,如果你結合CMD命令和ENTRYPOINT命令,你可以從CMD命令中移除“application”而僅僅保留參數,參數將傳遞給ENTRYPOINT命令。
# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during run
CMD "Hello docker!"
ENTRYPOINT echo
ENV
ENV命令用於設置環境變量。這些變量以”key=value”的形式存在,並可以在容器內被腳本或者程序調用。這個機制給在容器中運行應用帶來了極大的便利。
# Usage: ENV key value
ENV SERVER_WORKS 4
EXPOSE
EXPOSE用來指定端口,使容器內的應用可以通過端口和外界交互。
# Usage: EXPOSE [port]
EXPOSE 8080
FROM
FROM命令可能是最重要的Dockerfile命令。改命令定義了使用哪個基礎鏡像啓動構建流程。基礎鏡像可以爲任意鏡 像。如果基礎鏡像沒有被發現,Docker將試圖從Docker image index來查找該鏡像。FROM命令必須是Dockerfile的首個命令。
# Usage: FROM [image name]
FROM ubuntu
MAINTAINER
我建議這個命令放在Dockerfile的起始部分,雖然理論上它可以放置於Dockerfile的任意位置。這個命令用於聲明作者,並應該放在FROM的後面。
# Usage: MAINTAINER [name]
MAINTAINER authors_name
RUN
RUN命令是Dockerfile執行命令的核心部分。它接受命令作爲參數並用於創建鏡像。不像CMD命令,RUN命令用於創建鏡像(在之前commit的層之上形成新的層)。
# Usage: RUN [command]
RUN aptitude install -y riak
USER
USER命令用於設置運行容器的UID。
# Usage: USER [UID]
USER 751
VOLUME
VOLUME命令用於讓你的容器訪問宿主機上的目錄。
# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]
WORKDIR
WORKDIR命令用於設置CMD指明的命令的運行目錄。
# Usage: WORKDIR /path
WORKDIR ~/
如何使用Dockerfiles
使用Dockerfiles和手工使用Docker Daemon運行命令一樣簡單。腳本運行後輸出爲新的鏡像ID。
# Build an image using the Dockerfile at current location
# Example: sudo docker build -t [name] .