Docker 基本用法

什么是 Docker湃交?

Docker 是以 「Docker 容器」為資源分割和調(diào)度的基本單位熟空,封裝整個(gè)軟件運(yùn)行時(shí)環(huán)境,為開發(fā)者和系統(tǒng)管理員設(shè)計(jì)的搞莺,用于構(gòu)建息罗、發(fā)布和運(yùn)行分布式應(yīng)用的平臺(tái)。它是一個(gè)跨平臺(tái)才沧、可移植并且簡單易用的容器解決方案迈喉。

Docker 的源代碼托管在 GitHub 上绍刮,基于 Go 語言開發(fā)并遵從 Apache 2.0 開源協(xié)議。

Docker 可在容器內(nèi)部快速自動(dòng)化地部署應(yīng)用挨摸,并通過操作系統(tǒng)內(nèi)核技術(shù)(namespaces孩革、groups 等)為容器提供資源隔離與安全保障。

容器技術(shù)的優(yōu)點(diǎn)

  1. 持續(xù)部署與測試得运;
  2. 跨云平臺(tái)支持膝蜈;
  3. 環(huán)境標(biāo)準(zhǔn)化和版本控制;
  4. 高效資源利用率與隔離熔掺;
  5. 容器跨平臺(tái)性與鏡像彬檀;
  6. 易于理解且易用;
  7. 應(yīng)用鏡像倉庫瞬女;

在 Ubuntu 系統(tǒng)中安裝 Docker

卸載舊版本:

$ sudo apt-get remove docker docker-engine docker.io containerd runc

更新并安裝軟件包:

$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install apt-transport-https ca-certificates

添加使用 HTTPS 傳輸?shù)能浖约?CA 證書:

$ sudo apt-get install apt-transport-https \
                       ca-certificates \
                       curl \
                       gnupg-agent \
                       software-properties-common

添加GPG密鑰...

# 添加軟件源的 GPG 密鑰
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 官方源
# $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 向 source.list 中添加 Docker 軟件源
$ sudo add-apt-repository \
    "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
# 官方源
# $ sudo add-apt-repository \
#    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
#    $(lsb_release -cs) \
#    stable"

安裝 Docker 及相關(guān)組件:

$ sudo apt-get install docker \
                       docker.io \
                       docker-compose

開啟 Docker 服務(wù):

$ sudo service docker start

關(guān)閉 Docker 服務(wù):

$ sudo service docker stop

重啟 Docker 服務(wù):

$ sudo service docker restart

關(guān)于 root 權(quán)限

docker 命令的執(zhí)行一般都需要獲取 root 權(quán)限,因?yàn)?Docker 的命令行工具 docker 與 docker daemon 是同一個(gè)二進(jìn)制文件努潘,而 Docker daemon 負(fù)責(zé)接收并執(zhí)行來自 docker 的命令诽偷,它的運(yùn)行需要 root 權(quán)限。同時(shí)疯坤,從 Docker 0.5.2 版本開始报慕,Docker daemon 默認(rèn)綁定一個(gè) Unix Socket 來代替原有的 TCP 端口,該 Unix Socket 默認(rèn)是屬于 root 用戶的压怠。因此眠冈,在執(zhí)行 docker 命令時(shí),需要使用 sudo 來獲取 root 權(quán)限菌瘫。

Manage Docker as a non-root user

為了避免每次命令都輸入 sudo蜗顽,可以把用戶加入 Docker 用戶組:

  1. 創(chuàng)建 Docker 用戶組:
$ sudo groupadd docker
  1. 添加用戶到 docker 組:
$ sudo usermod -aG docker $USER

使用阿里云鏡像加速器

阿里云 ?? 管理控制臺(tái) ?? 容器鏡像服務(wù) ?? 鏡像加速器

配置七牛云鏡像,參考:https://kirk-enterprise.github.io/hub-docs/#/user-guide/mirror

Docker 子命令列表

子命令分類 子命令
環(huán)境信息 info雨让、version
容器生命周期管理 create雇盖、exec、kill栖忠、start崔挖、restart、pause庵寞、unpause狸相、rm、run捐川、stop
鏡像倉庫管理 login脓鹃、logout、pull属拾、push将谊、search
鏡像管理 build冷溶、images、import尊浓、load逞频、rmi、save栋齿、tag苗胀、commit
容器運(yùn)維操作 attach、export瓦堵、inspect基协、port、ps菇用、rename澜驮、stats、top惋鸥、wait杂穷、cp、diff卦绣、update
容器資源管理 volume耐量、network
日系日志信息 events、history滤港、logs

