Docker是什么?
Docker是一個(gè)虛擬環(huán)境容器倡鲸,可以將你的開發(fā)環(huán)境供嚎、代碼、配置文件等一并打包到這個(gè)容器中峭状,并發(fā)布和應(yīng)用到任意平臺中克滴。比如,你在本地用Python開發(fā)網(wǎng)站后臺优床,開發(fā)測試完成后劝赔,就可以將Python3及其依賴包、Flask及其各種插件胆敞、Mysql着帽、Nginx等打包到一個(gè)容器中,然后部署到任意你想部署到的環(huán)境移层。
Docker官方文檔比較全仍翰,建議有能力的讀一下官方文檔。
Docker的三個(gè)概念
鏡像(Image):類似于虛擬機(jī)中的鏡像观话,是一個(gè)包含有文件系統(tǒng)的面向Docker引擎的只讀模板予借。任何應(yīng)用程序運(yùn)行都需要環(huán)境,而鏡像就是用來提供這種運(yùn)行環(huán)境的匪燕。例如一個(gè)Ubuntu鏡像就是一個(gè)包含Ubuntu操作系統(tǒng)環(huán)境的模板蕾羊,同理在該鏡像上裝上Apache軟件,就可以稱為Apache鏡像帽驯。
容器(Container):類似于一個(gè)輕量級的沙盒龟再,可以將其看作一個(gè)極簡的Linux系統(tǒng)環(huán)境(包括root權(quán)限、進(jìn)程空間尼变、用戶空間和網(wǎng)絡(luò)空間等)利凑,以及運(yùn)行在其中的應(yīng)用程序。Docker引擎利用容器來運(yùn)行嫌术、隔離各個(gè)應(yīng)用哀澈。容器是鏡像創(chuàng)建的應(yīng)用實(shí)例,可以創(chuàng)建度气、啟動(dòng)割按、停止、刪除容器磷籍,各個(gè)容器之間是是相互隔離的适荣,互不影響现柠。注意:鏡像本身是只讀的,容器從鏡像啟動(dòng)時(shí)弛矛,Docker在鏡像的上層創(chuàng)建一個(gè)可寫層够吩,鏡像本身不變。
倉庫(Repository):類似于代碼倉庫丈氓,這里是鏡像倉庫周循,是Docker用來集中存放鏡像文件的地方。注意與注冊服務(wù)器(Registry)的區(qū)別:注冊服務(wù)器是存放倉庫的地方万俗,一般會(huì)有多個(gè)倉庫湾笛;而倉庫是存放鏡像的地方,一般每個(gè)倉庫存放一類鏡像该编,每個(gè)鏡像利用tag進(jìn)行區(qū)分迄本,比如Ubuntu倉庫存放有多個(gè)版本(12.04、14.04等)的Ubuntu鏡像课竣。
Docker的安裝和卸載
Docker可以安裝在Windows嘉赎、Linux、Mac等各個(gè)平臺上于樟。具體可以查看文檔Install Docker公条。安裝完成之后,可以查看Docker的版本信息:
[root@xxx ~]# docker version
Client:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built:
OS/Arch: linux/amd64
Server:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built:
OS/Arch: linux/amd64
查看Docker的幫助信息:# docker --help迂曲。各種命令的用法也不再贅述靶橱,后邊用到哪些命令時(shí)會(huì)作出一定的解釋。
Docker中關(guān)于鏡像的基本操作
安裝完Docker引擎之后路捧,就可以對鏡像進(jìn)行基本的操作了关霸。
我們從官方注冊服務(wù)器(https://hub.docker.com)的倉庫中pull下CentOS的鏡像,前邊說過杰扫,每個(gè)倉庫會(huì)有多個(gè)鏡像队寇,用tag標(biāo)示,如果不加tag章姓,默認(rèn)使用latest鏡像:
[root@xxx ~]# docker search centos # 查看centos鏡像是否存在
[root@xxx ~]# docker pull centos # 利用pull命令獲取鏡像
Using default tag: latest
latest: Pulling from library/centos
08d48e6f1cff: Pull complete
Digest: sha256:b2f9d1c0ff5f87a4743104d099a3d561002ac500db1b9bfa02a783a46e0d366c
Status: Downloaded newer image for centos:latest
[root@xxx ~]# docker images # 查看當(dāng)前系統(tǒng)中的images信息
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0584b3d2cf6d 9 days ago 196.5 MB
以上是下載一個(gè)已有鏡像佳遣,此外有兩種方法可以幫助你新建自有鏡像。
(1)利用鏡像啟動(dòng)一個(gè)容器后進(jìn)行修改 ==> 利用commit提交更新后的副本
[root@xxx ~]# docker run -it centos:latest /bin/bash # 啟動(dòng)一個(gè)容器
[root@72f1a8a0e394 /]# # 這里命令行形式變了凡伊,表示已經(jīng)進(jìn)入了一個(gè)新環(huán)境
[root@72f1a8a0e394 /]# git --version # 此時(shí)的容器中沒有g(shù)it
bash: git: command not found
[root@72f1a8a0e394 /]# yum install git # 利用yum安裝git
......
[root@72f1a8a0e394 /]# git --version # 此時(shí)的容器中已經(jīng)裝有g(shù)it了
git version 1.8.3.1
此時(shí)利用exit退出該容器零渐,然后查看docker中運(yùn)行的程序(容器):
[root@xxx ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72f1a8a0e394 centos:latest "/bin/bash" 9 minutes ago Exited (0) 3 minutes ago angry_hodgkin
這里將容器轉(zhuǎn)化為一個(gè)鏡像,即執(zhí)行commit操作系忙,完成后可使用docker images查看:
[root@xxx ~]# docker commit -m "centos with git" -a "qixianhu" 72f1a8a0e394 xianhu/centos:git
[root@xxx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xianhu/centos git 52166e4475ed 5 seconds ago 358.1 MB
centos latest 0584b3d2cf6d 9 days ago 196.5 MB
其中诵盼,-m指定說明信息;-a指定用戶信息;72f1a8a0e394代表容器的id拦耐;xianhu/centos:git指定目標(biāo)鏡像的用戶名耕腾、倉庫名和 tag 信息。注意這里的用戶名xianhu杀糯,后邊會(huì)用到。
此時(shí)Docker引擎中就有了我們新建的鏡像xianhu/centos:git苍苞,此鏡像和原有的CentOS鏡像區(qū)別在于多了個(gè)Git工具固翰。此時(shí)我們利用新鏡像創(chuàng)建的容器,本身就自帶git了羹呵。
[root@xxx ~]# docker run -it xianhu/centos:git /bin/bash
[root@520afc596c51 /]# git --version
git version 1.8.3.1
利用exit退出容器骂际。注意此時(shí)Docker引擎中就有了兩個(gè)容器,可使用docker ps -a查看冈欢。
(2)利用Dockerfile創(chuàng)建鏡像
Dockerfile可以理解為一種配置文件歉铝,用來告訴docker build命令應(yīng)該執(zhí)行哪些操作。一個(gè)簡易的Dockerfile文件如下所示凑耻,官方說明:Dockerfile reference:
# 說明該鏡像以哪個(gè)鏡像為基礎(chǔ)
FROM centos:latest
# 構(gòu)建者的基本信息
MAINTAINER xianhu
# 在build這個(gè)鏡像時(shí)執(zhí)行的操作
RUN yum update
RUN yum install -y git
# 拷貝本地文件到鏡像中
COPY ./* /usr/share/gitdir/
有了Dockerfile之后太示,就可以利用build命令構(gòu)建鏡像了:
[root@xxx ~]# docker build -t="xianhu/centos:gitdir" .
其中-t用來指定新鏡像的用戶信息、tag等香浩。最后的點(diǎn)表示在當(dāng)前目錄尋找Dockerfile类缤。
構(gòu)建完成之后,同樣可以使用docker images命令查看:
[root@xxx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xianhu/centos gitdir 0749ecbca587 34 minutes ago 359.7 MB
xianhu/centos git 52166e4475ed About an hour ago 358.1 MB
centos latest 0584b3d2cf6d 9 days ago 196.5 MB
以上就是構(gòu)建自己鏡像的兩種方法邻吭。其中也涉及到了容器的一些操作餐弱。如果想刪除容器或者鏡像,可以使用rm命令囱晴,注意:刪除鏡像前必須先刪除以此鏡像為基礎(chǔ)的容器膏蚓。
[root@xxx ~]# docker rm container_name/container_id
[root@xxx ~]# docker rmi image_name/image_id
鏡像其他操作指令:
[root@xxx ~]# docker save -o centos.tar xianhu/centos:git # 保存鏡像, -o也可以是--output
[root@xxx ~]# docker load -i centos.tar # 加載鏡像, -i也可以是--input
Docker中關(guān)于容器的基本操作
在前邊鏡像的章節(jié)中,我們已經(jīng)看到了如何基于鏡像啟動(dòng)一個(gè)容器畸写,即docker run操作驮瞧。
[root@xxx ~]# docker run -it centos:latest /bin/bash
這里-it是兩個(gè)參數(shù):-i和-t。前者表示打開并保持stdout艺糜,后者表示分配一個(gè)終端(pseudo-tty)剧董。此時(shí)如果使用exit退出,則容器的狀態(tài)處于Exit破停,而不是后臺運(yùn)行翅楼。如果想讓容器一直運(yùn)行,而不是停止真慢,可以使用快捷鍵 ctrl+p ctrl+q 退出毅臊,此時(shí)容器的狀態(tài)為Up。
除了這兩個(gè)參數(shù)之外黑界,run命令還有很多其他參數(shù)管嬉。其中比較有用的是-d后臺運(yùn)行:
[root@xxx ~]# docker run centos:latest /bin/bash -c "while true; do echo hello; sleep 1; done"
[root@xxx ~]# docker run -d centos:latest /bin/bash -c "while true; do echo hello; sleep 1; done"
這里第二條命令使用了-d參數(shù)皂林,使這個(gè)容器處于后臺運(yùn)行的狀態(tài),不會(huì)對當(dāng)前終端產(chǎn)生任何輸出蚯撩,所有的stdout都輸出到log础倍,可以使用docker logs container_name/container_id查看。
啟動(dòng)胎挎、停止沟启、重啟容器命令:
[root@xxx ~]# docker start container_name/container_id
[root@xxx ~]# docker stop container_name/container_id
[root@xxx ~]# docker restart container_name/container_id
后臺啟動(dòng)一個(gè)容器后,如果想進(jìn)入到這個(gè)容器犹菇,可以使用attach命令:
[root@xxx ~]# docker attach container_name/container_id
刪除容器的命令前邊已經(jīng)提到過了:
[root@xxx ~]# docker rm container_name/container_id
Docker中關(guān)于倉庫的基本操作
Docker官方維護(hù)了一個(gè)DockerHub的公共倉庫德迹,里邊包含有很多平時(shí)用的較多的鏡像。除了從上邊下載鏡像之外揭芍,我們也可以將自己自定義的鏡像發(fā)布(push)到DockerHub上胳搞。
在鏡像操作章節(jié)中,我們新建了一個(gè)xianhu/centos:git鏡像称杨。
(1)訪問https://hub.docker.com/肌毅,如果沒有賬號,需要先注冊一個(gè)列另。
(2)利用命令docker login登錄DockerHub芽腾,輸入用戶名、密碼即可登錄成功:
[root@xxx ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: xianhu
Password:
Login Succeeded
(3)將本地的鏡像推送到DockerHub上页衙,這里的xianhu要和登錄時(shí)的username一致:
[root@xxx ~]# docker push xianhu/centos:git # 成功推送
[root@xxx ~]# docker push xxx/centos:git # 失敗
The push refers to a repository [docker.io/xxx/centos]
unauthorized: authentication required
(4)以后別人就可以從你的倉庫中下載合適的鏡像了摊滔。
[root@xxx ~]# docker pull xianhu/centos:git
對應(yīng)于鏡像的兩種創(chuàng)建方法,鏡像的更新也有兩種:
創(chuàng)建容器之后做更改店乐,之后commit生成鏡像艰躺,然后push到倉庫中。
更新Dockerfile眨八。在工作時(shí)一般建議這種方式腺兴,更簡潔明了。
這里再一次回顧一下三個(gè)重要的概念:鏡像廉侧、容器页响、倉庫:
從倉庫(一般為DockerHub)下載(pull)一個(gè)鏡像,Docker執(zhí)行run方法得到一個(gè)容器段誊,用戶在容器里執(zhí)行各種操作闰蚕。Docker執(zhí)行commit方法將一個(gè)容器轉(zhuǎn)化為鏡像。Docker利用login连舍、push等命令將本地鏡像推送(push)到倉庫没陡。其他機(jī)器或服務(wù)器上就可以使用該鏡像去生成容器,進(jìn)而運(yùn)行相應(yīng)的應(yīng)用程序了。
利用Docker創(chuàng)建一個(gè)用于Flask開發(fā)的Python環(huán)境
上邊已經(jīng)解釋和練習(xí)了Docker的基本操作命令盼玄,下邊以實(shí)例的形式完整走一遍流程贴彼。
我們創(chuàng)建一個(gè)用于Flask開發(fā)的Python環(huán)境,包含Git埃儿、Python3器仗、Flask以及其他依賴包等。
完整命令如下:
[root@xxx ~]# docker pull centos
[root@xxx ~]# docker run -it centos:latest /bin/bash
# 此時(shí)進(jìn)入容器蝌箍,安裝Python3青灼、Git、Flask及其依賴包等妓盲,安裝完成后exit退出
[root@xxx ~]# docker commit -m "Flask" -a "xianhu" container_id xianhu/flask:v1
[root@xxx ~]# docker push xianhu/flask:v1
Docker的功能和特性還有很多,各種運(yùn)行命令专普、參數(shù)等也都有待學(xué)習(xí)和練習(xí)悯衬,比如如何管理數(shù)據(jù)、如何管理網(wǎng)絡(luò)檀夹、如何互相配合工作筋粗、如何編寫更專業(yè)的Dockerfile等。本文先入門為主炸渡,以后有時(shí)間再慢慢更新關(guān)于Docker的知識娜亿。
=============================================================
只要一小時(shí),零基礎(chǔ)入門Docker - 笑虎的文章 - 知乎
https://zhuanlan.zhihu.com/p/23599229
Docker的學(xué)習(xí)總結(jié)一:Docker簡介蚌堵、安裝和常用命令
http://www.reibang.com/p/bf9152d2dcc1
==============================================================