Docker快速入門使用

寫到前面
給別人寫的看的柿冲,順便發(fā)出來(lái)衡查,適合沒(méi)用過(guò)快速上手的
有些解釋為了說(shuō)明問(wèn)題用僧,概念并不是很準(zhǔn)確

簡(jiǎn)單了解下概念

  • image 鏡像壶栋,就像安裝系統(tǒng)的.iso鏡像辰如,包含了系統(tǒng)文件/環(huán)境(比如運(yùn)行java的環(huán)境)等
  • container 實(shí)例,運(yùn)行一個(gè)鏡像的實(shí)例贵试,就像是new了這個(gè)鏡像

1. 去安裝

Windows/Mac下直接點(diǎn)擊這里去下載安裝桌面
其他的或者更詳細(xì)的去看這里: Docker 安裝琉兜,側(cè)邊欄有各種系統(tǒng)的安裝

2. 找個(gè)centos7的鏡像試試

centos7是常見(jiàn)的線上服務(wù)器環(huán)境凯正,這里運(yùn)行一個(gè)centos7實(shí)例

2.1 拉取鏡像
默認(rèn)情況下會(huì)去 https://hub.docker.com/ 倉(cāng)庫(kù)下拉取,就跟代碼倉(cāng)庫(kù)呕童、maven倉(cāng)庫(kù)類似漆际,怎么修改倉(cāng)庫(kù)地址可以去百度
拉取鏡像:

docker pull centos:centos7

壓縮后的大小只有72.57 MB,應(yīng)該很快就好了

這時(shí)運(yùn)行docker images夺饲,可以看到有centos:centos7的鏡像

 ~ docker images
REPOSITORY                              TAG                    IMAGE ID            CREATED             SIZE
centos                                  centos7                7381c3b1d15c        6 weeks ago         204MB

2.2 運(yùn)行一個(gè)容器
運(yùn)行一個(gè)centos7容器奸汇,-it是進(jìn)入命令交互界面,冒號(hào)前面的centos是REPOSITORY往声,后面的centos7是TAG擂找,憑感覺(jué)理解下

docker run -it centos:centos7 bash

進(jìn)入容器內(nèi)部:
centos7容器內(nèi)

就跟使用一個(gè)linux一樣就行了

執(zhí)行exit命令退出

3. 自己制作一個(gè)java鏡像

如果沒(méi)有現(xiàn)成的鏡像,如何制作一個(gè)自己需要的環(huán)境浩销,這里以制作java鏡像為例

3.1 編寫Dockerfile
Dockerfile中包含了構(gòu)建鏡像的指令
只要簡(jiǎn)單的先了解三個(gè)指令就行:

  • FROM 依賴的基礎(chǔ)鏡像贯涎,相當(dāng)于直接在依賴的鏡像上操作
  • RUN 要執(zhí)行的命令,先直接使用shell命令就行了慢洋,別的格式后面再去百度
  • ENV 設(shè)置環(huán)境變量

新建一個(gè)文件塘雳,文件名就叫Dockerfile,也可以叫別的普筹,只不過(guò)使用別的名字構(gòu)建時(shí)需要通過(guò)-f指定败明,感興趣可以查下
Dockerfile文件內(nèi)容:

# 這里就以上面的centos7為基礎(chǔ)鏡像
FROM centos:centos7

# 更換yum源,如果你訪問(wèn)默認(rèn)源的速度很快太防,也可以注釋掉
RUN echo "更換yum源"
RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \
         -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
         -i.bak \
         /etc/yum.repos.d/CentOS-Base.repo
RUN yum makecache

# 這里偷下懶妻顶,直接yum install 很老的java8
RUN echo "安裝java8"
RUN yum install -y java-1.8.0-openjdk*

# 設(shè)置JAVA_HOME,這里的路徑是個(gè)軟鏈
RUN echo "設(shè)置JAVA_HOME"
ENV JAVA_HOME=/etc/alternatives/java_sdk_1.8.0