查看子命令詳細(xì)用法:

$ docker COMMAND --help
docker命令結(jié)構(gòu)圖

1. Docker 環(huán)境信息

# 檢查 Docker 環(huán)境信息
$ docker info
...

# 檢查安裝后的 Docker 版本
$ docker version
...

$ docker --version
$ docker -v
Docker version 18.09.7, build 2d0083d


# 檢查 Docker Compose 版本
$ docker-compose --version
docker-compose version 1.21.1, build 5a3f1a3


# 檢查 Docker Machine 版本
$ docker-machine --version
docker-machine version 0.14.0, build 89b8332

2. 容器生命周期管理

docker run 命令

docker run 命令用來基于特定的鏡像創(chuàng)建一個(gè)容器廊蜒,并依據(jù)選項(xiàng)來控制該容器。

當(dāng)利用 docker run 來創(chuàng)建容器時(shí)溅漾,Docker 在后臺(tái)運(yùn)行的標(biāo)準(zhǔn)操作包括:

  • 檢查本地是否存在指定的鏡像山叮,不存在就從公有倉庫下載;
  • 利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器添履;
  • 分配一個(gè)文件系統(tǒng)聘芜,并在只讀的鏡像層外面掛載一層可讀寫層;
  • 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中去缝龄;
  • 從地址池配置一個(gè) ip 地址給容器汰现;
  • 執(zhí)行用戶指定的應(yīng)用程序;
  • 執(zhí)行完畢后容器被終止叔壤;

用法:docker run [OPTIONS] IMAGE [COMMAND][ARG...]

# 從 ubuntu 鏡像啟動(dòng)一個(gè)容器瞎饲,并執(zhí)行 echo 命令打印出 “Hello World”。執(zhí)行完 echo 命令后炼绘,容器將停止運(yùn)行嗅战。
$ docker run ubuntu echo "Hello World"

# 使用鏡像 ubuntu:latest 啟動(dòng)一個(gè)容器,并為它分配一個(gè)偽終端執(zhí)行 /bin/bash 命令
# 進(jìn)入偽終端后,exit/Ctrl+D 即可退出驮捍,同時(shí)容器終止運(yùn)行剑刑。
# Ctrl+C:退出到宿主機(jī)并關(guān)閉容器蚤霞;
# Ctrl+P/Ctrl+Q:退出到宿主機(jī)但保持容器運(yùn)行
# Ctrl+P+Q:退出容器但不關(guān)閉容器
$ docker run -i -t --name mytest ubuntu:latest /bin/bash

# 以后臺(tái)方式運(yùn)行一個(gè) Nginx 服務(wù)器
$ docker run -d -p 80:80 --rm --name mynginx nginx

# --link name:alias 在兩個(gè)容器之間建立聯(lián)系
# 啟動(dòng) Redis 容器闽瓢,將從數(shù)據(jù)庫連接到主數(shù)據(jù)庫
$ docker run -it --name redis-master redis /bin/bash
$ docker run -it --name redis-slave1 --link redis-master:master redis /bin/bash
參數(shù) 描述
-d 以后臺(tái)方式運(yùn)行
-i 使用交互模式金度,始終保持輸入流開放。
-t 分配一個(gè)偽終端珊泳,一般兩個(gè)參數(shù)結(jié)合時(shí)使用 -it鲁冯,即可在容器中利用打開的偽終端進(jìn)行交互操作。
--name 自定義容器名稱色查,若無此選項(xiàng)薯演,Docker 將為容器隨機(jī)分配一個(gè)名字。
--rm 容器停止運(yùn)行后秧了,自動(dòng)刪除容器文件跨扮。
-c 給運(yùn)行在容器中的所有進(jìn)程分配 CPU 的 shares 值。
-m 限制為容器中所有進(jìn)程分配的內(nèi)存總量验毡,以 B好港、K、M米罚、G 為單位。
-v 掛載 volume丈探。
-p 映射端口 <host_port:contain_port>
--link 通過 --link 選項(xiàng)來建立容器間的連接录择,不但可以避免容器的 IP 和端口暴露到外網(wǎng)所導(dǎo)致的安全問題,還可以防止容器在重啟后 IP 地址變化導(dǎo)致的訪問失效碗降,它的原理類似于 DNS 服務(wù)器的域名和地址映射隘竭。當(dāng)容器的 IP 地址發(fā)生變化時(shí),Docker 將自動(dòng)維護(hù)映射關(guān)系中的 IP 地址讼渊。

