Docker學習
理解
Docker可以創建一個可移植的輕便的虛擬操作系統環境,然後可以將應用移植在這個虛擬環境中,這樣以後部署的時候就可以直接將這個虛擬環境生成的鏡像移植到服務器上,這樣就不需要再在服務器上安裝相關的依賴環境.
應用場景:
web應用的自動化打包和發佈;
自動化測試和持續集成、發佈;
在服務型環境中部署和調整數據庫或其他的後臺應用;
鏡像:
docker鏡像同普通的操作系統的鏡像概念差不多,其本質是一個文件,是用來創建容器的基礎
容器:
容器類似於一個操作系統,其是基於鏡像製作而成,是鏡像的一個實例,可以運行程序及相關讀寫操作,一個鏡像可以創建多個容器,一個容器屬於一個鏡像.容器也可以製作成鏡像.
經測試,容器的硬件參數同宿主主機的一樣
安裝docker(ubuntu)
首先更新下載源:
sudo apt-get update
安裝docker
sudo apt-get install docker.
查看是否安裝成功
sudo docker info
搜索並下載鏡像
這裏的鏡像是從docker的官方鏡像網站進行搜索和下載的 www.docker.io
搜索鏡像:
sudo docker search 鏡像名稱
例如: sudo docker search centos
下載鏡像:
如果有搜索到鏡像,那麼就可以通過名稱來下載該鏡像
sudo docker pull 鏡像名稱
查看自己擁有的鏡像
sudo docker images
刪除鏡像
刪除鏡像前需要先刪除該鏡像衍生的容器,而後刪除鏡像
sudo docker rmi [鏡像id|鏡像名稱]
據說使用如下命令可以刪除所有鏡像
docker rmi $(docker images -q)
打包鏡像到本地
sudo docker save [鏡像名稱]> [打包後的存儲路徑]
將導出的鏡像再導入:
cat 鏡像文件路徑 | sudo dockerimport – 需要導到的倉庫名/鏡像名稱
給鏡像添加tag:
tag是給鏡像添加的標籤,類似於版本號,在創建鏡像的時候,若沒有指定鏡像tag,那麼其tag將是默認值latest.
tag的修改方式:
docker tag -f ubuntu:1.0ubuntu:2.0
容器操作
創建並啓動容器
docker run -i –t -v /home/test/:/home/test/ –name webflask ubuntu/bin/bash
這條命令比較長,稍微分解一下,包含以下三個部分:
docker run <相關參數> <鏡像 ID> <初始命令>
其中,相關參數如下:
-a stdin: 指定標準輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項;
-d: 後臺運行容器,並返回容器ID;
-i: 以交互模式運行容器,通常與 -t 同時使用;
-t: 爲容器重新分配一個僞輸入終端,通常與 -i 同時使用;
-v 表示需要將本地哪個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>
--name="nginx-lb": 爲容器指定一個名稱;
--dns 8.8.8.8: 指定容器使用的DNS服務器,默認和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默認和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 設置環境變量;
--env-file=[]: 從指定文件讀入環境變量;
--cpuset="0-2" or --cpuset="0,1,2": 綁定容器到指定CPU運行;
-m :設置容器使用內存最大值;
--net="bridge": 指定容器的網絡連接類型,支持bridge/host/none/container: 四種類型;
--link=[]: 添加鏈接到另一個容器;
--expose=[]: 開放一個端口或一組端口;
需要說明的是,不一定要使用“鏡像 ID”,也可以使用“倉庫名:標籤名”,例如:docker.cn/docker/centos:centos6。
初始命令表示一旦容器啓動,需要運行的命令,此時使用“/bin/bash”,表示什麼也不做,只需進入命令行即可。
創建不啓動容器使用關鍵字 create,其使用方式同run一樣
退出容器:
exit
查看後臺容器:
sudo docker ps [-a 查看所有(包括未運行)的容器]
列表參數含義:
CONTAINER ID IMAGE COMMANDCREATED STATUS PORTS NAMES
這些分別代表什麼
CONTAINER ID:容器ID,唯一標識容器
IMAGE:創建容器時所用的鏡像
COMMAND:在容器最後運行的命令
CREATED:容器創建的時間
STATUS:容器的狀態(你會看到UPXXX,表示運行狀態)
PORTS:對外開放的端口號
NAMES:容器名(也具有唯一性,docker是不允許創建容器名相同的容器的)
啓動容器:
sudo docker start [容器名|容器ID]
進入已啓動的容器的shell:
sudo docker exec –it [容器名|容器ID] bash
結束容器:
sudo docker stop [容器名|容器ID]
重啓容器:
sudo docker restart [容器名|容器ID]
刪除容器
sudo docker rm [容器名|容器ID]
據說使用如下命令可以刪除所有容器
docker rm $(docker ps -q -a)
修改容器名稱:
docker rename old容器名 new容器名
容器導出:
sudo docker export [容器ID|容器名稱]> 導出的路徑
將導出的容器導入爲鏡像:
cat 容器文件路徑 | sudo dockerimport – 需要導到的倉庫名/鏡像名稱
容器的端口映射:
創建時:
-p:可以指定要映射的IP和端口,但是在一個指定端口上只可以綁定一個容器。支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort
sudo docker run –p 8080:80 ubuntu
上面代碼將容器的80端口映射到宿主主機的8080端口
-P:當使用 -P 標記時,Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口
sudo docker run –P 80 ubuntu
上面的代碼將會把80端口映射到宿主主機的一個隨機端口,可以使用 sudo docker ps來查看主機的端口映射情況.
若要創建多個端口映射,可以重複使用 –p或者-P
創建後:
找了很多資料.都說不建議創建後修改端口映射,如果因爲特殊情況需要後期修改端口映射,則有兩種方法,一是將當前容器製作成鏡像,二是採取如下方法:
執行如下命令查看該容器的ip:
docker inspect [
容器名稱] | grep
IPAddress
執行如下命令將該容器的8080端口映射到宿主主機的7001端口,需要注意的是,映射後只有通過該主機的ip來訪問,無法通過localhost:port來訪問
iptables -t nat -A DOCKER -ptcp --dport 7001 -j DNAT --to-destination [容器ip]:8000
將容器製作成鏡像:
sudo docker commit [容器名稱|容器id] [倉庫名]/[鏡像名]
鏡像倉庫的製作
安裝docker
apt-get install docker.io
安裝docker-compose
apt-get install docker-compose
去docker的官方倉庫下載用於搭建私有倉庫的鏡像
sudo docker pull registry
創建容器
sudo docker run -d -p 7777:5000 -v/home/docker/:/tmp/registry registry
在服務器上完成以上步驟後私有倉庫就搭建完成了
將本地項目push到遠程倉庫中
首先將本地鏡像添加tag,tag的開頭是服務器的host:port,如下
sudo docker tag ubuntu:v1 106.14.205.170:7777/ubuntu:v2
因爲Docker從1.3.X之後,與docker registry交互默認使用的是https,然而此處搭建的私有倉庫只提供http服務,所以當與私有倉庫交互時就會報上面的錯誤。爲了解決這個問題需要創建文件/etc/docker/daemon.json,裏面內容如下:
$ sudo vi /etc/init/docker.conf
添加
{
"insecure-registries": [
"106.14.205.17:7777"
]
}
//多個私服寫法,逗號分隔即可
{
"insecure-registries": [
"test.docker.jiankunking.io:5000",
"106.14.205.170:7777"
]
}
然後重啓docker
systemctl restart docker
將修改的tag傳到服務器中:
sudo docker push 106.14.205.170:7777/ubuntu:v2
容器內項目示例
(使用python3.5環境下的flask庫模擬搭建一個小型web服務器):
創建容器(將內網8080端口映射到7001)
docker run -i -t –v –p 7001:8080 /home/test/:/home/test/ubuntu /bin/bash
安裝wget vim
apt-get update
apt-get install vim
apt-get install wget
安裝python3.5
apt-get install python3.5
安裝setuptools和flask
tar –xzvf setuptools-19.6.tar.gz
cd setuptools-19.6
python3.5 setup.py build
python3.5 setup.py install
wget https://pypi.python.org/packages/eb/12/1c7bd06fcbd08ba544f25bf2c6612e305a70ea51ca0eda8007344ec3f123/Flask-0.12.2.tar.gz#md5=97278dfdafda98ba7902e890b0289177
tar –zxvf Flask-0.12.2.tar.gz
cd Flask-0.12.2
python3.5 setup.py install
創建服務器
cd /home/
vim api.py
裏面添加服務器代碼
from flask import Flask app=Flask(__name__) @app.route("/",methods=["GET","POST"]) def index(): return "hello" app.run(host="0.0.0.0",port=8080)
保存後,後臺運行代碼:
nohup python3.5 api:app &
退出docker
exit
訪問測試,在外部的宿主瀏覽器上輸入http://127.0.0.1:7001/,如果成功的話將會顯示hello