RUN echo "構(gòu)建完成"

3.2 構(gòu)建鏡像
現(xiàn)在構(gòu)建一個(gè)REPOSITORY為java, TAG為1.8-centos7的鏡像
在剛才的Dockerfile文件所在目錄執(zhí)行命令(注意最后的.代表構(gòu)建上下文為當(dāng)前目錄):

docker build -t java:1.8-centos7 .

構(gòu)建完成后:
構(gòu)建成功

3.3 運(yùn)行看看
進(jìn)入java容器:

docker run -it java:1.8-centos7 bash

看看環(huán)境并隨便寫個(gè)HelloWorld運(yùn)行下:

[root@5c82e883b72a /]# echo $JAVA_HOME
/etc/alternatives/java_sdk_1.8.0
[root@5c82e883b72a /]# java -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
[root@5c82e883b72a /]# mkdir -pv /opt/app && cd /opt/app
mkdir: created directory '/opt/app'
[root@5c82e883b72a app]# cat >> HelloWorld.java << EOF
> public class HelloWorld {
>     public static void main(String[] args) {
>         System.out.println("Hello world");
>     }
> }
> EOF
[root@5c82e883b72a app]# ls
HelloWorld.java
[root@5c82e883b72a app]# javac HelloWorld.java
[root@5c82e883b72a app]# ls
HelloWorld.class  HelloWorld.java
[root@5c82e883b72a app]# java HelloWorld
Hello world
[root@5c82e883b72a app]#

exit退出下

4. 怎么保存容器內(nèi)文件

上面運(yùn)行exit退出蜒车,再創(chuàng)建容器讳嘱,發(fā)現(xiàn)剛才/opt下的/app目錄和HelloWorld.java文件不見(jiàn)了

文件未保存

如果想要文件還在,可以通過(guò)-v選項(xiàng)去掛載容器內(nèi)目錄酿愧,當(dāng)然還有其他掛載方式沥潭,可以去百度
這里給宿主機(jī)當(dāng)前用戶下新建了一個(gè)目錄: ~/demo/mount_opt
掛載這個(gè)目錄到容器中的/opt
運(yùn)行命令,創(chuàng)建一個(gè)掛載了目錄的容器:

docker run -it -v ~/demo/mount_opt:/opt java:1.8-centos7 bash

嘗試容器內(nèi)創(chuàng)建文件后退出容器嬉挡,宿主機(jī)存在創(chuàng)建的文件
再次進(jìn)入叛氨,容器內(nèi)仍然有文件

目錄掛載

5. 啟動(dòng)容器直接運(yùn)行自己的程序

這部分需要在宿主機(jī)操作

5.1 新建HelloWorld.java文件

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world");
    }
}

5.2 新建start.sh文件

#!/bin/bash

cd /opt
javac HelloWorld.java
echo "Run HelloWorld >>>>"
java HelloWorld

5.3 修改Dockerfile,把自己的代碼打包進(jìn)鏡像
直接以上面的鏡像java:1.8-centos7為基礎(chǔ)鏡像棘伴,使用COPY命令將代碼復(fù)制到鏡像中

# 使用上面的java鏡像
FROM java:1.8-centos7

# 文件復(fù)制到鏡像內(nèi)/opt目錄下,根據(jù)自己目錄決定
COPY HelloWorld.java /opt/
COPY start.sh /opt/

RUN echo "構(gòu)建完成"

注意: 這里HelloWorld.java屁置、start.sh焊夸、Dockerfile文件在同一目錄下,如果不同目錄蓝角,需要修改Dockerfile

5.4 構(gòu)建新鏡像
Dockerfile文件所在目錄下執(zhí)行:

docker build -t helloworld:java1.8-centos7 .

構(gòu)建成功后通過(guò)docker images可以看到

5.5 啟動(dòng)容器運(yùn)行我們的start.sh

