什么是 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)
- 持續(xù)部署與測試得运;
- 跨云平臺(tái)支持膝蜈;
- 環(huán)境標(biāo)準(zhǔn)化和版本控制;
- 高效資源利用率與隔離熔掺;
- 容器跨平臺(tái)性與鏡像彬檀;
- 易于理解且易用;
- 應(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)限菌瘫。
為了避免每次命令都輸入 sudo蜗顽,可以把用戶加入 Docker 用戶組:
- 創(chuàng)建 Docker 用戶組:
$ sudo groupadd docker
- 添加用戶到 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
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-D
或CTRL-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
逮京、history
和 logs
命令
查看 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]