--link 參數(shù)的格式為 --link name:alias动看,其中 name 是要連接的容器的名稱,alias 是這個(gè)連接的別名爪幻。

docker start/stop/restart 命令

# 以后臺(tái)方式運(yùn)行一個(gè) Nginx 服務(wù)器
$ docker run -d -p 80:80 --name myserver nginx

# 停止運(yùn)行
$ docker stop myserver

# 刪除容器
$ docker rm myserver


$ docker container stop
$ docker container start
$ docker container restart

注釋:

  • -p 指定要映射的端口菱皆,并且,在一個(gè)指定端口上只可以綁定一個(gè)容器挨稿。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort仇轻。

docker rm 命令

# 刪除容器
$ docker rm CONTAINER_ID
$ docker rm CONTAINER_NAMES

# 刪除一個(gè)運(yùn)行中的容器
$ docker rm -f CONTAINER_ID
$ docker rm -f CONTAINER_NAMES

# 列出所有運(yùn)行中的容器
$ docker container ls
$ docker ps     

# 列出所有容器
$ docker container ls -a
$ docker ps -a

# 刪除所有處于終止?fàn)顟B(tài)的容器
$ docker container prune

# 刪除容器的同時(shí)移除數(shù)據(jù)卷
$ docker rm -v CONTAINER_ID

$ docker stop $(docker ps -a -q)   # 停止運(yùn)行所有容器
$ docker rm $(docker ps -a -q)     # 刪除所有容器

3. Docker registry

當(dāng)用戶創(chuàng)建了自己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺(tái)機(jī)器上使用這個(gè)鏡像時(shí)奶甘,只需要從倉庫上 pull 下來就可以了篷店。

官方鏡像倉庫:Docker Hub

docker pull 命令

從 Docker Hub 倉庫獲取所需要的鏡像。

用法:

$ docker pull [選項(xiàng)] [Docker Registry 地址[:端口號(hào)]/]倉庫名[:標(biāo)簽]
$ docker pull [OPTIONS] NAME[:TAG]
$ docker pull username/repository<:tag_name>
$ docker pull registry.domain.com/repos:<tag_name>

示例:

# 從Docker Hub 倉庫下載 nginx:latest 鏡像
$ docker pull nginx

# 從 Docker Hub 倉庫下載 Ubuntu:18.04 鏡像
$ docker pull ubuntu:18.04
# 同上
$ docker pull registry.hub.docker.com/ubuntu:18.04

docker push 命令

用戶也可以在登錄(docker login)后通過 docker push 命令來將鏡像推送到 Docker Hub臭家。

$ docker push SEL/ubuntu

docker search 命令

用戶無需登錄即可通過 docker search 命令來查找官方倉庫中的鏡像疲陕,并利用 docker pull 命令來將它下載到本地方淤。

用法:docker search TEAM

# 從官方鏡像和所有個(gè)人公共鏡像中搜索鏡像
$ docker search nginx

4. 鏡像管理

docker images 命令

# 默認(rèn)列出最頂層的鏡像
$ docker image ls
$ docker images

# 列出所有已下載鏡像
$ docker image ls -a

# 顯示完整的 IMAGE ID
$ docker image ls --no-trunc

# 只顯示鏡像 ID
$ docker image ls -q

# 使用過濾參數(shù)列出指定鏡像
$ docker image ls --filter <選項(xiàng)>

docker rmi 命令

# 命令格式
$ docker image rm [選項(xiàng)] <鏡像1> [<鏡像2> ...]

# 刪除指定鏡像
$ docker rmi IMAGE_ID

# 刪除所有鏡像
$ docker rmi $(docker image ls -a -q) 

注意:在刪除鏡像之前要先用 docker rm 刪掉依賴于這個(gè)鏡像的所有容器。

5. 容器運(yùn)維操作

docker attach 命令

連接到正在運(yùn)行的容器蹄殃。

用法:docker attach [OPTIONS] CONTAINER

$ docker attach --sig-proxy=false CONTAINER

??

attach 命令可以帶上 --sig-proxy=false 來確保 CTRL-DCTRL-C 不會(huì)關(guān)閉容器携茂。

docker exec 命令

  • 使用 attach 進(jìn)入容器后,exit 退出終端會(huì)導(dǎo)致容器終止窃爷;
  • 使用 exec 進(jìn)入容器后邑蒋,exit 退出不會(huì)導(dǎo)致容器終止;
