Docker 入門介紹

Docker 是什么?

一、什么是Docker?

1. Docker 的定義

Docker 是一個開源的應(yīng)用容器引擎,可以輕松為應(yīng)用創(chuàng)建一個輕量級、可移植、與外界隔離的容器。

Docker 本身并不是一個容器系統(tǒng),而是一個基于原有的容器化工具 LXC(Linux Container) 用來創(chuàng)建虛擬環(huán)境的工具。類似 LXC 的工具已經(jīng)在生產(chǎn)環(huán)境中使用多年,Docker 則基于此提供了更加友好的鏡像管理工具和部署工具。

簡單的來說:Docker 是容器管理工具。

docker logo.jpg

2. Docker 和虛擬機(jī)的區(qū)別

docker和vm的區(qū)別.jpg

VM 和 Docker 的框架,直觀上來講 VM 多了一層 Guest OS ,同時Hypervisor會對硬件資源進(jìn)行虛擬化,Docker 是直接使用硬件資源,所以 VM 的資源利用率相對 Docker 低也是比較容易理解的。

Docker 具有更多的服務(wù)能力,是利用宿主機(jī)的系統(tǒng)內(nèi)核,所以可以做到在幾秒中之內(nèi)創(chuàng)建大量的容器。VM 啟動一個虛擬機(jī)少則幾十秒,多則幾分鐘。

Docker 的能力:
  • 極其輕量:只打包必要的bins/libs。
  • 秒級部署:根據(jù)鏡像的不同,容器的部署大概在毫秒和秒之間。
  • 易于移植:一次構(gòu)建,多次部署。
  • 彈性伸縮:Kubernetes、Swam、Mesos這類開源、方便、好使的容器管理平臺有著非常強(qiáng)大的彈性管理能力。

3. Docker 組成部分

docker組成部分.jpg
  • Docker Client 客戶端
  • Docker Daemon 守護(hù)進(jìn)程
  • Docker Image 鏡像
  • Docker Container 容器
  • Docker Registry 倉庫

4. Docker核心概念

Docker Image 鏡像

鏡像就是一個自讀模板

例如:一個鏡像可以包含一個完整的ubuntu操作系統(tǒng)環(huán)境,里面僅安裝了tomcat或者用戶需要的其他應(yīng)用程序。

鏡像可以用來創(chuàng)建Docker容器。

docker image組成.png
Docker Container 容器

Docker 利用容器來運(yùn)行應(yīng)用。

容器是從鏡像創(chuàng)建的運(yùn)行實(shí)例。它可以被啟動、開始、停止、刪除。

每個容器都是相互隔離的,保證安全的平臺。

可以把容器看做是一個簡易版的Linux環(huán)境(包括root用戶權(quán)限、進(jìn)程控件、用戶空間和網(wǎng)絡(luò)空間等等,和運(yùn)行在其中的應(yīng)用程序)。

注:鏡像是只讀的,容器在啟動的時候創(chuàng)建一層可寫層作為最上層。(寫時復(fù)制,所有操作都是在可寫層進(jìn)行操作)

docker container組成.png
Docker Registry 倉庫

倉庫就是集中存放鏡像文件的場所。

二、Docker 的安裝和常規(guī)操作

1. Docker 的安裝

Mac OS 參考菜鳥教程就有了MacOS Docker 安裝

2. Hello World案例

打開終端,然后輸入命令查看Docker是否正常運(yùn)行。

> docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:fc6a51919cfeb2e6763f62b6d9e8815acbf7cd2e476ea353743570610737b752
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

docker run 命令,運(yùn)行指定的鏡像,如果鏡像不在主機(jī)系統(tǒng)上,它會嘗試從默認(rèn)的Docker倉庫中下載鏡像。

3. Docker 鏡像常用操作

查看本地鏡像列表

# 命令
docker images

查找遠(yuǎn)端倉庫鏡像

# 命令
docker search <image_name>
# 例子
docker search hello-world

獲取鏡像

# 命令
docker pull <域名>/<namespace>/<repo>:<tag>
# 例子
docker pull hello-world

查看鏡像信息

# 命令
docker inspect <image_id>
# 例子
docker inspect 7465ad228696

刪除鏡像

# 命令
docker rmi <image>:<tag>
# 例子
docker rmi hello-world

創(chuàng)建鏡像

# 命令
docker commit <options> <container_id> <repository:tag>
# 例子
docker commit -a "potato" -m "test commit" 96cc3a4d3b68 hello-potato

參數(shù)說明:

-a,--author:作者信息 -m;--meassage:提交消息;-p,--pause=true:提交時暫停容器運(yùn)行。

說明:

基于已有的鏡像的容器進(jìn)行創(chuàng)建。

遷出鏡像

# 命令
docker save -o <image>.tar <image>:<tag>

載入鏡像

# 命令
docker load --input <image>.tar 或者 docker load <image>.tar

上傳鏡像

# 命令
docker push <域名>/<namespace>/<repo>:<tag>

4. Docker 容器常用操作

創(chuàng)建容器

Docker 的容器十分的輕量級,用戶可以隨時創(chuàng)建或者刪除容器。

# 命令
docker create <image_name>
# 例子
docker create ubuntu

