CentOS7下docker 主要命令總結(全)

裏面的命令大多來自《Docker 技術入門與實踐》這本書,用自己的話整理了一下。
這本書很適合初學者,裏面除了這些命令以外還有實戰案例和高級技巧,值得一讀。

一、docker

1.安裝:
yum install -y docker
2.啓動
systemctl start docker.service

二、鏡像

1.拉取鏡像
#1.直接下載
docker pull <鏡像名> 
#2.帶版本
docker pull <鏡像名> :<版本>
#3.選擇其他服務器倉庫下載,例從dl.dockerpool.com下載
docker pull d1.dockerpoll.com:5000/ubuntu
2.使用鏡像創建容器
docker run -t -i <鏡像名> /bin/bash
3.查看本機已有鏡像信息
docker images
4.給鏡像添加標籤
docker tag <鏡像名> <新鏡像名:標籤名>
5.查看鏡像詳細信息
#1.查看全部信息
docker inspect 775349758637
#2.查看其中一項信息,-f 指定
docker inspect -f {{".Architecture"}} 775349758637
6.搜尋鏡像
docker search mysql
7.刪除鏡像
# 1.使用標籤刪除鏡像 
    docker rmi docker.io/ubuntu
    # 當同一個鏡像有多個標籤時,docker rmi只是刪除指定標籤,並不影響鏡像文件
    # 但鏡像只剩一個標籤時,就會徹底刪除該鏡像

# 2.使用id刪除鏡像
    docker rmi 775349758637
    # 當有該鏡像創建的容器存在時,鏡像無法被刪除
    # 可以使用 -f 參數
    # docker rmi -f 775349758637
    # 但這樣可能會有遺留問題,被刪除的鏡像換了新的id繼續存在系統中
    # 正確做法是先刪除容器,再刪除鏡像
8.創建鏡像
# 有三種方法,基於已有鏡像創建,基於本地模板導入,基於Dockerfile 創建(不屬於命令,不介紹).基於已有鏡像創建
主要使用docker commit命令mdocker commit [options] container [REPOSITORY[:TAG]]
主要選項包括 -a,--author="" 作者信息
              -m,-message="" 提交信息
              -p,--pause=true 提交時暫停容器運行

# 1.啓動一個鏡像,並在其中進行修改操作,例如創建一個新文件,然後退出
docker run -ti ubuntu:14.04 /bin/bash
touch test
exit
# 2.使用docker commit 命令來提交一個新的鏡像,
# a4907d357644是容器id,會返回新創建的鏡像id信息
docker commit -m "Added a new file " -a "Docker Newbee" a4907d357644 test
# 3.查看本地鏡像列表,即可看到新創建的鏡像
docker images

二.基於本地模板導入
從操作系統模板文件導入一個鏡像,推薦使用OpenV提供的模板來創造,
 https://openvz.org/Download/template/precreated

cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
9.存出鏡像
docker save -o <鏡像包名(ubuntu_14.04.tar)> <鏡像名(ubuntu:14.04)>
10.載入鏡像
docker load --input <鏡像包名(ubuntu_14.04.tar)>
11.上傳鏡像
docker push user/test:latest
docker push <鏡像id/鏡像名稱>

三、容器