docker run -it helloworld:java1.8-centos7 bash /opt/start.sh
Java代碼輸出

可以看到j(luò)ava代碼的輸出

6. 怎么再開(kāi)一個(gè)運(yùn)行的容器終端

比如阱穗,上面運(yùn)行的容器饭冬,終端提示符root@之后就是容器ID的前8位,也可以通過(guò)docker ps命令查看容器ID
這里的容器ID是2e67d474993a
直接在別的終端通過(guò)docker exec命令進(jìn)入就可以了:

docker exec -it 2e67d474993a bash

7. 鏡像保存給別人用

通過(guò)docker save保存鏡像
這里保存后再壓縮減少大小:

docker save java:1.8-centos7 | gzip > ./java-1.8-centos7.tar.gz

通過(guò)docker load -i java-1.8-centos7.tar.gz加載即可

當(dāng)然揪阶,還有docker exportdocker import昌抠,是針對(duì)容器操作的

8. 其他常用操作

  • docker run的各種參數(shù) 參考Docker run 命令,常用的有:
    • -d 后臺(tái)運(yùn)行
    • -i 交互模式
    • -t 終端
    • -p 端口映射
    • --rm 容器退出清理容器內(nèi)文件
    • -v 文件掛載
    • --mount 文件掛載
  • docker start/stop/restart
  • docker inspect 查看容器或者鏡像的信息
  • docker cp 容器和宿主機(jī)之間復(fù)制文件
  • docker rmi 刪除鏡像
  • docker rm 刪除容器
  • docker commit 把容器現(xiàn)有狀態(tài)保存為鏡像鲁僚,比如上面就可以在容器里編譯java炊苫,編寫腳本,把容器當(dāng)前狀態(tài)保存為鏡像

9. 常用快捷操作

刪除所有none的鏡像

docker rmi -f $(docker images | grep "none" | awk '{print $3}')

刪除所有容器

docker rm -f $(docker ps -aq)

10. 最后

上面運(yùn)行的容器冰沙,在退出時(shí)都沒(méi)有清理容器的文件系統(tǒng)
運(yùn)行docker ps -a可以看到退出的容器們
可以:
通過(guò)docker rm 容器ID刪除
通過(guò)docker rm -f $(docker ps -aq)刪除所有容器
docker run中加上參數(shù)--rm侨艾,當(dāng)然,現(xiàn)在來(lái)不及了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拓挥,一起剝皮案震驚了整個(gè)濱河市唠梨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侥啤,老刑警劉巖当叭,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盖灸,居然都是意外死亡蚁鳖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門糠雨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)才睹,“玉大人,你說(shuō)我怎么就攤上這事甘邀±湃粒” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵松邪,是天一觀的道長(zhǎng)坞琴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)逗抑,這世上最難降的妖魔是什么剧辐? 我笑而不...
    開(kāi)封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮邮府,結(jié)果婚禮上荧关,老公的妹妹穿的比我還像新娘。我一直安慰自己褂傀,他們只是感情好忍啤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仙辟,像睡著了一般同波。 火紅的嫁衣襯著肌膚如雪鳄梅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天未檩,我揣著相機(jī)與錄音戴尸,去河邊找鬼。 笑死冤狡,一個(gè)胖子當(dāng)著我的面吹牛孙蒙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筒溃,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼马篮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了怜奖?” 一聲冷哼從身側(cè)響起浑测,我...
    開(kāi)封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎歪玲,沒(méi)想到半個(gè)月后迁央,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滥崩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年岖圈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钙皮。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜂科,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出短条,到底是詐尸還是另有隱情导匣,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布茸时,位于F島的核電站贡定,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏可都。R本人自食惡果不足惜缓待,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渠牲。 院中可真熱鬧旋炒,春花似錦、人聲如沸签杈。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至汇四,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踢涌,已是汗流浹背通孽。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睁壁,地道東北人背苦。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像潘明,于是被迫代替她去往敵國(guó)和親行剂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容