docker 初體驗
docker 初體驗
在參加RoboCup仿真組的時候遇到了一個很奇怪的問題,實驗平臺運行的環境是java9+,但是智能體代碼的運行環境是java8(高版本不可以)。本來打算起一個虛擬機來運行兩份不同的代碼,不過室友告訴我一個更好的解決方案,使用docker——更輕量高效的解決方案。
什麽是docker
摘自docker中文社區:Docker是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集群和其他的基礎應用平臺。
為什麽我們使用docker
我們已經有了虛擬機這樣的很成熟的解決方案,那麽我們為什麽需要使用docker 呢?
一開始我將docker理解為一個更輕量級,更優化的虛擬機,但是事實上他們是不同的機制。
看到一個很有趣的形容:
- 物理機:一個獨棟別墅,有一個房子,獨立地基,獨立花園
- 虛擬機:一棟公寓樓,一棟樓裏裏有很多單獨套間,所有套間的住戶共享這棟樓,同時不共享水電,也不能進入別人的房子。
- 容器:一棟樓,樓房裏有很多套件,每個套間裏有小房間,住戶只擁有一個小房間,同一套間的多個住戶共享套間的所有資源,不能進入別人的小房間。
舉個栗子
以我遇到的情況為例:
- 如果我使用虛擬機:
- 創建一個虛擬機,安裝ubuntu,在虛擬機中配置JAVA10的環境,運行實驗平臺
- 創建一個虛擬機,安裝ubuntu,在虛擬機中配置JAVA8的環境,運行開發平臺
- 如果我使用docker容器:
- 安裝ubuntu的鏡像
- 創建一個容器,配置JAVA10的環境,運行實驗平臺
- 創建一個容器,配置JAVA8的環境,運行開發平臺
這樣說可能還是沒有體現 docker 的特點我們來畫一個簡單的圖(為了更形象加上了一個CentOS靈魂畫手上線)
超簡單使用入門
安裝
安裝這種小事,自己去官網看咯~
ps:我使用的是deepin15.7系統,安裝可以戳–>博客
下面的操作將以ubuntu為例~
搜索/查看/添加/刪除鏡像
- 搜索鏡像:
docker search ubuntu
- 下載鏡像:
docker pull ubuntu
- 查看已經下載的所有鏡像:
docker images
- 刪除鏡像:
啟動新容器
docker run -i -t ubuntu:latest
其中參數-i指交互式,-t指臨時終端
我個人感覺與其說是啟動容器,不如說是創建一個新的容器,因為每次用上面的指令創建的容器都是不同的,在這裏就不得不提一下踩的一個坑:假設我們先創建了一個容器並進行改動,下次如果還想使用這個改動過的容器不應該使用docker run
而是docker start
,這個我們後面再提~
由於我們沒有為這個容器命名,所以docker為這個容器分配了一個隨機id,也就是上面圖片中的d8a37fb0aaf8
退出當前容器
- 在容器的終端中輸入
exit
或者ctrl+D
- (這個就不截圖了吧,,,,)
查看容器
- docker ps :列出當前所有正在運行的container
- docker ps -l:列出最近一次啟動的container
- docker ps -a :列出所有的container(包含歷史,即運行過的container)
- docker ps -q :列出最近一次運行的container ID
根據上面的docker ps -a
命令我們可以看到我已經創建過兩個容器。
啟動並進入容器
上面我提到,如果我在一個容器裏面進行了修改並退出,那麽當我下次docker run
的時候並不會進入這個我修改過的容器而是創建一個新的容器,大家可以嘗試一下下面的代碼:
docker run -i www.longboshyl.cn www.fengshen157.com -t ubuntu:www.dfgjpt.com/ latest /bin/bash # 創建一個容器
# 下面的操作是在容器中的操作
touch /home/test.txt # 在新容器的home目錄下創建一個test.txt文件夾
exit # 退出當前容器
docker run -i -t www.zhongdayule.cn/ ubuntu:latest /bin/bash # 再創建一個容器
# 下面的操作是在容器中的操作
cd /home # 進入home目錄
ls # 查看home目錄下的所有內容,(當然是空的)
這是為什麽呢~因為不同的容器有自己獨立的改動層,不同的容器是不互通數據滴~
所以如果我們要使用一個容器的時候要執行的命令是docker start [容器名/容器id]
,當然在執行這條命令之後是沒有任何反應的,還要再加上一條docker attach [容器名/容器id]
,也可以使用docker exec -i -t [容器id] /bin/bash
,->看圖
創建命名的容器
上面我們進行的所有操作都是通過容器id進行的,但是這樣很繁瑣,如果創建了多個容器可能會混亂,在docker run
的時候我們就可以進行命名
docker run docker run -i -t ubuntu:latest /bin/bash
docker 初體驗