1.創建容器
docker create -it <鏡像名:標籤>
2.啓動容器
# cea959ba3665 容器id ,通過docker ps -a可以查到
docker start <容器名稱/容器id>
3.創建並啓動容器
# 流程
# 1.檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
# 2.利用鏡像創建並啓動一個容器
# 3.分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
# 4.從宿主機配置的網橋接口中橋接一個虛擬接口到容器中
# 5.從地址池配置一個IP地址給容器
# 5.執行用戶指定的應用程序
# 6.執行完畢後容器被終止
docker run ubuntu /bin/echo 'Hello world'
# 或
docker run -t -i -d  ubuntu:14.04 /bin/bash
#-t 表示分配僞終端, -i 讓容器標準輸入保持打開 -d表示以守護態運行
4.退出容器
exit
# 或
ctrl d
5.查看容器日誌
docker logs -f --tail 1000 -t <容器名稱/容器id>
6.終止容器
docker stop <容器名稱/容器id>
7.查看終止狀態的容器id
docker ps -a -q
8.重啓容器
docker restart <容器名稱/容器id>
9.進入容器
# attch命令,當多個窗口連接同一個容器的時候,所有窗口會同步
docker attach <容器名/容器id>
# exec 命令
docker exec -ti <容器名/容器id> /bin/bash
# nsenter 工具
# 太麻煩不介紹,有興趣去網上搜
10.刪除容器
docker rm <容器名/容器id>
# -f,--force=false 強行終止並刪除一個運行中的容器
# -l,--link=false 刪除容器的連接,當保留容器
# -v,--volumes=false 刪除容器掛載的數據卷
11.導出容器
docker export <容器名/容器id> > <保存tar包名稱>
docker export friendly_davinci > test.rar
12.導入容器,成爲鏡像
cat <tar包名> | docker import - <容器名>
cat test.rar |docker import - test:v1.0

四、倉庫

1.Docker Hub
# 登錄
docker login 
# 查找
docker search <鏡像名>
# 下載
docker pull <鏡像名>
# 推送
docker push <鏡像名>
2.Docker Pool
# 拉取鏡像前需要添加註冊服務器的具體地址,dl.dockerpool.com:5000
docker pull dl.dockerpool.com:5000/ubuntu:12.04
3.私有倉庫
#1.下載並啓動一個registry 鏡像,默認情況下會將倉庫創建在容器的/tmp/registry 
# 目錄下,可以通過-v 參數指定路徑
	docker run -d -p 5000:5000  docker.io/registry
	# 或
	docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry docker.io/registry
#2.假設本機的ip地址是10.22.22.22
# 使用docker tag 命令將鏡像標記位 10.22.22.22:55000/test
docker tag docker.io/ubuntu:14.04  10.22.22.22:5000/test
# docker push 上傳標記的鏡像
# 如果碰到報錯“server gave HTTP response to HTTPS client”,需要修改/etc/docker/daemon.json文件,
# {
    "insecure-registries": [
        "10.22.22.22:5000"
    ]
}
# 然後重啓docker 
# systemctl restart docker
docker push 10.22.22.22:5000/test
# 查看倉庫裏的鏡像
curl http://10.22.22.22:5000/v2/_catalog
# 下載鏡像,可以刪除之後再下載,就知道成功沒
docker pull 10.22.22.22:5000/test

五、數據管理

1.創建一個數據卷
# 1.在容器內創建一個數據卷
	# 使用 -v 標記可以創建一個數據卷,多次使用-v 可以創建多個
	# 下面使用 training/webapp 鏡像創建一個web容器,並創建一個數據卷掛載到容器的 /webapp目錄下
	docker run -d -P --name web -v /webapp training/webapp app.py
# 2.掛載一個主機目錄作爲數據卷
	# 加載主機的/src/webapp 目錄到容器的 /opt/webapp 目錄
	docker run -d -P --name web4 -v /src/webapp:/opt/webapp training/webapp python app.py
	# 默認權限是讀寫(rw),也可以通過ro指定爲只讀
	docker run -d -P --name web4 -v /src/webapp:/opt/webapp:ro training/webapp python app.py
# 3.掛載一個本地主機文件作爲數據卷
	# -v 標記也可以從主機掛載單個文件到容器中作爲數據卷
	# 掛載文件到容器,使用編輯工具(vi/sed --inplace等)時,可能會造成文件inode的改變,Docker1.1.0起
	# 會造成錯誤信息,所以推薦直接掛載文件所在目錄
	docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
