一.簡介
開發當中比較麻煩的問題在於軟件配置,每個人的機械以及系統都不盡相同,程序需要運行在系統當中需要配置好相應的系統以及各種依賴的組件,但是很多時候由於各種軟件依賴包的版本,系統兼容性問題會導致程序運行出現問題,人們便尋求一種可以解決這種問題的方法。
虛擬機
而虛擬機技術就是其中的一種解決方法,眾所周知,虛擬機技術允許一種操作系統之上運行另一種操作系統,如win系統安裝linux的虛擬機,而里面的運行程序卻認為自己依舊運行在linux里面,因此用戶只需要打包整個自己的運行環境,就可以在不同的系統利用虛擬機技術完美運行程序所需要的系統,而里面的程序更不在話下,且打包好的系統對於運行的系統而言只是一個文件,可以輕松管理。
但是虛擬機技術卻有一種比較大的問題,那就是用戶明明只需要運行某個程序,卻需要引入該程序所處的整個系統,不但占用的空間很大,且啟動速度也比較慢,畢竟需要啟動整個系統。
容器技術
由於虛擬機存在這些缺點,Linux發展出了另一個虛擬技術:Linux容器,相對於虛擬機,Linux容器不是模仿一個完整的操作系統,而是對進程進行隔離。在這個容器里面,它接觸到的資源都是虛擬的,他只需要它本身所需要的組件,相對於虛擬機技術而言,更輕量級,而docker就是對Linux容器的一種封裝,提供給我們簡單易用的接口,將應用程序以及依賴打包在一個文件里面。
二.安裝docker
我是ubuntu系統,安裝docker可以使用官方的快捷安裝腳本進行安裝。
$ wget -qO- https://get.docker.com/ | sh
但是我安裝起來有點問題,在添加gbp的時候,所以我是安裝教程一步步安裝的。
# 添加gbp,但是我按照官方教程執行有點問題,去掉最后一個-符號就可以執行
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加APT資源
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
# 查看源是否已經生效
$ apt-cache policy docker-ce
# 這時候應該輸出類似於這種東西,如果沒有這些輸出的話,下面的安裝就會找不到軟件包了
# docker-ce:
# Installed: (none)
# Candidate: 17.03.1~ce-0~ubuntu-xenial
# Version table:
# 17.03.1~ce-0~ubuntu-xenial 500
# 500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
# 17.03.0~ce-0~ubuntu-xenial 500
# 500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
# 最后安裝docker
$ sudo apt-get install -y docker-ce
# 安裝之后執行以下命令有信息輸出即證明成功。
$ sudo systemctl status docker
之后我們可以通過下載一個鏡像來嘗試運行hello world。
docker run ubuntu echo "Hello world"
三.使用國內源
我們的docker在國內下載鏡像並不會很流暢,所以我選擇使用國內官方的景象。
我直接新建文件:/etc/docker/daemon.json,然后添加如下json,重啟docker即可永久選擇國內鏡像。
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
四.docker的基本概念
1.image(鏡像)
docker把應用程序以及其依賴,打包在image文件里面,docker容器是通過運行image生成的實例,同一個image文件可以生成多個容器實例。
2.container(容器)
container是一個docker的運行實例,也叫做容器,本身也是一個文件,可以理解容器實例就是通過渲染運行image鏡像之后才產生的。值得注意的是生成容器之后,關閉容器不會刪除該容器文件,該容器文件之后停止運行了而已。
至於鏡像以及容器之間擁有鏡像分層結構,詳解可以看出我寫的這篇文章。
五.基本命令
鏡像操作
# 查看當前本地鏡像列表
$ docker images
# 查看遠程相關鏡像鏡像
$ docker search 鏡像名字
# 拉取鏡像到本地
$ docker pull 鏡像名字
# 刪除鏡像(當存在多個名字一樣的鏡像時候,可以通過指定tag方式來操作,如ubuntu:16.04)
$ docker rmi 鏡像名字
容器的基本操作
# 創建一個docker容器,返回容器的id
$ docker create 鏡像名字
# 運行docker容器
$ docker start 容器id
# 新建容器且運行,也就是上面兩步一塊執行。
# 值得注意的是如果該鏡像在本地不存在,會自動從源那里去拉取
$ docker run 鏡像名字
# 停止容器
$ docker stop 容器id
# 查看當前運行的docker容器
$ docker ps
# 查看全部的docker容器
$ docker ps -a
# 刪除容器
$ docker rm 容器id
新建容器(docker run 鏡像)常見可選參數:
- p:指定映射端口,如運行一個nginx服務,那么我可以設置 -p 8080:80來把本地的8080端口映射到容器里的80端口。
- d:容器作為一個守護進程去進行運行,也就是保持后台運行,運行后會返回cotainer id。
容器與鏡像間的操作
# 終端連接到容器
$ docker exec -i -t 容器id bash
# 復制文件到容器里面
$ docker cp index.html 鏡像id://usr/share/nginx/html
# 保存更改並生成為一個新的image文件
$ docker commit -m "mess" 鏡像id 鏡像名字