參考
1.Docker是什么
1.1 環(huán)境配置
軟件開發(fā)最大的麻煩事之一登刺,就是環(huán)境配置。用戶計算機(jī)的環(huán)境都不相同嗡呼,你怎么知道自家的軟件纸俭,能在那些機(jī)器跑起來?
用戶必須保證兩件事:操作系統(tǒng)的設(shè)置南窗,各種庫和組件的安裝揍很。只有它們都正確,軟件才能運(yùn)行万伤。舉例來說窒悔,安裝一個 Python 應(yīng)用,計算機(jī)必須有 Python 引擎敌买,還必須有各種依賴简珠,可能還要配置環(huán)境變量。
如果某些老舊的模塊與當(dāng)前環(huán)境不兼容,那就麻煩了聋庵。開發(fā)者常常會說:"它在我的機(jī)器可以跑了"(It works on my machine)膘融,言下之意就是,其他機(jī)器很可能跑不了祭玉。
環(huán)境配置如此麻煩氧映,換一臺機(jī)器,就要重來一次脱货,曠日費時岛都。很多人想到,能不能從根本上解決問題振峻,軟件可以帶環(huán)境安裝疗绣?也就是說,安裝的時候铺韧,把原始環(huán)境一模一樣地復(fù)制過來多矮。
1.2 虛擬機(jī)
虛擬機(jī)(virtual machine)就是帶環(huán)境安裝的一種解決方案。它可以在一種操作系統(tǒng)里面運(yùn)行另一種操作系統(tǒng)哈打,比如在 Windows 系統(tǒng)里面運(yùn)行 Linux 系統(tǒng)塔逃。應(yīng)用程序?qū)Υ撕翢o感知,因為虛擬機(jī)看上去跟真實系統(tǒng)一模一樣料仗,而對于底層系統(tǒng)來說湾盗,虛擬機(jī)就是一個普通文件,不需要了就刪掉立轧,對其他部分毫無影響格粪。
但存在以下問題:
- 資源占用多;
- 冗余步驟多氛改;
- 啟動慢帐萎;
1.3 Linux 容器
由于虛擬機(jī)存在這些缺點,Linux 發(fā)展出了另一種虛擬化技術(shù):Linux 容器(Linux Containers胜卤,縮寫LXC)疆导。
Linux 容器不是模擬一個完整的操作系統(tǒng),而是對進(jìn)程進(jìn)行隔離葛躏〕憾危或者說,在正常進(jìn)程的外面套了一個保護(hù)層舰攒。對于容器里面的進(jìn)程來說败富,它接觸到的各種資源都是虛擬的,從而實現(xiàn)與底層系統(tǒng)的隔離摩窃。
由于容器是進(jìn)程級別的兽叮,相比虛擬機(jī)有很多優(yōu)勢。
- 啟動快;
- 資源占用少充择;
- 體積械旅怠匪蟀;
1.4 Docker主要用途
Docker 的主要用途椎麦,目前有三大類。
- 提供一次性的環(huán)境材彪。比如观挎,本地測試他人的軟件、持續(xù)集成的時候提供單元測試和構(gòu)建的環(huán)境段化。
- 提供彈性的云服務(wù)。因為 Docker 容器可以隨開隨關(guān),很適合動態(tài)擴(kuò)容和縮容趁餐。
- 組建微服務(wù)架構(gòu)俐芯。通過多個容器,一臺機(jī)器可以跑多個服務(wù)喘蟆,因此在本機(jī)就可以模擬出微服務(wù)架構(gòu)缓升。
2.Docker安裝
Docker是一個開源的商業(yè)產(chǎn)品,有兩個版本:社區(qū)版(Community Edition蕴轨,縮寫為 CE)港谊;企業(yè)版(Enterprise Edition,縮寫為 EE)橙弱。企業(yè)版包含了一些收費服務(wù)歧寺。下面列舉是社區(qū)版安裝教程
2.1 檢測是否安裝成功
$ docker version
# 或者
$ docker info
2.2 開啟Docker服務(wù)
Docker 是服務(wù)器----客戶端架構(gòu)。命令行運(yùn)行docker命令的時候棘脐,需要本機(jī)有 Docker 服務(wù)斜筐。如果這項服務(wù)沒有啟動,可以用下面的命令啟動
# service 命令的用法
$ sudo service docker start
# systemctl 命令的用法
$ sudo systemctl start docker
3.Docker常用命令
3.1 鏡像
獲取鏡像(docker image pull)
Docker Hub 上有大量的高質(zhì)量的鏡像可以用蛀缝,我們可以直接獲取已經(jīng)做好的鏡像文件奴艾。
下面代碼中,docker image pull是抓取 image 文件的命令内斯。library/hello-world是 image 文件在倉庫里面的位置蕴潦,其中l(wèi)ibrary是 image 文件所在的組,hello-world是 image 文件的名字俘闯。
由于 Docker 官方提供的 image 文件潭苞,都放在library組里面,所以它的是默認(rèn)組真朗,可以省略此疹。
$ docker pull --help
$ docker image pull --help
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Pull an image or a repository from a registry
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output
$ docker image pull library/hello-world
$ docker image pull hello-world
列出鏡像(docker image ls)
列表包含了 倉庫名、標(biāo)簽、鏡像 ID蝗碎、創(chuàng)建時間 以及 所占用的空間湖笨。
(base) [12:48:37] root@VM-4-4-centos:~
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
rocker/rstudio latest 0f828055b20c 3 days ago 1.89GB
hello-world latest feb5d9fea6a5 2 weeks ago 13.3kB
codercom/code-server latest 08823d73807e 3 weeks ago 1.11GB
刪除本地鏡像(docker image rm)
可以通過image_ID 或 鏡像名來刪除
(base) [12:52:04] root@VM-4-4-centos:~
$ docker image rm hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:9ade9cc2e26189a19c2e8854b9c8f1e14829b51c55a630ee675a5a9540ef6ccf
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
(base) [12:53:39] root@VM-4-4-centos:~
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
rocker/rstudio latest 0f828055b20c 3 days ago 1.89GB
codercom/code-server latest 08823d73807e 3 weeks ago 1.11GB
3.2 容器
啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動蹦骑,另外一個是將在終止?fàn)顟B(tài)(exited)的容器重新啟動慈省。
新建并啟動(docker run)
常用的參數(shù):
-i:運(yùn)行容器
-t:容器啟動后會進(jìn)入命令行,將入這兩個參數(shù)后眠菇,容器創(chuàng)建殼登錄進(jìn)去边败,即分配一個偽終端
-d: 后臺運(yùn)行(創(chuàng)建容器后不會自動登錄容器,只加-i-t兩個參數(shù)捎废,創(chuàng)建后會自動進(jìn)入容器)
-v:表示目錄映射關(guān)系笑窜,前者是宿主機(jī)目錄,后者是容器映射目錄登疗。
-p : 標(biāo)識端口映射排截,前者是宿主機(jī)端口,后者是容器映射端口辐益《习粒可使用多個-p做端口映射
如果容器不存在,會自動docker pull 一個最新的image;
(base) [12:56:46] root@VM-4-4-centos:~
$ docker run ubuntu:18.04 /bin/echo 'Hello world'
Unable to find image 'ubuntu:18.04' locally
18.04: Pulling from library/ubuntu
284055322776: Pull complete
Digest: sha256:bfb4cabd667790ead5c95d9fe341937f0c21118fa79bc768d51c5da9d1dbe917
Status: Downloaded newer image for ubuntu:18.04
Hello world
啟動已終止容器(docker container start)
終止容器(docker container stop)
查看所有容器(docker ps -a)
進(jìn)入容器(docker exec)
在使用 -d 參數(shù)時荷腊,容器啟動后會進(jìn)入后臺艳悔。
某些時候需要進(jìn)入容器進(jìn)行操作,包括使用 docker attach
命令或 docker exec
命令女仰,推薦大家使用 docker exec 命令
舉例:
(base) [13:09:25] root@VM-4-4-centos:~
$ docker exec -it 4791c4f6cd63 bash
root@4791c4f6cd63:/# ls
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
root@4791c4f6cd63:/# pwd
/
刪除容器(docker container rm)
比如:需要刪除modest_feistel這個容器猜年,需要先stop
->再rm
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4791c4f6cd63 ubuntu "bash" 3 minutes ago Up 3 minutes modest_feistel
4eafd6d919e3 ubuntu "bash" 3 minutes ago Up 3 minutes sharp_wilbur
4dd3572398e8 codercom/code-server:latest "/usr/bin/entrypoint…" 11 hours ago Up 11 hours 0.0.0.0:8080->8080/tcp code-server
2f6ca3b22896 rocker/rstudio "/init" 11 hours ago Up 11 hours 0.0.0.0:8787->8787/tcp rstuido
$ docker container stop modest_feistel
modest_feistel
$ docker container rm modest_feistel
modest_feistel
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4eafd6d919e3 ubuntu "bash" 4 minutes ago Up 4 minutes sharp_wilbur
4dd3572398e8 codercom/code-server:latest "/usr/bin/entrypoint…" 11 hours ago Up 11 hours 0.0.0.0:8080->8080/tcp code-server
2f6ca3b22896 rocker/rstudio "/init" 11 hours ago Up 11 hours 0.0.0.0:8787->8787/tcp rstuido
3.3 倉庫
目前 Docker 官方維護(hù)了一個公共倉庫 Docker Hub,其中已經(jīng)包括了數(shù)量超過 2,650,000 的鏡像疾忍。大部分需求都可以通過在 Docker Hub 中直接下載鏡像來實現(xiàn)乔外。
注冊
你可以在 https://hub.docker.com 免費注冊一個 Docker
賬號。
登錄
可以通過執(zhí)行 docker login
命令交互式的輸入用戶名及密碼來完成在命令行界面登錄 Docker Hub
一罩。
你可以通過 docker logout
退出登錄杨幼。
搜索鏡像(docker search)
例如以 centos 為關(guān)鍵詞進(jìn)行搜索:
$ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 6449 [OK]
ansible/centos7-ansible Ansible on Centos7 132 [OK]
consol/centos-xfce-vnc Centos container with "headless" VNC session… 126 [OK]
jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos - … 117 [OK]
centos/systemd systemd enabled base container.
4. 其他
4.1 外部訪問容器
容器中可以運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部也可以訪問這些應(yīng)用聂渊,可以通過 -P
或 -p
參數(shù)來指定端口映射差购。
- 當(dāng)使用
-P
標(biāo)記時,Docker 會隨機(jī)
映射一個端口到內(nèi)部容器開放的網(wǎng)絡(luò)端口汉嗽。
使用 docker container ls 可以看到欲逃,本地主機(jī)的 32768 被映射到了容器的 80 端口。此時訪問本機(jī)的 32768 端口即可訪問容器內(nèi) NGINX 默認(rèn)頁面饼暑。
$ docker run -d -P nginx:alpine
$ docker container ls -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fae320d08268 nginx:alpine "/docker-entrypoint.…" 24 seconds ago Up 20 seconds 0.0.0.0:32768->80/tcp bold_mcnulty
- 當(dāng)使用
-p
則可以指定要映射的端口稳析,并且洗做,在一個指定端口上只可以綁定一個容器。支持的格式有
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
.
使用 hostPort:containerPort 格式本地的 80/443 端口映射到容器的 80/443 端口
$ docker run -d \
-p 80:80 \
-p 443:443 \
nginx:alpine
4.2 docker 目錄掛載
比如你使用docker安裝了rstudio彰居,你想將某個宿主目錄設(shè)定為docker-rstudio容器的home目錄诚纸,就需要考慮這個問題,可以用-v參數(shù)指定陈惰;
譬如我要啟動一個centos容器畦徘,宿主機(jī)的/test目錄掛載到容器的/soft目錄,可通過以下方式指定:
docker run -it -v /test:/soft centos /bin/bash
這樣在容器啟動后奴潘,容器內(nèi)會自動創(chuàng)建/soft的目錄旧烧。通過這種方式影钉,我們可以明確一點画髓,即-v參數(shù)中,冒號":"前面的目錄是宿主機(jī)目錄平委,后面的目錄是容器內(nèi)目錄奈虾。
歡迎評論交流~