2.數據卷容器
#創建數據卷容器dbdata,並在氣宗創建一個數據卷掛載到/dbdata
docker run -it -v /dbdata --name dbdata ubuntu
# 查看/dbdata目錄
ls
# 然後,可以在其他容器中使用--volumes-from 來掛載dbdata 容器中的數據卷,例如創建db1和db2,
# 並從dbdata中掛載數據卷
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
# 刪除掛載的容器不會刪除數據卷,必須要在最後一個還掛載着它的容器顯式使用docker rm -v 命令來指定同時刪除
3.利用數據卷容器來遷移數據
# 1.備份
# 首先利用ubuntu 鏡像創建了一個容器 worker。使用 --volumes-from dbdata參數來讓worker 容器掛載的
# dbdata 容器的數據卷(即dbdata數據卷);使用-v $(pwd)/backup 參數來掛載本地的當前目錄到
# worker容器的/backup目錄。
# worker 容器啓動後,使用tar cvf /backup/backup.tar /dbdata命令來將/dbdata 下的內容備份爲
# 容器內的/backup/backup.tar ,即宿主主機當前目錄下的backup.tar
docker run --volumes-from dbdata -v $(pwd):/backup \
--name worker ubuntu tar cvf /backup/backup.tar /dbdata
# 2.恢復
# 首先創建一個帶有數據卷的容器dbdata2
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
# 然後創建另一個新的容器,掛載dbdata2的容器,並使用untar 解壓備份文件到掛載的容器卷中即可
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar vxf /backup/backup.tar

六、網絡基礎配置

1.端口映射實現訪問容器
# 使用 -P參數來指定端口映射,隨機指定端口
docker run -d -P training/webapp python app.py
# 使用-p參數可以指定映射端口
	 # 映射所有接口地址
	 docker run -d -p 5000:5000 training/webapp python app.py
	 # 映射到指定地址的指定端口
	 docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
	 # 映射到指定地址的任意端口
	 	docker run -d -p 127.0.0.1:5000 training/webapp python app.py
	 	#或使用udp來標記端口
	 	docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
# 查看映射端口配置
docker port <容器名/容器id> <5000(可省略)>
2.容器互聯實現容器間通信
# 自定義容器命名,使用 --name,容器名稱唯一
	docker run -d -P --name <自定義名稱> training/webapp python app.py
	# 驗證命名
	docker ps -l
	# 也可以使用docker inspect 來查看容器的名字
	sudo docker inspect -f "{{.Name}}" <容器id/容器名>
	# 在執行docker run 的時候如果添加 --rm 標記,則容器會在終止後立刻刪除,
	# 注意 --rm 和-d參數不能同時使用
# 容器互聯,--link 參數
	# 創建一個新的數據庫容器
	docker run -d --name db training/postgres
	# 創建一個web容器,並將它連接到db容器
	docker run -d -P --name web --link db:db training/webapp python app.py
	# 此時,db容器和web容器建立互聯關係
	# --link 參數的格式爲 --link name:alias 其中name是要連接的容器名,alias是別名
	#  docker ps 查看容器連接,會發現db容器的names列有db也有web/db,這表示web容器鏈接到db容器,
	# 這允許web容器訪問 db容器的信息
	# docker 通過兩種方式爲容器公開信息,
	# 環境變量和更新/etc/hosts文件

七、使用Dockerfile創建鏡像

1.基本結構
Dockerfile 由一行行命令語句組成,並且支持#開頭的註釋行
一般分爲四部分:基礎鏡像信息,維護者信息、鏡像操作指令和容器啓動時執行指令
下面是示例

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format:Instruction [arguments/Command]

# 第一行必須指定基於的基礎鏡像
FROM ubuntu
# 維護者信息
MAINTAINER docker_user docker_user@email.com
# 鏡像的操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe " >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 容器啓動時執行指令
CMD /usr/sbin/nginx

