Docker現(xiàn)在是一門非常流行的技術(shù),其實(shí)之前就一直想學(xué)卡乾,不過一是沒什么時(shí)間翼悴;二是沒有結(jié)合實(shí)踐,官方文檔又介紹的不是很清楚幔妨,導(dǎo)致其中很多命令都看不懂抄瓦,于是就沒有繼續(xù)下去了。
而這次我接了一個(gè)外包項(xiàng)目陶冷,實(shí)踐Docker的時(shí)候終于到了8奇ⅰ!埂伦!讓我們開始吧煞额。
一、Docker的介紹
Docker是一種虛擬化技術(shù)沾谜,用于解決開發(fā)環(huán)境的配置難題膊毁。可以把Docker就理解成一種虛擬機(jī)基跑,不過比VirtualBox和VMware等的虛擬機(jī)要輕量很多婚温,它沒有圖像化界面,并且與系統(tǒng)深度融合媳否,運(yùn)行效率非常高栅螟,可以說在使用它的時(shí)候幾乎察覺不出是虛擬機(jī),和真機(jī)體驗(yàn)很相似篱竭。
為什么要用Docker力图?很多服務(wù)端軟件的運(yùn)行環(huán)境配置起來非常麻煩,而最好的辦法就是把配置好的環(huán)境存起來掺逼,保存成一個(gè)類似操作系統(tǒng)鏡像的東西吃媒,同時(shí)在需要運(yùn)行這些軟件的地方運(yùn)行這個(gè)虛擬機(jī)鏡像,再在這個(gè)虛擬機(jī)里運(yùn)行這些服務(wù)端軟件,從而就避免了配置運(yùn)行環(huán)境的麻煩赘那。其次刑桑,它還封裝好了裝好tomcat、mysql等常用開發(fā)環(huán)境的鏡像募舟,使用起來方便很多祠斧。
Docker有兩個(gè)核心概念,Image和Container胃珍。Image就是類似操作系統(tǒng)鏡像一樣的東西梁肿,是靜態(tài)的蜓陌,可以對Image進(jìn)行啟動(dòng)和刪除觅彰。而Container則是正在運(yùn)行的Image,是動(dòng)態(tài)的钮热,可以對Container進(jìn)行停止填抬、繼續(xù)和刪除。同樣可以把Image和Container理解成面向?qū)ο笾械念惡蛯ο蟆?/p>
二隧期、Docker的安裝
Windows和Mac的Docker安裝起來都比較簡單飒责,有圖形化界面,用起來很簡單仆潮,這里就直接跳過宏蛉,不過安裝后記得配置國內(nèi)鏡像源,不然下載鏡像的速度會非常慢性置。
至于鏡像源地址的話拾并,登錄阿里云,搜索容器鏡像服務(wù)鹏浅,進(jìn)入鏡像加速器嗅义,就可以看到給每個(gè)用戶分配的鏡像加速器
Linux的Docker安裝起來則比較麻煩,這里只介紹服務(wù)端常用Linux發(fā)行版CentOS如何安裝Docker隐砸。
常規(guī)安裝流程
- 設(shè)置 repository
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
- 安裝Docker Community
$ sudo yum install docker-ce docker-ce-cli containerd.io
- 開啟服務(wù)并試運(yùn)行
$ sudo systemctl start docker
$ sudo docker run hello-world
可能遇到的坑
本來按照上面的步驟是照著官網(wǎng)教程來的之碗,應(yīng)該是沒什么問題的,但我在運(yùn)行下面這句的時(shí)候卻報(bào)錯(cuò)了
$ sudo systemctl start docker
Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" and "journalctl -xe" for details.
但我按照提示輸入systemctl status docker.service
和journalctl -xe
只看到提示異常退出季希,但沒有說具體是什么問題褪那,把輸出內(nèi)容在百度和谷歌上都也都沒什么用,好幾天都沒解決這個(gè)問題式塌。
后來不知道哪天看到有條命令武通,journalctl --since "2019-12-12 13:12:00"
可以看系統(tǒng)某個(gè)時(shí)刻之后的所有日志,我這才找到了錯(cuò)誤原因I翰蟆冶忱!
Apr 4 22:09:06 localhost_02 dockerd: time="2019-04-04T22:09:06.128742412+08:00" level=info msg="Creating filesystem xfs on device docker-8:3-67789151-base, mkfs args: [-m crc=0,finobt=0 /dev/mapper/docker-8:3-67789151-base]" storage-driver=devicemapper
Apr 4 22:09:06 localhost_02 dockerd: time="2019-04-04T22:09:06.131080987+08:00" level=info msg="Error while creating filesystem xfs on device docker-8:3-67789151-base: exit status 1" storage-driver=devicemapper
Apr 4 22:09:06 localhost_02 dockerd: time="2019-04-04T22:09:06.131103910+08:00" level=error msg="[graphdriver] prior storage driver devicemapper failed: exit status 1"
核心錯(cuò)誤就是這個(gè)Error while creating filesystem xfs on device docker-8:3-67789151-base: exit status 1
然后在谷歌上一搜,果然找到了解決方案,具體看這個(gè)鏈接https://my.oschina.net/yuanhaohao/blog/3032396就可以解決囚枪,真是太激動(dòng)了派诬!
最后重新運(yùn)行docker服務(wù):
$ sudo systemctl daemon-reload
$ sudo systemctl start docker.service
三、Docker的常用命令
在命令行輸入docker --help
就可以查看所有docker命令
Management Commands:
builder Manage builds
config Manage Docker configs
container Manage containers
image Manage images
network Manage networks
node Manage Swarm nodes
...
Commands:
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
...
是不是有點(diǎn)眼花撩亂链沼?沒事默赂,我們慢慢來。
首先常用的命令有兩大類括勺,分別是針對Image和針對Container的缆八。
Docker Image命令
$ docker image build xxx
這個(gè)用于根據(jù)xxx目錄下的Dockerfile生成鏡像,下面一節(jié)會講解Dockerfile是什么疾捍,現(xiàn)在只需要認(rèn)為是一個(gè)自動(dòng)執(zhí)行腳本奈辰,可以根據(jù)需求自動(dòng)生成Docker鏡像文件
$ docker image ls
這條命令則用來查看所有鏡像的信息
參數(shù)名稱 | 解釋 |
---|---|
倉庫位置 | 就像我前面幾個(gè)鏡像,是把我的鏡像存儲在阿里云上乱豆,后面沒有域名地址的則是來則Docker Hub官方倉庫 |
標(biāo)簽 | 就像軟件有不同的版本一樣奖恰,鏡像也有不同的版本,區(qū)分他們的就是鏡像標(biāo)簽 |
鏡像ID | 每個(gè)鏡像獨(dú)有的ID |
創(chuàng)建時(shí)間 | |
鏡像大小 |
最后是一些比較簡單的命令:
$ docker image rm 鏡像ID或鏡像名
刪除鏡像
$ docker image tag 源鏡像名 目標(biāo)鏡像名
重新已經(jīng)存在的鏡像指定一個(gè)重名
$ docker image push 鏡像ID或鏡像名
將鏡像上傳到云端(如果沒指定域名就默認(rèn)是官方的Docker Hub)
$ docker image pull 鏡像名
從云端下載鏡像
PS:上面說的鏡像名都是指“倉庫位置:標(biāo)簽”
Docker Container命令
$ docker container run xxxx
這個(gè)命令比較復(fù)雜宛裕,直接用一個(gè)例子來介紹:- 紅色:docker run是docker container run的同義詞瑟啃,后面部分會介紹
- 橙色:每個(gè)容器基本都會指定一個(gè)需要運(yùn)行的命令,用來開啟某個(gè)服務(wù)揩尸,而容器和這條命令是同生共死的蛹屿,而這個(gè)參數(shù)就是表示讓這條命令可以后臺運(yùn)行,也就是讓容器能夠后臺運(yùn)行岩榆。
- 綠色:由于Docker類似于虛擬機(jī)错负,容器與外部之間是默認(rèn)不共享端口的,需要開放什么端口需要指定朗恳,格式是"外部端口:容器內(nèi)端口"
- 藍(lán)色:設(shè)置容器內(nèi)的環(huán)境變量湿颅,我這里是設(shè)置MySql數(shù)據(jù)庫的root密碼以及默認(rèn)創(chuàng)建的數(shù)據(jù)庫名稱
- 紫色:運(yùn)行的鏡像名,沒有指定標(biāo)簽的話默認(rèn)就是latest
還有很多其他參數(shù)粥诫,可以輸入docker container run --help
查看幫助
$ docker container ls
它的用途是查看所有容器的信息
參數(shù)名稱 | 解釋 |
---|---|
容器ID | 與鏡像ID差不多油航,每個(gè)容器都獨(dú)一無二 |
來源的鏡像名 | |
運(yùn)行的指令 | 這個(gè)在后面的Dockerfile里會介紹 |
創(chuàng)建時(shí)間 | |
容器狀態(tài) | 開啟還是暫停還是運(yùn)行結(jié)束 |
開放的端口 | 容器開放給外部的端口 |
容器名 | 不設(shè)置容器名稱的話系統(tǒng)會隨機(jī)給你一個(gè) |
上面參數(shù)中的-a
表示顯示所有容器,包括停止運(yùn)行的容器怀浆,而不加這個(gè)只會顯示正在運(yùn)行的和暫停的容器
$ docker container exec [OPTIONS] 容器ID或容器名 命令
這條命令則是用于在已經(jīng)運(yùn)行的容器中運(yùn)行某條命令
[OPTIONS]有很多谊囚,這里只介紹兩個(gè)最常用的:
-d:表示在后臺運(yùn)行命令,與上面的類似
-it:表示會開啟一個(gè)交互式終端执赡,我一般用下面的命令來進(jìn)入容器內(nèi)部的終端:
docker container exec -it 容器ID bash
最后是一些比較簡單的命令:
$ docker container commit 容器ID或容器名 鏡像名
將運(yùn)行中的容器保存成鏡像
$ docker container rm 容器ID或容器名
刪除已經(jīng)停止的容器(注意此命令不能刪除正在運(yùn)行的容器)
$ docker container kill 容器ID或容器名
強(qiáng)行停止正在運(yùn)行的容器
$ docker container start/pause/restart 容器ID或容器名
這些一看就知道是什么意思就不解釋了
真正常用的命令
真正常用的命令镰踏?難道意思是前面的都不常用?沙合?
對的奠伪,前面這些命令都太長了,我們一般都用它們的簡寫,替換規(guī)則如下:
docker run = docker container run
docker ps = docker container ls
docker commit = docker container commit
docker images = docker image ls
docker pull = docker image pull
docker push = docker image push
docker build = docker image build
docker rm = docker container rm
docker rmi = docker image rm
...