說明:

使用 docker create 命令創(chuàng)建的容器處于停止?fàn)顟B(tài),可以使用 docker start 命令啟動它。

創(chuàng)建并啟動容器

# 命令
docker run <image_name>
# 例子
docker run ubuntu

說明:

等價于先執(zhí)行 docker create 命令,再執(zhí)行 docker start 命令。

docker run背后的故事:
  1. 檢查本地是否存在鏡像,不存在就從 Docker Hub 倉庫下載。
  2. 利用本地鏡像創(chuàng)建一個容器。
  3. 分配一個文件系統(tǒng),并在只讀的鏡像層外面掛載一個可讀寫層。
  4. 從宿主機(jī)配置的網(wǎng)橋接口橋接一個虛擬接口到容器中去。
  5. 從地址池配置一個ip地址給容器。
  6. 執(zhí)行用戶的制定用戶程序。
  7. 執(zhí)行完畢后容器被終止。

例如:

創(chuàng)建ubuntu容器后,打印'hello'。

docker run ubuntu /bin/echo 'hello'
操作運(yùn)行的容器
docker run -it ubuntu /bin/bash

-t:讓 docker 分配一個偽終端并綁定到容器的標(biāo)準(zhǔn)輸入。

-i:讓容器的標(biāo)準(zhǔn)輸入保持打開。

在交互模式下,用戶可以通過所創(chuàng)建的終端來輸入命令,exit命令退出容器。

退出后,容器自動處于終止?fàn)顟B(tài)。

守護(hù)態(tài)運(yùn)行容器:

更多的時候,需要讓 Docker 在后臺運(yùn)行而不是直接把執(zhí)行命令的結(jié)果輸出在當(dāng)前宿主機(jī)下。此時,可以通過添加 -d 參數(shù)來實(shí)現(xiàn)。

舉個例子:

如果不使用 -d 參數(shù)運(yùn)行容器。

docker run ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world

容器會把輸出的結(jié)果打印到宿主機(jī)上面。

如果使用 -d 參數(shù)運(yùn)行容器。

docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

此時容器會在后臺運(yùn)行并不會把輸出的結(jié)果打印到宿主機(jī)上面。(輸出結(jié)果可以用 docker logs <container_id or name> 查看)

終止容器

可以使用dockerstop命令來終止一個運(yùn)行中的容器。

# 命令
docker stop <container_id>

注意:

  • 當(dāng)容器中的應(yīng)用終結(jié)時,容器也會自動停止。
  • 查看所有的容器:docker ps -a
  • 查看運(yùn)行的容器:docker ps
  • 重新啟動容器:docker start <container_id>

進(jìn)入容器

在使用-d參數(shù)時,容器啟動后會進(jìn)入后臺,用戶無法看到容器中的信息。

# 命令
docker exec <options> <container_id> <command>
# 例子
docker exec -it 96cc3a4d3b68 bash

Exec可以直接在容器內(nèi)部運(yùn)行命令。

刪除容器

可以使用 docker rm 命令刪除終止?fàn)顟B(tài)的容器。

如果刪除正在運(yùn)行的容器,可以使用 docker rm –f 命令。

# 命令
docker rm <container_id>
docker rm -f <container_id>
# 例子
docker rm 96cc3a4d3b68
docker rm -f 96cc3a4d3b68

導(dǎo)入和導(dǎo)出容器

導(dǎo)出容器是指導(dǎo)出一個已經(jīng)創(chuàng)建的容器到一個文件,不管容器是否處于運(yùn)行狀態(tài)??梢允褂?docker export 命令。

# 命令
docker export <container_id> > <name.tar>
# 例子
docker export 96cc3a4d3b68 > hello.tar

導(dǎo)出的文件又可以使用 docker import 命令導(dǎo)入,成為鏡像。

cat hello.tar | docker import - hello:laster

三、介紹總結(jié)

1. Docker 是容器管理工具。

2. Docker 的組成部分。

  • Docker Client 客戶端
  • Docker Daemon 守護(hù)進(jìn)程
  • Docker Image 鏡像
  • Docker Container 容器
  • Docker Registry 倉庫

3. Docker 的鏡像操作。

功能 命令 例子
查看本地鏡像列表 docker images docker images
查找遠(yuǎn)端倉庫鏡像 docker search <image_name> docker search hello-world
獲取鏡像 docker pull <域名>/<namespace>/<repo>:<tag> docker pull hello-world
查看鏡像信息 docker inspect <image_id> docker inspect 7465ad228696
刪除鏡像 docker rmi <image>:<tag> docker rmi hello-world

4. Docker 的容器操作。

功能 命令 例子
創(chuàng)建容器 docker create docker create ubuntu
創(chuàng)建并啟動容器 docker run <image_name> docker run ubuntu
終止容器 docker stop <container_id> docker stop 7465ad228696
進(jìn)入容器 docker exec <options> <container_id> <command> docker exec -it 7465ad228696 bash
刪除容器 docker rm <container_id> docker rm 7465ad228696
導(dǎo)出容器 docker export <container_id> <name.tar> docker export 96cc3a4d3b68 > hello.tar
導(dǎo)入容器 docker import -
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容