Docker 的三要素:
Docker 鏡像是一個特殊的文件系統(tǒng),除了提供容器運行時所需的程序求厕、庫著隆、資源、配置等文件外呀癣,還包含了一些為運行時準備的一些配置參數(shù)(如匿名卷美浦、環(huán)境變量、用戶等)项栏。鏡像不包含任何動態(tài)數(shù)據(jù)浦辨,其內(nèi)容在構建之后也不會被改變。
鏡像(Image)和容器(Container)的關系沼沈,就像是面向對象程序設計中的 類 和 實例 一樣流酬,鏡像是靜態(tài)的定義,容器是鏡像運行時的實體列另。容器可以被創(chuàng)建芽腾、啟動、停止页衙、刪除摊滔、暫停等。
倉庫:鏡像構建完成后店乐,可以很容易的在當前宿主機上運行艰躺,但是,如果需要在其它服務器上使用這個鏡像眨八,我們就需要一個集中的存儲腺兴、分發(fā)鏡像的服務,Docker Registry 就是這樣的服務踪古。
一個 Docker Registry 中可以包含多個 倉庫(Repository)含长;每個倉庫可以包含多個 標簽(Tag)券腔;每個標簽對應一個鏡像。
獲取鏡像:
從 Docker 鏡像倉庫獲取鏡像的命令是 docker pull拘泞。其命令格式為:
docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標簽]
具體的選項可以通過 docker pull --help 命令看到纷纫,這里我們說一下鏡像名稱的格式。
Docker 鏡像倉庫地址:地址的格式一般是 <域名/IP>[:端口號]陪腌。默認地址是 Docker Hub辱魁。
倉庫名:如之前所說,這里的倉庫名是兩段式名稱诗鸭,即 <用戶名>/<軟件名>染簇。對于 Docker Hub,如果不給出用戶名强岸,則默認為 library锻弓,也就是官方鏡像。
例子:
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
bf5d46315322: Pull complete
9f13e0ac480c: Pull complete
e8988b5b3097: Pull complete
40af181810e7: Pull complete
e6f7c7e5c03e: Pull complete
Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe
Status: Downloaded newer image for ubuntu:18.04
運行
有了鏡像后蝌箍,我們就能夠以這個鏡像為基礎啟動并運行一個容器青灼。以上面的 ubuntu:18.04 為例,如果我們打算啟動里面的 bash 并且進行交互式操作的話妓盲,可以執(zhí)行下面的命令杂拨。
$ docker run -it --rm \ ubuntu:18.04 \ bash
root@e7009c6ce357:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
docker run 就是運行容器的命令,具體格式我們會在 容器 一節(jié)進行詳細講解悯衬,我們這里簡要的說明一下上面用到的參數(shù)弹沽。
-it:這是兩個參數(shù),一個是 -i:交互式操作筋粗,一個是 -t 終端策橘。我們這里打算進入 bash 執(zhí)行一些命令并查看返回結果,因此我們需要交互式終端亏狰。
--rm:這個參數(shù)是說容器退出后隨之將其刪除役纹。默認情況下,為了排障需求暇唾,退出的容器并不會立即刪除促脉,除非手動 docker rm。我們這里只是隨便執(zhí)行個命令策州,看看結果瘸味,不需要排障和保留結果,因此使用 --rm 可以避免浪費空間够挂。
ubuntu:18.04:這是指用 ubuntu:18.04 鏡像為基礎來啟動容器旁仿。
bash:放在鏡像名后的是 命令,這里我們希望有個交互式 Shell,因此用的是 bash枯冈。
進入容器后毅贮,我們可以在 Shell 下操作,執(zhí)行任何所需的命令尘奏。這里滩褥,我們執(zhí)行了 cat /etc/os-release,這是 Linux 常用的查看當前系統(tǒng)版本的命令炫加,從返回的結果可以看到容器內(nèi)是 Ubuntu 18.04.1 LTS 系統(tǒng)瑰煎。
列出鏡像
要想列出已經(jīng)下載下來的鏡像,可以使用 docker image ls 命令俗孝。
$ docker image ls
REPOSITORY? ? ? ? ? TAG? ? ? ? ? ? ? ? IMAGE ID? ? ? ? ? ? CREATED? ? ? ? ? ? SIZE
redis? ? ? ? ? ? ? ? latest? ? ? ? ? ? ? 5f515359c7f8? ? ? ? 5 days ago? ? ? ? ? 183 MB
nginx? ? ? ? ? ? ? ? latest? ? ? ? ? ? ? 05a60462f8ba? ? ? ? 5 days ago? ? ? ? ? 181 MB
mongo? ? ? ? ? ? ? ? 3.2? ? ? ? ? ? ? ? fe9198c04d62? ? ? ? 5 days ago? ? ? ? ? 342 MB
<none>? ? ? ? ? ? ? <none>? ? ? ? ? ? ? 00285df0df87? ? ? ? 5 days ago? ? ? ? ? 342 MB
ubuntu? ? ? ? ? ? ? 18.04? ? ? ? ? ? ? f753707788c5? ? ? ? 4 weeks ago? ? ? ? 127 MB
ubuntu? ? ? ? ? ? ? latest? ? ? ? ? ? ? f753707788c5? ? ? ? 4 weeks ago? ? ? ? 127 MB
列表包含了 倉庫名酒甸、標簽、鏡像 ID赋铝、創(chuàng)建時間 以及 所占用的空間插勤。
其中倉庫名、標簽在之前的基礎概念章節(jié)已經(jīng)介紹過了柬甥。鏡像 ID 則是鏡像的唯一標識饮六,一個鏡像可以對應多個 標簽其垄。因此苛蒲,在上面的例子中,我們可以看到 ubuntu:18.04 和 ubuntu:latest 擁有相同的 ID绿满,因為它們對應的是同一個鏡像臂外。
docker image ls 會列出所有頂層鏡像,但是有時候我們只希望列出部分鏡像喇颁。
列出特定的某個鏡像漏健,也就是說指定倉庫名和標簽
$ docker image ls ubuntu:18.04
REPOSITORY? ? ? ? ? TAG? ? ? ? ? ? ? ? IMAGE ID? ? ? ? ? ? CREATED? ? ? ? ? ? SIZE
ubuntu? ? ? ? ? ? ? 18.04? ? ? ? ? ? ? f753707788c5? ? ? ? 4 weeks ago? ? ? ? 127 MB
刪除本地鏡像
如果要刪除本地的鏡像,可以使用 docker image rm 命令橘霎,其格式為:
$ docker image rm [選項] <鏡像1> [<鏡像2> ...]
用 ID蔫浆、鏡像名、摘要刪除鏡像
其中姐叁,<鏡像> 可以是 鏡像短 ID瓦盛、鏡像長 ID、鏡像名 或者 鏡像摘要外潜。
用 docker image ls 命令來配合
像其它可以承接多個實體的命令一樣原环,可以使用 docker image ls -q 來配合使用 docker image rm,這樣可以成批的刪除希望刪除的鏡像处窥。我們在“鏡像列表”章節(jié)介紹過很多過濾鏡像列表的方式都可以拿過來使用嘱吗。
比如,我們需要刪除所有倉庫名為 redis 的鏡像:
$ docker image rm $(docker image ls -q redis)
或者刪除所有在 mongo:3.2 之前的鏡像:
$ docker image rm $(docker image ls -q -f before=mongo:3.2)
充分利用你的想象力和 Linux 命令行的強大滔驾,你可以完成很多非常贊的功能谒麦。
鏡像是多層存儲俄讹,每一層是在前一層的基礎上進行的修改;而容器同樣也是多層存儲绕德,是在以鏡像為基礎層颅悉,在其基礎上加一層作為容器運行時的存儲層。下面是一個 Web 服務器為例子迁匠,來講解鏡像是如何構建的剩瓶。
$ docker run --name webserver -d -p 80:80 nginx
這條命令會用 nginx 鏡像啟動一個容器,命名為 webserver城丧,并且映射了 80 端口延曙,這樣我們可以用瀏覽器去訪問這個 nginx 服務器。
docker commit 的語法格式為:
docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標簽>]]
關于Docker容器基本操作:
1.查看本地的容器進程:
[root@docker ~]# docker ps -a?
2.啟動容器(運行鏡像)
docker run 是日常的最頻繁用的命令之一亡哄,同樣也是較為復雜的命令之一
命令格式:docker run[OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS: 選項:
-i : 表示啟動一個可以互動的容器
-t: 表示使用終端關聯(lián)到容器的標準輸入輸出上
-d:表示將容器放置在后臺運行
-rm: 退出后即刪除容器
-name:表示要運行的鏡像
COMMAND:表示啟動容器時要運行的命令
3.交互式啟動一個容器:
[root@docker ~]#? docker run -ti stanleyws/alpine:v3.10.1 /bin/sh?
[root@docker ~]# docker images | grep alpine
4.非交互式啟動一個容器
[root@docker ~]#? docker run --rm stanleyws/alpine:v3.10.1 /bin/echo hello?
hello?
5.非交互式啟動一個后臺容器:
[root@docker ~]#? docker run -d --name myalpine stanleyws/alpine:v3.10.1 /bin/sleep 300?
6.查看宿主機進程:
[root@docker ~]#? ps aux | grep sleep | grep -v grep
root 49302 0.0 0.0 1540 244 枝缔?Ss 16:45 0:00 sleep 300?
7.進入容器:
[root@docker ~]#? docker exec -ti myalpine /bin/sh?
/ # ps aux?
8.停止/啟動/重啟容器
1) 停止容器:
[root@docker ~]#? docker stop myalpine?
myalpine?
[root@docker ~]#? docker ps -a?
[root@docker ~]#? docker start/stop/restart enb098dhs348
[root@docker ~]#? docker rm -f myalpine1?
####過濾出已經(jīng)退出的容器,再全部刪除:
[root@docker ~]#? for i in 'docker ps -a|grep -i exit | awk '{print $1}'';do docker rm -f $i;done?
9.導出/導入鏡像:
1)導出鏡像
[root@docker ~]#? docker images?
[root@docker ~]# docker save 097834c4dr > alpine_with_1.txt.tar?
[root@docker ~]#? ls?
alpine_with_1.txt.tar?
2) 查看容器的日志:
[root@docker ~]#? docker rm 83h56jsnsv90
[root@docker ~]# docker run hello-world 2>&1 >>/dev/null?
[root@docker ~]#? docker ps -a | grep hello?
[root@docker ~]# docker logs -f 42bd19eys56g?
--------------------------------------------------------------------------------------------
[root@docker ~]#? docker start/stop/restart?
[root@docker ~]#? docker rm (-f)
[root@docker ~]# docker exec/commit?
[root@docker ~]# docker logs(-f)
==============================================
10. Docker容器的高級操作:
1)映射端口:
? ?docker run? -p? 容器外端口:容器內(nèi)端口
2)掛載數(shù)據(jù)卷
? ?docker run -v 容器外目錄:容器內(nèi)目錄
3)傳遞環(huán)境變量
? docker run -e 環(huán)境變量key=環(huán)境變量value
4)容器內(nèi)安裝軟件(工具)
? yum /apt-get/apt 等
==============================================
11.下載nginx鏡像
[root@docker ~]#? docker pull nginx:1.12.2?
1.12.2:Pulling from library/nginx?
[root@docker ~]#? docker images | grep nginx?
nginx? ?1.12.2? ? ?4037a883b034? 15 months ago 108MB?
[root@docker ~]#? docker tag?4037a883b034? stanleyws/nginx:v1.12.2?
[root@docker ~]# docker images | grep nginx?
nginx? ? ? ? ? ? ? ? ? ? ? ? ? 1.12.2? ? ?4037a883b034? 15 months ago 108MB?
stanleyws/nginx? ? ? ? ?v1.12.2? ??4037a883b034??15 months ago 108MB?
==================================================
12.映射端口:
[root@docker ~]# docker run -d -p81:80 stanleyws/nginx:v1.12.2?
cf47229ea987bbe0e6e456695kzjnahaj8992jyzag902
[root@docker ~]# netstat -luntp | grep 81?
tcp6? ?0? ? ?0? ?:::81? ? ? ? :::*? ? LISTEN 52802/docker?
13.掛載數(shù)據(jù)卷:
[root@docker ~]# mkdir html?
[root@docker ~]# cd html/
[root@docker html]#? wget www.baidu.com -O index.html?
[root@docker ~]#? docker run -d --rm --name nginx_with_baidu -d -p82:80 -v/root/html:/usr/share/nginx/html oldboy1103/nginx:v1.12.2?
8c440besccs2f2ekzhi8uhgbz92nxysuajgz907hgz8qxua7?
[root@docker ~]# docker ps -a?
[root@docker ~]# docker exec -ti nginx_with_baidu /bin/bash?
root@8c440bescc:/#? cd? /usr/share/nginx/html?
root@8c440bescc: /usr/share/nginx/html#? ls
root@8c440bescc: /usr/share/nginx/html# cat indes.html?
==================================================
14. 給容器傳遞環(huán)境變量
[root@docker ~]# docker run --rm -e E_OPTS=abcdefg stanleyws/nginx:v1.12.2 printenv?
PATH=/usr/local/sbin:/usr/local/bin/:/usr/sbin:/usr/bin:/sbin/bin
15.容器內(nèi)安裝軟件:
[root@docker ~]# docker run -ti --rm stanleyws/nginx:v1.12.2 bash?
root@b5ff598aeee7:/ curl?
bash: curl : command not found?
root@b5ff598aeee7:/#? tee /etc/apt/sources.list << EOF?
> deb http://mirrors.163.com/debian/ jessie main non-free contrib?
> deb?http://mirrors.163.com/debian/ jessie-updates main non-free contrib?
> EOF?
root@b5ff598aeee7:/ apt-get update && apt-get install curl -y?