# 命令格式
$ docker exec [OPTIONS] CONTAINER

# Enter the container
$ docker exec -it <container id> /bin/bash

docker inspect 命令

查看鏡像和容器的詳細(xì)信息按厘。

用法:docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]

# 查看容器的內(nèi)部IP
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' CONTAINER

# 通過 docker inspect 命令查看所掛載的volume情況
$ docker inspect --format='{{.Config.Volumes}}' CONTAINER
$ docker inspect --format='{{.Mounts}}' CONTAINER
$ docker inspect a9c9 | grep Mounts -A 10

docker ps 命令

查看容器的相關(guān)信息医吊,默認(rèn)只顯示正在運(yùn)行的容器的信息

$ docker ps     # 列出所有運(yùn)行中的容器
$ docker ps -a  # 列出所有容器
$ docker ps -l  # 查看最新創(chuàng)建的容器

$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                    NAMES
cc41e7a676a2        hyperledger/fabric-ca:1.2.0   "sh -c 'fabric-ca-..."   12 days ago         Up 12 days          0.0.0.0:7054->7054/tcp   fabric-ca-server

docker top 命令

查看容器中正在進(jìn)行的進(jìn)程

用法:docker top <container_id/container_name>

# host上使用此命令可以看到類似的進(jìn)程信息
$ ps -ef | grep docker 

docker commit 命令

將一個(gè) Docker 容器固化為一個(gè)新的鏡像。

用法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

??

官方建議通過 docker build 命令結(jié)合 Dockerfile 創(chuàng)建和管理鏡像

events逮京、historylogs 命令

查看 Docker 的系統(tǒng)日志信息

# 打印實(shí)時(shí)系統(tǒng)日志
$ docker events [OPTIONS]


# 指定鏡像的歷史版本信息
$ docker history [OPTIONS] IMAGE

$ docker history nginx:latest


# 容器中進(jìn)程的運(yùn)行日志
$ docker container logs [OPTIONS] CONTAINER
$ docker container logs [container ID or NAMES]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卿堂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子懒棉,更是在濱河造成了極大的恐慌草描,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件策严,死亡現(xiàn)場離奇詭異穗慕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妻导,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門逛绵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人倔韭,你說我怎么就攤上這事术浪。” “怎么了寿酌?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵胰苏,是天一觀的道長。 經(jīng)常有香客問我醇疼,道長硕并,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任秧荆,我火速辦了婚禮鲤孵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辰如。我一直安慰自己普监,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凯正,像睡著了一般毙玻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上廊散,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天桑滩,我揣著相機(jī)與錄音,去河邊找鬼允睹。 笑死运准,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缭受。 我是一名探鬼主播胁澳,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼米者!你這毒婦竟也來了韭畸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤蔓搞,失蹤者是張志新(化名)和其女友劉穎胰丁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喂分,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锦庸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蒲祈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甘萧。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖讳嘱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酿愧,我是刑警寧澤沥潭,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站嬉挡,受9級(jí)特大地震影響钝鸽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜庞钢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一拔恰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧基括,春花似錦颜懊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匠璧。三九已至,卻和暖如春咸这,著一層夾襖步出監(jiān)牢的瞬間夷恍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工媳维, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酿雪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓侄刽,卻偏偏與公主長得像指黎,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唠梨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • docker常用命令詳解 - CSDN博客 本文只記錄docker命令在大部分情境下的使用袋励,如果想了解每一個(gè)選項(xiàng)的...
    Meathill大魔王閱讀 799評(píng)論 1 2
  • 本文只記錄docker命令在大部分情境下的使用,如果想了解每一個(gè)選項(xiàng)的細(xì)節(jié)当叭,請(qǐng)參考官方文檔茬故,這里只作為自己以后的備...
    Joncc閱讀 275評(píng)論 0 0
  • Docker常用命令使用 docker ps列出容器使用語法:docker ps [options]options...
    StrongZhao閱讀 635評(píng)論 0 0
  • 一、Docker 簡介 Docker 兩個(gè)主要部件:Docker: 開源的容器虛擬化平臺(tái)Docker Hub: 用...
    R_X閱讀 4,382評(píng)論 0 27
  • 一.docker 是什么: 2.安裝docker 系統(tǒng):ubuntu16.04 使用腳本自動(dòng)安裝 Docker 官...
    Black_Sun閱讀 2,104評(píng)論 0 2