博客上云历程(二):Docker入门介绍与使用
Docker概述
- Go語言開發(fā)
- 基于LXC(LinuX Containers),以及 AUFS 類的 Union FS 等技術(shù)
- 從文件系統(tǒng)、網(wǎng)絡(luò)互聯(lián)、進(jìn)程隔離等方面對進(jìn)程進(jìn)行封裝隔離
- 屬于操作系統(tǒng)層面的虛擬化技術(shù)
- 由于隔離的進(jìn)程獨立于宿主和其它的隔離的進(jìn)程,因此也稱其為容器
- 單一容器或單一服務(wù)器的一組容器都不再是關(guān)注的重點,如何通過云原生應(yīng)用(Cloud Native Application)和微服務(wù)框架(Microservice Framework),把商業(yè)邏輯映射為容器集群,為商業(yè)成功奠定技術(shù)基礎(chǔ)才是核心。
特點
官方總結(jié)了Docker的6個特點,也可以說是優(yōu)勢,包括:
- Flexible 靈活
- Lightweight 輕量
- Portable 可移植
- Loosely coupled 松耦合
- Scalable 可擴(kuò)展
- Secure 安全
理解
James Turnbull在書[1]中將Docker容器總結(jié)為:
如果將容器看做碼頭上的標(biāo)準(zhǔn)的集裝箱,鏡像格式就是集裝箱的打包標(biāo)準(zhǔn);由于鏡像是由若干指令一步一步構(gòu)建而成的,因此也可以看做一系列標(biāo)準(zhǔn)操作的集合;集裝箱的目的是為了儲存轉(zhuǎn)運貨物,而容器的目的是運行軟件,我們使用集裝箱的目的是提供一個能夠保障貨物儲存的集裝箱條件,在Docker容器中,我們?yōu)檐浖a(chǎn)品提供了配套的執(zhí)行環(huán)境。
[1] THE DOCKER BOOK, James Turnbull, https://dockerbook.com.
Docker與VM不同
最主要:避免虛擬機(jī)中的guestOS
傳統(tǒng)虛擬機(jī)技術(shù)是虛擬出一套硬件后,在其上運行一個完整操作系統(tǒng),在該系統(tǒng)上再運行所需應(yīng)用進(jìn)程;而容器內(nèi)的應(yīng)用進(jìn)程直接運行于宿主的內(nèi)核,容器內(nèi)沒有自己的內(nèi)核,而且也沒有進(jìn)行硬件虛擬。因此容器要比傳統(tǒng)虛擬機(jī)更為輕便。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-cSyhd3E2-1584890133519)(./pic/VM.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-pZbkfVeI-1584890133520)(./pic/Docker.png)]
Docker常見名詞
鏡像Image
docker 鏡像是一個特殊的文件系統(tǒng),除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。鏡像不包含任何動態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會被改變。
容器Container
鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計中的類和實例 一樣,鏡像是靜態(tài)的定義,容器是鏡像運行時的實體。容器可以被創(chuàng)建、啟動、停止、刪除、暫停等。
容器的實質(zhì)是進(jìn)程,但與直接在宿主執(zhí)行的進(jìn)程不同,容器進(jìn)程運行于屬于自己的獨立的 命名空間。因此容器可以擁有自己的 root 文件系統(tǒng)、自己的網(wǎng)絡(luò)配置、自己的進(jìn)程空間,甚至自己的用戶 ID 空間。容器內(nèi)的進(jìn)程是運行在一個隔離的環(huán)境里,使用起來,就好像是在一個獨立于宿主的系統(tǒng)下操作一樣。這種特性使得容器封裝的應(yīng)用比直接在宿主運行更加安全。
倉庫Registry
鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主機(jī)上運行,但是,如果需要在其它服務(wù)器上使用這個鏡像,我們就需要一個集中的存儲、分發(fā)鏡像的服務(wù),Docker Registry 就是這樣的服務(wù)。
一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標(biāo)簽(Tag);每個標(biāo)簽對應(yīng)一個鏡像。通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標(biāo)簽就常用于對應(yīng)該軟件的各個版本。我們可以通過 <倉庫名>:<標(biāo)簽> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標(biāo)簽,將以 latest 作為默認(rèn)標(biāo)簽。
Docker安裝
在Linux系統(tǒng)上可以直接安裝Docker,但是在OS X系統(tǒng)和Windows系統(tǒng)中應(yīng)該使用Docker Toolbox工具安裝Docker。
不是基于Linux內(nèi)核的系統(tǒng)如何運行Docker?
Docker Toolbox集合安裝了運行Docker所需的所有組件,包括VirtualBox和一個極小的虛擬機(jī),并提供了一個包裝腳本(wrapper script)對虛擬機(jī)進(jìn)行管理。 虛擬機(jī)在OS X和Windows系統(tǒng)中提供一個本地的守護(hù)進(jìn)程(Docker daemon running);同時,Docker客戶端作為OS X和Windows系統(tǒng)的原生程序被安裝,并連接到虛擬機(jī)中的守護(hù)進(jìn)程中。官方文檔https://docs.docker.com/install/linux/docker-ce/ubuntu/
安裝條件
- 64位CPU構(gòu)架的計算機(jī)
- 運行Linux 3.8以上內(nèi)核
- 內(nèi)核須開啟cgroup和namespace功能
- 適合的存儲驅(qū)動(storage driver)
docker在ubuntu上支持overlay2,aufs和btrfs三種storage drivers,其中,btrfs僅支持企業(yè)版Docker的SLES;overlay2是默認(rèn)的也是官方推薦的一種。
版本介紹
docker有兩個版本:
- docker-ce(社區(qū)版)
- docker-ee(企業(yè)版)
這里介紹安裝社區(qū)版,也就是docker-ce。
安裝
為了加速Docker下載鏡像的速度,可以更換阿里源.
阿里云-容器鏡像服務(wù)-鏡像中心-鏡像加速器中獲取加速器地址.
添加以下配置:
{"registry-mirrors": ["https://wb87kbxd.mirror.aliyuncs.com"] }重啟服務(wù)使換源生效
$ systemctl daemon-reload && systemctl restart docker卸載
$ sudo apt-get purge docker-ce $ sudo rm -rf /var/lib/docker建立交互式容器
這里建立了一個基于Ubuntu的容器,并啟動了一個bash.
$ sudo docker run -i -t ubuntu /bin/bash Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu 5c939e3a4d10: Pull complete c63719cdbe7a: Pull complete 19a861ea6baf: Pull complete 651c9d2d6c4f: Pull complete Digest: sha256:8d31dad0c58f552e890d68bbfb735588b6b820a46e459672d96e585871acc110 Status: Downloaded newer image for ubuntu:latest啟動后可以看到終端已經(jīng)進(jìn)入了容器,前面變成了"root@6abd43f72939:/# "
查看容器主機(jī)名
root@6abd43f72939:/# hostname 6abd43f72939查看host文件
root@6abd43f72939:/# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 6abd43f72939使用net-tools查看網(wǎng)絡(luò)配置
root@6abd43f72939:/# apt-get update root@6abd43f72939:/# apt-get install net-tools root@6abd43f72939:/# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)RX packets 11535 bytes 18505969 (18.5 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 11140 bytes 1042829 (1.0 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1000 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0查看容器進(jìn)程
root@6abd43f72939:/# ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 18508 3504 pts/0 Ss 08:51 0:00 /bin/bash root 260 0.0 0.0 34400 2864 pts/0 R+ 11:39 0:00 ps -aux原生的ubuntu源下載更新的速度較慢,這里可以更換阿里源
# 備份 root@6abd43f72939:/# cp /etc/apt/sources.list /etc/apt/sources.list.bak# 打開源文件,注釋掉原有源,添加阿里源 root@6abd43f72939:/# vim /etc/apt/sources.list# 更新 root@6abd43f72939:/# apt-get updateP.S. 阿里源如下:
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse安裝vim程序順便驗證一下?lián)Q源后的有效性
root@6abd43f72939:/# apt-get install vim退出容器
root@6abd43f72939:/# exit exit退出后可以通過docker ps -a查看當(dāng)前系統(tǒng)中所有的容器,docker ps可以查看當(dāng)前正在運行的容器
$ sudo docker ps -a [sudo] password for wangfeaibn: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6abd43f72939 ubuntu "/bin/bash" 3 hours ago Exited (0) 2 minutes ago hopeful_varahamihira如果創(chuàng)建時未指定,會初始化一個隨機(jī)的容器name,上面通過docker ps可以看到容器名稱為"hopeful_varahamihira".容器名和ID都可以唯一確定容器,但是使用容器名相對更加直觀,我們一方面可以通過創(chuàng)建是指定name,一方面在創(chuàng)建后也可以通過docker rename進(jìn)行更改,命名支持大小寫字母,數(shù)字和_.-,正則表達(dá)式為[a-zA-Z0-9_.-]
# 指定容器名創(chuàng)建 $ sudo docker run --name hello_world -i -t ubuntu /bin/bash# 重命名, rename的第一個參數(shù)可以是id,還可以是name $ sudo docker rename [new_containerName]/[new_containerID] hello_world容器重啟.注意重啟后不會像創(chuàng)建時自動進(jìn)入創(chuàng)建時的會話,但是可以通過attach可以重新回到容器的會話中.
# 重啟容器 $ sudo docker start hello_world hello_world# 容器會話附著 $ sudo docker attach hello_world root@6abd43f72939:/#創(chuàng)建守護(hù)式容器
常用的提供各種服務(wù)的容器一般為守護(hù)式容器,守護(hù)式容器daemonized container可以長期運行,沒有交互式會話.
# 創(chuàng)建守護(hù)式容器 $ sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"# 跟蹤式日志 $ sudo docker logs -ft daemon_daveDocker常用命令
# 查看docker運行狀態(tài) $ sudo service docker status # 開啟/關(guān)閉/重啟Docker $ sudo service docker start/stop/restart # 查看docker信息 $ sudo docker info# 查看所有的本地image $ sudo docker image ls # 刪除 image $ docker image rm [imageName]# 查看所有容器 $ sudo docker ps -a 或者 $ sudo docker ls --all# 新建容器 $ sudo docker run --name [containerName] -i -t ubuntu /bin/bash # 創(chuàng)建但不運行容器 $ sudo docker create [containerName] # 停止守護(hù)式容器 $ sudo docker stop [containerName]/[containerID] # 刪除容器 $ sudo docker rm [containerName]/[containerID] # 刪除所有容器,引號內(nèi)返回所有容器的名稱 $ sudo docker stop $(docker ps -a -q) # 刪除所有容器 $ docker rm $(docker ps -a -q) # 刪除所有數(shù)據(jù)卷 $ docker volume rm $(docker volume ls -q) # 重啟(正在運行)/啟動(未運行)現(xiàn)有容器 $ sudo docker restart\start [containerName]/[containerID]# 創(chuàng)建bash進(jìn)入容器 $ docker exec -it [containerName] bash # 查看容器進(jìn)程 $ sudo docker top [containerName]/[containerID] # docker容器統(tǒng)計,同時查詢支持多個容器 $ sudo docker stats [containerName1] [containerName2].. # 獲取容器詳細(xì)信息 $ sudo docker inspect --format='{{ .State.Status }}' [containerName] # 獲取容器某項信息 $ sudo docker inspect --format='{{ .State.Status }}' [containerName]更多文章見我的博客:LittlePeanut
總結(jié)
以上是生活随笔為你收集整理的博客上云历程(二):Docker入门介绍与使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第十六届“振兴杯”计算机网络管理员赛项理
- 下一篇: 能上QQ不能上网的解决方法