docker
- Docker 專案的目標是實作輕量級的作業系統虛擬化解決方案。
- 在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
- 容器是在作業系統層面上實作虛擬化,直接使用本地主機的作業系統,而傳統方式則是在硬體層面實作。
- 容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器性能開銷極低。
特性 | 容器 | 虛擬機 |
---|---|---|
啟動 | 秒級 | 分鐘級 |
硬碟容量 | 一般為 MB | 一般為 GB |
效能 | 接近原生 | 比較慢 |
系統支援量 | 單機支援上千個容器 | 一般幾十個 |
Ubuntu 16.04安裝
必須為64-bit版本,且須3.10以上的kernel ( uname -r )。
- sudo apt-get update
- sudo apt-get install apt-transport-https ca-certificates
- sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
- 如須不同Ubuntu版本,在此設定: echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list
- sudo apt-get update
- 確認docker版本: apt-cache policy docker-engine ,最新的docker版本前面會有三個星號*
- For Ubuntu Trusty, Wily, and Xenial, install the linux-image-extra-* kernel packages, which allows you use the aufs storage driver.
- sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
- 安裝docker sudo apt-get install docker-engine
- 起動docker daemon sudo service docker start
- 測試安裝 sudo docker run hello-world
images, container安裝在/var/libdocker下
Configure Docker to start on boot (systemd)
- sudo systemctl enable docker
Enable memory and swap accounting
- 在執行映像檔時,可能會出現以下的訊息:
WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
kernel does not support swap limit capabilities. Limitation discarded.
- 如果不使用此功能,可忽略此警告。開啟此功能時,即使docker沒有在使用,也會會降低約10%的系統效能。
- 開啟步驟如下:
- Edit the /etc/default/grub file.
- Add or edit the GRUB_CMDLINE_LINUX line to add the following two key-value pairs:
- GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
- Update GRUB: sudo update-grub
- Reboot your system. Memory and swap accounting are enabled and the warning does not occur.
- 安裝完成後,使用 sudo docker version 查看server與client的版本。
Client:
Version: 1.12.5
API version: 1.24
Go version: go1.6.4
Git commit: 7392c3b
Built: Fri Dec 16 02:42:17 2016
OS/Arch: linux/amd64
Server:
Version: 1.12.5
API version: 1.24
Go version: go1.6.4
Git commit: 7392c3b
Built: Fri Dec 16 02:42:17 2016
OS/Arch: linux/amd64
- docker info 可查看關於docker的訊息。
Containers: 5
Running: 0
Paused: 0
Stopped: 5
Images: 3
Server Version: 1.12.5
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 27 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: overlay null host bridge
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-45-generic
Operating System: Linux Mint 18
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 15.66 GiB
Name: par49
ID: AJVN:JSZP:UKLX:YFWS:6WB2:Y47F:5DDC:TX75:IX4P:4LVI:X4VP:ATRO
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: chenhh
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Insecure Registries:
127.0.0.0/8
基本概念
- Docker 包括三個基本概念,理解了這三個概念,就理解了 Docker 的整個生命週期。
- 映像檔(Image)
- 容器(Container)
- 倉庫(Repository)
映像檔
- Docker 映像檔就是一個唯讀的模板。
- 例如:一個映像檔可以包含一個完整的 ubuntu 作業系統環境,裡面僅安裝了 Apache 或使用者需要的其它應用程式。
- 映像檔可以用來建立 Docker 容器。
- Docker 提供了一個很簡單的機制來建立映像檔或者更新現有的映像檔,使用者甚至可以直接從其他人那裡下載一個已經做好的映像檔來直接使用。
容器
- Docker 利用容器來執行應用。
- 容器是從映像檔建立的執行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台。
- 可以把容器看做是一個簡易版的 Linux 環境(包括root使用者權限、程式空間、使用者空間和網路空間等)和在其中執行的應用程式。
- 註:映像檔是唯讀的,容器在啟動的時候建立一層可寫層作為最上層。
倉庫
倉庫是集中存放映像檔檔案的場所。有時候會把倉庫和倉庫註冊伺服器(Registry)混為一談,並不嚴格區分。實際上,倉庫註冊伺服器上往往存放著多個倉庫,每個倉庫中又包含了多個映像檔,每個映像檔有不同的標籤(tag)。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
- 最大的公開倉庫是 Docker Hub,存放了數量龐大的映像檔供使用者下載。
- 當使用者建立了自己的映像檔之後就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一台機器上使用這個映像檔時候,只需要從倉庫上 pull 下來就可以了。
- Docker 倉庫的概念跟 Git 類似,註冊伺服器可以理解為 GitHub 這樣的託管服務。
Docker映像檔
- Docker 在執行容器前需要本地端存在對應的映像檔,如果映像檔不存在本地端,Docker 會從映像檔倉庫下載(預設是 Docker Hub 公共註冊伺服器中的倉庫)。
取得映像檔
- 可以使用 docker pull 命令從倉庫取得所需要的映像檔。(預設使用docker hub)
# 下載ubuntu 16.10,可至docker hub中查詢所須的版本
sudo docker pull ubuntu:16.10
16.10: Pulling from library/ubuntu
a694de2ff4f9: Pull complete
b83592e43937: Pull complete
c987dfa597e6: Pull complete
25f2d4cb80ea: Pull complete
a9bc31a5976c: Pull complete
Digest: sha256:ba681180e3cf92407a9b0cad95cf6728de479d599cd8030922172c21c595d382
Status: Downloaded newer image for ubuntu:16.10
下載過程中,會輸出取得映像檔的每一層訊息。
- 該命令實際上相當於 sudo docker pull registry.hub.docker.com/ubuntu16.10 命令,即從註冊服務器 registry.hub.docker.com 中的 ubuntu 倉庫來下載標記為 16.10 的映像檔。
- 有時候官方倉庫註冊服務器下載較慢,可以從其他倉庫下載。 從其它倉庫下載時需要指定完整的倉庫伺服器位址。
- sudo docker pull dl.dockerpool.com:5000/ubuntu:16.10
完成後,即可隨時使用該映像檔了,例如建立一個容器,讓其中執行 bash。
- sudo docker run -t -i ubuntu:16.10 /bin/bash
列出本機所有映像檔
- 使用 sudo docker images 可列出本機所有映像檔。
- REPOSITORY說明此映像檔來自於那一個倉庫
- tag為映像檔的說明, 如果沒有指明時,預設使用latest
- ID編號(唯一)
- 映像檔建立時間
- 映像檔大小
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.10 4b5e1ea5f913 10 days ago 102.5 MB
hello-world latest c54a2cc56cbb 5 months ago 1.848 kB
建立映像檔
- 建立映像檔有很多方法,使用者可以從 Docker Hub 取得已有映像檔並更新,也可以在本機建立一個。
映像檔是唯讀,因此一旦修改後,即為新的映像檔(可想成類似光碟的iso)。
修改已有映像檔
- 先使用下載的映像檔啟動容器, sudo docker pull training/sinatra
- 啟動容器 sudo docker run -t -i training/sinatra /bin/bash
- 使用者名稱後的字串為容器的ID,如下的容器ID為b2616b0e5a8。
# 安裝ruby json
root@0b2616b0e5a8:/#gem install json
- 當結束後,我們使用 exit 來退出,現在我們的容器已經被改變了,使用 docker commit 命令來提交更新後的副本。
- -m 後面為本次提交的message
- -a 為更新的使用者訊息
- 之後的是用來建立映像檔的容器id
- 最後指定新映像檔的名稱與tag,建立成功後會印出新映像檔的 ID。
sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
儲存和載入映像檔
儲存映像檔
- 如果要建立映像檔到本地檔案,可以使用 docker save 命令。
chenhh@par49 /tmp $ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.10 4b5e1ea5f913 10 days ago 102.5 MB
hello-world latest c54a2cc56cbb 5 months ago 1.848 kB
training/sinatra latest 49d952a36c58 2 years ago 447 MB
chenhh@par49 /tmp $ sudo docker save -o ubuntu_16.10.tar ubuntu:16.10
載入映像檔
- 可以使用 docker load 從建立的本地檔案中再匯入到本地映像檔庫。
udo docker load --input ubuntu_16.10.tar
# or
sudo docker load < ubuntu_16.10.tar
移除本地端映像檔
- 如果要移除本地端的映像檔,可以使用 docker rmi 命令。注意 docker rm 命令是移除容器。
- 注意:在刪除映像檔之前要先用 docker rm 刪掉依賴於這個映像檔的所有容器。
sudo docker rmi ubuntu:16.10
Untagged: ubuntu:16.10
Untagged: ubuntu@sha256:ba681180e3cf92407a9b0cad95cf6728de479d599cd8030922172c21c595d382
Deleted: sha256:4b5e1ea5f91375ab8ea6150581e1ae65405febcf07f5cce54807e7870b53bba1
容器
- 容器是 Docker 又一核心概念。簡單的說,容器是獨立執行的一個或一組應用,以及它們的執行態環境。
- 換句話說,虛擬機可以理解為模擬執行的一整套作業系統(提供了執行態環境和其他系統環境)和跑在上面的應用。
- 如果把映像檔比喻成光碟,則容器可視為虛擬光碟機。
啟動容器
- 啟動容器有兩種方式,一種是將映像檔新建一個容器並啟動,另外一個是將終止狀態(stopped)的容器重新啟動。
* 新建並啟動 : docker run
# 輸出一個 “Hello World”,之後終止容器。
sudo docker run ubuntu:16.10 /bin/echo 'Hello world'
hello world
- 下面的命令則啟動一個 bash 終端,允許使用者進行互動。
- -t 選項讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上
- -i 則讓容器的標準輸入保持打開。
- 在互動模式下,使用者可以透過所建立的終端來輸入命令
sudo docker run -t -i ubuntu:16.10 /bin/bash
root@af8bae53bdd3:/#
當利用 docker run 來建立容器時,Docker 在後臺執行的標準操作包括:
- 檢查本地是否存在指定的映像檔,不存在就從公有倉庫下載
- 利用映像檔建立並啟動一個容器
- 分配一個檔案系統,並在唯讀的映像檔層外面掛載一層可讀寫層
- 從宿主主機設定的網路橋界面中橋接一個虛擬埠到容器中去
- 從位址池中設定一個 ip 位址給容器
- 執行使用者指定的應用程式
- 執行完畢後容器被終止
啟動已終止容器 : docker start 直接將一個已經終止的容器啟動執行。
daemon執行
- 更多的時候,需要讓 Docker 容器在後臺以守護態(Daemonized)形式執行。此時,可以透過新增 -d 參數來實作。
sudo docker run -d ubuntu:16.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
- 容器啟動後會返回一個唯一的 id,也可以透過 docker ps 命令來查看容器訊息。
- 要取得容器的輸出訊息,可以透過 docker logs 命令。
- 可用 docker ststs 查看容器使用資源量。
docker run命令
- 常用選項說明:
- -d: daemon
- -e: 設定container的環境變數
- -i: interactive
- --name: 設定container固定名稱,否則使用UUID
- -p HOST_PORT:CONTAINER_PORT, 將host port對映到container的port,可使用單一或多個ports的對映方式。
- -P: cotainer內部任意port映射到host任意port
- --restart="no", 設定container離開時的行為,預設為no,可選{no, on-failure[:max-retry], always, unless-stopped}
- -t: pseudo tty
- -v HOST_DIR:CONTAINER_DIR[:OPTIONS], OPTIONS可為rw: 可讀寫,ro: 唯讀,nocopy: 不可複制
- -v /etc/localtime:/etc/localtime:ro, 進階招式,讓 container 與 host 的時間一致。
停止容器
- 可以使用 docker stop 來終止一個執行中的容器。
- 此外,當Docker容器中指定的應用終結時,容器也自動終止。
- 例如對於啟動了一個終端機的容器,使用者透過 exit 命令或 Ctrl+d 來退出終端時,所建立的容器立刻終止。
- 終止狀態的容器可以用 docker ps -a 命令看到
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
63a66939b030 training/sinatra "/bin/bash" 4 hours ago Exited (1) 4 hours ago peaceful_dijkstra
ffac1e4b6e55 4b5e1ea5f913 "/bin/bash" 5 hours ago Exited (127) 5 hours ago serene_bell
- 處於終止狀態的容器,可以透過 docker start 命令來重新啟動。
- 此外, docker restart 命令會將一個執行中的容器終止,然後再重新啟動它。
進入容器
在使用 -d 參數時,容器啟動後會進入後臺。 某些時候需要進入容器進行操作,有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。
exec 命令
# 背景執行容器
$sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
# 檢視容器
$sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
# 進入容器
$sudo docker exec -ti nostalgic_hypatia bash
root@243c32535da7:/#
- attach 命令
- 但是使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執行操作了。
# 背景執行容器
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
# 檢視容器
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
# 進入容器
$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#
匯出和匯入容器
- 如果要匯出本地某個容器,可以使用 docker export 命令。
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ sudo docker export 7691a814370e > ubuntu.tar
- 可以使用 docker import 從容器快照檔案中再匯入為映像檔
- 使用者既可以使用 docker load 來匯入映像檔儲存檔案到本地映像檔庫,也可以使用 docker import 來匯入一個容器快照到本地映像檔庫。
- 這兩者的區別在於容器快照檔案將丟棄所有的歷史記錄和原始資料訊息(即僅保存容器當時的快照狀態),
- 而映像檔儲存檔案將保存完整記錄,檔案體積也跟著變大。此外,從容器快照檔案匯入時可以重新指定標籤等原始資料訊息。
cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
# 也可以透過指定 URL 或者某個目錄來匯
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
刪除容器
- 可以使用 docker rm 來刪除一個處於終止狀態的容器
- 如果要刪除一個執行中的容器,可以新增 -f 參數。Docker 會發送 SIGKILL 信號給容器。+
$sudo docker rm trusting_newton
trusting_newton
- 停止且刪除所有容器
sudo docker stop `sudo docker ps -a -q`
sudo docker rm `sudo docker ps -a -q`
倉庫(repository)
- 倉庫(Repository)是集中存放映像檔的地方。
- 一個容易混淆的概念是註冊伺服器(Registry)。實際上註冊伺服器是管理倉庫的具體伺服器,每個伺服器上可以有多個倉庫,而每個倉庫下面有多個映像檔。
- 大部分時候,並不需要嚴格區分這兩者的概念。
Docker Hub
- 目前 Docker 官方維護了一個公共倉庫 Docker Hub,其中已經包括了超過 15,000 的映像檔。大部分需求,都可以透過在 Docker Hub 中直接下載映像檔來實作。
- 可以透過執行 docker login 命令來輸入使用者名稱、密碼和電子信箱來完成註冊和登錄。 註冊成功後,本地使用者目錄的 .dockercfg 中將保存使用者的認證訊息。
- 使用者無需登錄即可透過 docker search 命令來查詢官方倉庫中的映像檔,並利用 docker pull 命令來將它下載到本地。
- 可以看到顯示了很多包含關鍵字的映像檔,其中包括映像檔名字、描述、星級(表示該映像檔的受歡迎程度)、是否官方建立、是否自動建立。
- 官方的映像檔說明是官方專案組建立和維護的,automated 資源允許使用者驗證映像檔的來源和內容。
# search
$ sudo docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 465 [OK]
tianon/centos CentOS 5 and 6, created using rinse instea... 28
blalor/centos Bare-bones base CentOS 6.5 image 6 [OK]
saltstack/centos-6-minimal 6 [OK]
tutum/centos-6.4 DEPRECATED. Use tutum/centos:6.4 instead. ... 5 [OK]
...
- 根據是否是官方提供,可將映像檔資源分為兩類。
- 一種是類似 centos 這樣的基礎映像檔,被稱為基礎或根映像檔。這些基礎映像檔是由 Docker 公司建立、驗證、支援、提供。這樣的映像檔往往使用單個單詞作為名字。
- 還有一種類型,比如 tianon/centos 映像檔,它是由 Docker 的使用者建立並維護的,往往帶有使用者名稱前綴。可以透過前綴 user_name/ 來指定使用某個使用者提供的映像檔,比如 tianon 使用者。
- 另外,在查詢的時候透過 -s N 參數可以指定僅顯示評價為 N 星以上的映像檔。
# 下載image
sudo docker pull centos
自動建立
- 自動建立(Automated Builds)功能對於需要經常升級映像檔內程式來說,十分方便。 有時候,使用者建立了映像檔,安裝了某個軟體,如果軟體發布新版本則需要手動更新映像檔。。
- 而自動建立允許使用者透過 Docker Hub 指定跟蹤一個目標網站(目前支援 GitHub 或 BitBucket)上的專案,一旦專案發生新的提交,則自動執行建立。
- 要設定自動建立,包括以下的步驟:
- 建立並登陸 Docker Hub,以及目標網站;
- 在目標網站中連接帳戶到 Docker Hub;
- 在 Docker Hub 中 設定一個自動建立;
- 選取一個目標網站中的專案(需要含 Dockerfile)和分支;
- 指定 Dockerfile 的位置,並提交建立。
- 之後,可以 在Docker Hub 的 自動建立頁面 中跟蹤每次建立的狀態。
Docker 資料管理
- Docker 容器中管理資料主要有兩種方式:
- 資料卷(Data volumes)
- 資料卷容器(Data volume containers)
資料卷(data volume)
資料卷是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
- 資料卷可以在容器之間共享和重用
- 對資料卷的修改會立馬生效
- 對資料卷的更新,不會影響映像檔
- 卷會一直存在,直到沒有容器使用
- 資料卷的使用,類似於 Linux 下對目錄或檔案進行 mount。
建立一個資料卷
- 在用 docker run 命令的時候,使用 -v 標記來建立一個資料卷並掛載到容器裡。在一次 run 中多次使用可以掛載多個資料卷。
# 建立一個 web 容器,並載入一個資料卷到容器的 /webapp 目錄。
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
# 掛載一個主機目錄作為資料卷,載入主機的 /src/webapp 目錄到容器的 /opt/webapp 目錄
# 本地目錄的路徑必須是絕對路徑
sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
# Docker 掛載資料卷的預設權限是讀寫,使用者也可以透過 :ro 指定為唯讀。
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
# 掛載一個本地主機檔案作為資料卷
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
# 注意:如果直接掛載一個檔案,很多檔案編輯工具,包括 vi 或者 sed --in-place,可能會造成檔案 inode 的改變,
# 從 Docker 1.1 .0起,這會導致報錯誤訊息。所以最簡單的辦法就直接掛載檔案的父目錄。+
資料卷容器(data volume container)
如果你有一些持續更新的資料需要在容器之間共享,最好建立資料卷容器。
- 資料卷容器,其實就是一個正常的容器,專門用來提供資料卷供其它容器掛載的。
- 使用 --volumes-from 參數所掛載資料卷的容器自己並不需要保持在執行狀態。
如果刪除了掛載的容器(包括 dbdata、db1 和 db2),資料卷並不會被自動刪除。如果要刪除一個資料卷,必須在刪除最後一個還掛載著它的容器時使用 docker rm -v 命令來指定同時刪除關聯的容器。 這可以讓使用者在容器之間升級和移動資料卷
# 建立一個命名的資料卷容器 dbdata
sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
# 然後,在其他容器中使用 --volumes-from 來掛載 dbdata 容器中的資料卷。
sudo docker run -d --volumes-from dbdata --name db1 training/postgres
sudo docker run -d --volumes-from dbdata --name db2 training/postgres
# 使用多個 --volumes-from 參數來從多個容器掛載多個資料卷。 也可以從其他已經掛載了容器卷的容器來掛載資料卷。
sudo docker run -d --name db3 --volumes-from db1 training/postgres
利用資料卷容器來備份、恢復、遷移資料卷
- 首先使用 --volumes-from 標記來建立一個載入 dbdata 容器卷的容器,並從本地主機掛載當前到容器的 /backup 目錄。命令以下:
- 容器啟動後,使用了 tar 命令來將 dbdata 卷備份為本地的 /backup/backup.tar。
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
- 恢復: 如果要恢復資料到一個容器,首先建立一個帶有資料卷的容器 dbdata2。
sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
# 然後建立另一個容器,掛載 dbdata2 的容器,並使用 untar 解壓備份檔案到掛載的容器卷中。
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
/backup/backup.tar