2.指令
指令的一般格式爲 INSTRUCTION arguments ,指令包括 FROM ,MAINTAINER,RUN 等
接下來分別介紹
1. FROM 
	格式爲 FROM <image> 或 FROM<image>:<tag>
	第一條指令必須爲FROM 指令。並且,如果在同一個Dockerfile中創建了多個鏡像時,可以創建多個FROM指令。
	(每個鏡像一次)
2.MAINTAINER
	格式爲 MAINTAINER <name>,指定維護者信息
3.RUN
	格式爲 RUN <command> 或RUN ["executable","param1","param2"]
	前者將在shell終端運行命令,/bin/sh -c;後者使用exec 執行。指定使用其他終端可以通過第二種方式實現
	例如RUN ["/bin/bash","-c","echo hello"]
	每條RUN指令可以在當前鏡像基礎下執行指定命令,並提交爲新的鏡像。命令可以用\換行
4.CMD
	支持三種格式
	CMD ["executable","param1","param2"] 使用exec執行,推薦方式
	CMD command param1 param2 在/bin/sh中執行,提供給需要交互的應用
	CMD ["param1","param2"] 提供給ENTRYPOINT 的默認參數
	指定啓動容器時執行的命令,每個dockerfile只能由一條,多條只有最後一條被執行
	如果用戶啓動容器時候指定了運行的命令,那麼CMD的命令會被覆蓋
5.EXPOSE
	格式爲EXPOSE <port> [<port>...]
	告訴Docker 服務器容器暴露的端口,啓動容器時需要通過-P或-p來指定端口
6.ENV
	格式爲ENV <key> <value> 。指定一個環境變量,會被後續RUN指令使用,並在容器運行時保持,例如
	ENV PG_MAJOR 9.3
7.ADD
	格式爲ADD <src> <dest>
	該命令將複製指定的<src>到容器中的<dest>。其中<src>可以是Dockerfile所在目錄的一個相對路徑,
	也可以是一個URL,也可以是一個tar文件(自動解壓)
8.COPY
	格式爲COPY <src> <dest>
	複製本地主機的<src> (爲Dockerfile所在目錄的相對路徑,文件或目錄)爲容器中的<dest> 。
	目標路徑不存在時會自動創建
	當使用本地目錄爲源目錄時,推薦使用COPY
9.ENTRYPOINT
	有兩種格式
	ENTRYPOINT ["executable","param1","param2"]
	ENTRYPOINT command param1 param2 (shell 中執行)
10.VOLUME
	格式爲VOLUME ["/data"]
	創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等
11.USER
	格式爲USER deamon
	指定運行容器時用戶名或UID,後續的RUN也會使用指定用戶
	當服務不需要管理員權限時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶
	例如:RUN groupadd -r postgres && useradd -r -g postgres postgres ,要臨時獲取
	管理員權限可以用gosu,不推薦sudo
12.WORKDIR
	格式WORKDIR /path/to/workdir
	爲後續的RUN、CMD、ENTRYPOINT 指令配置工作目錄
	可以使用多個WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑。
	例如:
	WORKDIR /a
13.ONBUILD
	格式爲ONBUILD [INSTRUCTION]
	配置當所創建的鏡像作爲其他新鏡像的基礎鏡像時,所執行的操作指令。
	例如Dockerfile 使用如下的內容創建了鏡像image-A
	ONBUILD ADD . /app/src
	ONBUILD RUN /usr/local/bin/python-build --dir /app/src
	
	如果基於image-A創建新的鏡像時,新的Dockerfile 使用FROM image-A指定基礎鏡像時,
	會自動執行ONBUILD指令,等價於在後面添加了兩條指令
	FORM image-A
	# Automatically run the following
	ONBUILD ADD . /app/src
	ONBUILD RUN /usr/local/bin/python-build --dir /app/src
	使用ONBUILD指令的鏡像,推薦在標籤中註明,例如ruby:1.9-onbuild
創建鏡像
docker build 
# 要指定鏡像的標籤信息,可以通過-t選項
docker build -t bild_repo/first_image /tmp/docker_builder

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章