2018年10月6日 星期六html
15:04node
什麼就Docker?python
Docker是一個開源項目, 誕生於2013年初,最初是dotCloud公司內部的一個業餘項目。它基於Google公司推出的Go語言實現。項目後來加入了Linux基金會,聽從了Apache 2.0協議,項目代碼在GitHub 上進行維護。mysql
Docker項目的目標是實現輕量級的操做系統虛擬化解決方案。Docker的基礎是Linux容器(LXC)等技術。在LXC的基礎上Docker進行了進一步的封裝,讓用戶不須要去關心容器的管理,使得操做更爲簡便。用戶操做Docker的容器就像操做一個快速輕量級的虛擬機同樣簡單。linux
爲何要使用Docker?nginx
Docker 相比傳統虛擬機有諸多優點。git
Docker基本概念github
Docker包括三個基本概念web
Docker提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。鏡像能夠用來建立Docker容器。redis
容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、 刪除。每一個容器都是相互隔離的、保證安全的平臺。
倉庫是集中存放鏡像文件的場所。倉庫分爲公開倉庫(Public)和私有倉庫(Private) 兩種形式。
最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。 中國官方鏡像加速
2018年10月7日 星期日
12:20
Docker 支持多平臺的安裝(Linux/Windows/OS X)。
由於Docker原生支持Linux,因此,能夠直接在Linux上運行,並且在Windows和 OS X 平臺則須要藉助輕量級的 Linux VM 運行。
Ubuntu安裝
在Ubuntu上安裝Docker的說明取決於您使用的是Docker企業版(Docker EE)仍是Docker社區版(Docker CE)。
參考文檔:https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/
使用倉庫進行安裝
首次在新的主機上安裝Docker CE以前,須要設置Docker倉庫。 以後,你能夠從存儲庫安裝和更新Docker。
設置倉庫
一、更新 apt 包索引:
$ sudo apt-get update
二、安裝軟件包,使它容許apt經過HTTPS使用倉庫:
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
三、添加Docker的官方GPG密鑰:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
經過搜索密鑰的最後8個字符,確認您如今已經擁有指紋 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 的密鑰。
$ sudo apt-key fingerprint 0EBFCD88
pub 4096R/0EBFCD88 2017-02-22
密鑰指紋 = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22
四、使用如下命令來設置 stable 的倉庫。即便你想從 __edge __ 或 test 倉庫安裝構建,也老是須要 stable 的倉庫。要添加 __edge __ 或 test 倉庫,請在下面的命令中在單詞stable以後添加edge或test(或二者)。
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
注意:上面的lsb_release -cs子命令返回你的Ubuntu發行版的名字,好比xenial。
安裝Docker CE
一、更新 apt 包索引:
$ sudo apt-get update
二、安裝最新版本有 Dcoker CE
$ sudo apt-get install docker-ce
三、在生產系統上,您應該安裝特定版本的Docker CE,而不是始終使用最新版本。下面命令列出可用的版本。
$ apt-cache madison docker-ce
docker-ce | 17.12.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 17.09.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 17.09.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 17.06.2~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 17.06.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 17.06.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 17.03.2~ce-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
安裝指定的版本:
$ sudo apt-get install docker-ce=<VERSION>
四、經過運行hello-world 鏡像驗證Docker CE是否正確安裝。
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:66ef312bbac49c39a89aa9bcc3cb4f3c9e7de3788c944158df3ee0176d32b751
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
其它
查看 Docker 版本:
$ sudo docker version
Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:11:19 2017
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:09:53 2017
OS/Arch: linux/amd64
Experimental: false
顯示 Docker 系統信息,包括鏡像和容器數:
$ sudo docker info
Containers: 7
Running: 0
Paused: 0
Stopped: 7
Images: 2
Server Version: 17.12.0-ce
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 20
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 89623f28b87a6004d4b785663257362d1658a729
runc version: b2567b37d7b75eb4cf325b77297b140ea686ce8f
init version: 949e6fa
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.13.0-26-generic
Operating System: Ubuntu 16.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.924GiB
Name: ubuntu
ID: OXZY:HYGR:X6XJ:CLDF:H2UG:KXCY:J6MD:32WV:UORN:E2QY:TRTL:ISI6
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No swap limit support
2018年10月7日 星期日
12:20
Docker 運行容器前須要本地存在對應的鏡像,若是鏡像不存在本地, Docker 會從鏡像倉庫下載(默認是Docker Hub公共註冊服務器中的倉庫)。
Docker Hub:https://hub.docker.com 阿里雲鏡像:https://dev.aliyun.com/search.html 靈雀雲:https://hub.alauda.cn/
鏡像
查看鏡像
列出本地鏡像:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest f2a91732366c 2 months ago
在列出信息中,能夠看到幾個字段信息:
獲取鏡像
可使用docker pull 命令來從倉庫獲取所須要的鏡像。搜索 「ubuntu」 鏡像。
$ sudo docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
8f7c85c2269a: Pull complete
9e72e494a6dd: Pull complete
3009ec50c887: Pull complete
9d5ffccbec91: Pull complete
e872a2642ce1: Pull complete
Digest: sha256:d3fdf5b1f8e8a155c17d5786280af1f5a04c10e95145a515279cf17abdf0191f
Status: Downloaded newer image for ubuntu:latest
該命令實際上至關於 $ docker pull registry.hub.docker.com/ubuntu 命令,即從註冊服務器registry.hub.docker.com中的 ubuntu倉庫來下載的鏡像。
固然,官方的Docker hub 比較慢,咱們也能夠到國內的容器服務去下載鏡像。
建立鏡像
建立鏡像有不少方法,用戶能夠從 Docker Hub 獲取已有鏡像並更新,也能夠利用本地文件系統建立一個。
作爲一個 Docker 新手,咱們先掌握如何使用別人的鏡像,至於建立鏡像放到後面介紹。
2018年10月7日 星期日
12:21
簡單的說,容器是獨立運行的一個或一組應用,以及它們的運行態環境。 若是把鏡像當作面向對象中的 類 的話,那麼容器就是 類 的實例化 對象。
容器
啓動容器
啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動, 另一個是將在終止狀態(stopped)的容器從新啓動。
經過docker run 命令來啓動容器。
查看運行幫助:
$ sudo docker run --help
下面的命令輸出一個 「Hello World」,以後終止容器。
$ sudo docker run ubuntu /bin/echo "hello world"
hello world
這跟在本地直接執行 /bin/echo 'hello world'幾乎感受不出任何區別。只不過,這裏的輸入是由經過 ubuntu 容器執行。
下面進入到ubuntu容器中。
$ sudo docker run -t -i ubuntu /bin/bash
root@543a324ea841:/#
此時,你已經在ubuntu容器中了。這是一個獨立的ubuntu 系統。經過 root@543a324ea841 標識能夠看出。
當利用docker run 來建立容器時,Docker在後臺運行的標準操做包括:
退出容器,可使用exit命令。
root@543a324ea841:/# exit
exit
fnngj@ubuntu:~$
守護狀態運行
更多的時候,須要讓 Docker容器在後臺以守護態(Daemonized)形式運行。
$ sudo docker run -d ubuntu /bin/echo "hello docker"
839fee657bfe893b9b2c76aebbb2b620efefc091a04fd90b1c5eda82b9e36730
查看容器
經過 docker ps 命令查看當前運行的全部容器。
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
839fee657bfe ubuntu "/bin/echo 'hello do…" About a minute ago Exited (0) About a minute ago musing_golick
543a324ea841 ubuntu "/bin/bash" 6 minutes ago Exited (0) About a minute ago relaxed_shannon
578639b30db9 ubuntu "/bin/bash" 7 minutes ago Exited (0) 7 minutes ago sad_ritchie
9797d4bcb1f6 ubuntu "/bin/echo 'hello wo…" 9 minutes ago Exited (0) 9 minutes ago cranky_keller
4d2cd63632c7 hello-world "/hello" 20 minutes ago Exited (0) 20 minutes ago keen_stallman
獲取容器的輸出信息
經過docker logs命令。
$ sudo docker logs musing_golick
hello docker
$ sudo docker logs 839fee657bfe
hello docker
musing_golick 爲容器的 NAMES , 839fee657bfe 爲容器的ID。經過 docker ps -a 命令查看。
中止容器
可使用docker stop來終止一個運行中的容器。
$ sudo docker stop 0fc49a885fc2
重動容器
可使用docker start 重動容器。
$ sudo docker start 0fc49a885fc2
刪除容器
經過 docker rm 刪除指定的容器。
sudo docker rm 0fc49a885fc2
0fc49a885fc2 爲容器有 ID 。
2018年10月7日 星期日
12:21
前面在下載鏡像的適應已經用到了Docker倉庫,若是是鏡像的一個託管平吧。
倉庫
一個容易混淆的概念是註冊服務器(Registry)。 實際上註冊服務器是管理倉庫的具體服務器,每一個服務器上能夠有多個倉庫,而每一個倉庫下面有多個鏡像。從這方面來講, 倉庫能夠被認爲是一個具體的項目或目錄。例如對於倉庫地址registry.hub.docker.com/ubuntu 來講,registry.hub.docker.com是註冊服務器地址,ubuntu是倉庫名。大部分時候,並不須要嚴格區分這二者的概念。
Docker Hub
目前Docker官方維護了一個公共倉庫 Docker Hub:https://hub.docker.com
咱們能夠在Docker Hub上完成註冊。這樣就可使用Docker Hub 來託管咱們的鏡像了。
經過docker search命令來查找官方倉庫中的鏡像,並利用docker pull 命令來將它下載到本地。
$ sudo docker search ubuntu
使用國內鏡像
參考地址:https://www.docker-cn.com/registry-mirror
臨時性的使用:
$ sudo docker pull registry.docker-cn.com/library/ubuntu:16.04
永久性的使用:
修改 /etc/docker/daemon.json文件(沒有的話能夠手動建立,須要經過root用戶操做)並添加上 registry-mirrors 鍵值。
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
修改保存後重啓Docker服務以使配置生效。
$ sudo service docker restart
2018年10月7日 星期日
12:22
獲取Nginx鏡像
最簡單的方法就是經過 docker pull nginx 命令來建立 Nginx容器。
$ sudo docker pull nginx
或者:
$ sudo docker pull registry.docker-cn.com/library/nginx
其中 registry.docker-cn.com 爲國內的官方鏡像倉庫,速度要好不少。
啓動Nginx容器
查看鏡像:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 2a4cca5ac898 8 days ago 111MB
registry.docker-cn.com/library/nginx latest 3f8a4339aadd 4 weeks ago 108MB
hello-world latest f2a91732366c 2 months ago 1.85kB
啓動 ngnnx 容器
$ sudo docker run --name some-nginx -d -p 8080:80 registry.docker-cn.com/library/nginx
b5bbf1dfe86a21d641a161c05598c0f4f4d4b32fc8d756b6fdf306295067625f
訪問Nginx服務器
處理過程: 瀏覽器 –> ubuntu(8080) –> Nginx容器(80)
備註:這裏只是介紹如何把一個Nginx容器運行起來,而後,Nginx自己只是一箇中間件,經過它來運行不一樣的Web項目纔會真的有價值。
2018年10月7日 星期日
12:22
SeleniumHQ官方項目:https://github.com/seleniumHQ/docker-selenium 項目目前快速迭代中。
Selenium
這裏主要針對的是 Selenium Grid,它用於分佈式自動化測試,就是一套Selenium 代碼可在不一樣的環境上運行。恰好,Docker可快速的建立各類環境。
Selenium Grid 有兩個概念
hub :主節點,你能夠看做 「北京總公司的測試經理」。
node:分支節點,你能夠看做 「北京總公司的測試小兵A」 和 「上海分公司的測試小兵B」,還有 「深圳分公司的測試小兵C」 …。
也就是說在Selenium Grid中只能有一個主hub,但能夠在本地或遠程創建 N 多個分支node,測試腳本指向主hub,由主hub 分配給本地/遠程node 運行測試用例。
docker selenium 環境安裝
以Ubuntu爲例,在Ubuntu下安裝Docker,請參考:Docker安裝(Ubuntu)
docker hub(倉庫):
https://hub.docker.com/r/selenium/hub/
一、下載主hub鏡像(北京總公司的測試經理)
$ sudo docker pull selenium/hub
二、下載主node chrome 鏡像(上海分公司的測試小兵B)
$ sudo docker pull selenium/node-chrome
三、查看鏡像
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
selenium/node-chrome latest 1eba57bd3d79 12 days ago 823MB
selenium/hub latest d1437f7d9f87 12 days ago 285MB
四、啓動主hub容器
$ sudo docker run -d -P --name selenium-hub selenium/hub
五、啓動分支node chrome 容器
$ sudo docker run -d --link selenium-hub:hub selenium/node-chrome
六、查看容器
$ sudo docker images
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cd0dac69875 selenium/hub "/opt/bin/entry_poin…" 12 hours ago Up 12 hours 0.0.0.0:32768->4444/tcp selenium-hub
18d139a6c36d selenium/node-chrome "/opt/bin/entry_poin…" 12 hours ago Up 12 hours eloquent_gates
這裏須要注意,Selenium/hub 容器的端口號爲 4444,對Ubuntu映射的端口爲 32768,前面經過 -P 參數自動分配。
工做原理:
selenium Grid腳本 -> ubuntu(32768) -> Hub容器(4444) -> Node Chrome 容器
建立Grid測試腳本與運行
一、編寫Selenium Grid 腳本(grid_demo.py)
from selenium import webdriver
from time import sleep
driver = webdriver.Remote(
command_executor='http://127.0.0.1:32768/wd/hub',
desired_capabilities={'browserName': 'chrome'}
)
driver.get('https://www.baidu.com')
print("get baidu")
driver.find_element_by_id("kw").send_keys("docker selenium")
driver.find_element_by_id("su").click()
sleep(1)
driver.get_screenshot_as_file("/home/fnngj/mypro/baidu_img.png")
driver.quit()
print("end...")
注意訪問的端口號和瀏覽器,由於咱們只啓動了node chrome容器,若是這裏設置Friefox的話,須要你啓動 node firefox 容器,hub找不到合適的node會報錯。
另外,咱們爲了驗證腳本是否真的執行加上了打印和截圖。
二、運行腳本
$ python3 grid_demo.py
get baidu
end...
三、查看截圖
百度頁面是被渲染出來了,但中文有亂碼。
2018年10月7日 星期日
12:23
雖然,前面已經會 使用 Nginx 和 docker selenium 來啓動容器,但也僅僅是會使用,Dcoker 中還有許多概念和細節須要咱們繼續學習。
Dockerfile 文件分析
Dockerfile 由一行行命令語句組成,而且支持以 # 開頭的註釋行。
通常的 Dockerfile 分爲四部分:基礎鏡像信息、 維護者信息、 鏡像操做指令 和 容器啓動時執行指令 。
以Selenium/Hub 的 Dockerfile 文件爲例:
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# NOTE: DO *NOT* EDIT THIS FILE. IT IS GENERATED.
# PLEASE UPDATE Dockerfile.txt INSTEAD OF THIS FILE
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FROM selenium/base:3.8.1-erbium
LABEL authors=SeleniumHQ
USER seluser
#========================
# Selenium Configuration
#========================
EXPOSE 4444
# As integer, maps to "maxSession"
ENV GRID_MAX_SESSION 5
# In milliseconds, maps to "newSessionWaitTimeout"
ENV GRID_NEW_SESSION_WAIT_TIMEOUT -1
# As a boolean, maps to "throwOnCapabilityNotPresent"
ENV GRID_THROW_ON_CAPABILITY_NOT_PRESENT true
# As an integer
ENV GRID_JETTY_MAX_THREADS -1
# In milliseconds, maps to "cleanUpCycle"
ENV GRID_CLEAN_UP_CYCLE 5000
# In seconds, maps to "browserTimeout"
ENV GRID_BROWSER_TIMEOUT 0
# In seconds, maps to "timeout"
ENV GRID_TIMEOUT 30
# Debug
ENV GRID_DEBUG false
# As integer, maps to "port"
ENV GRID_HUB_PORT 4444
COPY generate_config \
entry_point.sh \
/opt/bin/
# Running this command as sudo just to avoid the message:
# To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details.
# When logging into the container
RUN /opt/bin/generate_config > /opt/selenium/config.json
CMD ["/opt/bin/entry_point.sh"]
Dockerfile 都必須以 FROM 命令開始。 FROM命令會指定鏡像基於哪一個基礎鏡像建立,接下來的命令也會基於這個基礎鏡像。
指定運行容器時的用戶名或 UID,後續的RUN、CMD、ENTRYPOINT也會使用指定用戶。
告訴 Docker 服務端容器對外映射的本地端口,須要在 docker run 的時候使用-p或者-P選項生效。
指定一個環節變量,會被後續 RUN 指令使用,並在容器運行時保留。
CMD 有三種使用方式:
CMD指定在 Dockerfile 中只能使用一次,若是有多個,則只有最後一個會生效。
CMD的目的是爲了在啓動容器時提供一個默認的命令執行選項。若是用戶啓動容器時指定了運行的命令,則會覆蓋掉CMD指定的命令。
CMD會在啓動容器的時候執行,build 時不執行,而RUN只是在構建鏡像的時候執行,後續鏡像構建完成以後,啓動容器就與RUN無關了,這個初學者容易弄混這個概念,這裏簡單註解一下。
閱讀 Dockerfile 文件的意義
閱讀 Dockerfile 文件,能夠幫助咱們瞭解 容器啓動時都作了哪些事情。咱們還能夠根據需求修改啓動參數。
例如,Selenium/hub 的 Dockerfile 文件中定義,超時時間是30秒。
# In seconds, maps to "timeout"
ENV GRID_TIMEOUT 30
若是須要修改這個參數,能夠在啓動 selenium-hub 時修改 GRID_TIMEOUT 參數。
$ sudo docker run -d -P --name selenium-hub -e GRID_TIMEOUT=10 selenium/hub
Dockerfile 文件中仍是其它參數,參考:http://www.docker.org.cn/dockerppt/114.html
2018年10月7日 星期日
12:23
建立鏡像有不少方法,用戶能夠從 Docker Hub 獲取已有鏡像並更新,也能夠利用本地文件系統建立一個。
修改已有的鏡像
查看已有的鏡像:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 2a4cca5ac898 9 days ago 111MB
下面進入到ubuntu容器中:
$ sudo docker run -t -i ubuntu /bin/bash
root@543a324ea841:/#
注意: 記住容器的 ID,稍後還會用到。
在容器中添加 添加 Python3 開發環境。
root@543a324ea841:/# apt update // 更新軟件源
root@543a324ea841:/# apt install python3 // 安裝 python3
root@543a324ea841:/# exit // 退出 Ubuntu 容器
exit
當結束後,咱們使用 exit 來退出,如今咱們的容器已經被咱們改變了,使用 docker commit 命令來提交更新後的副本。
$ sudo docker commit -m "Add python3" -a "Docker Newbee" 543a324ea841 ubuntu
sha256:7c0cf1cc5ef36a86252e94eea39c645f53be7dfda87bdcded6d2999917190ffd
以後是用來建立鏡像的容器的 ID;最後指定目標鏡像的倉庫名。 建立成功後會返回這個鏡像的ID信息。
查看鏡像:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 7c0cf1cc5ef3 About a minute ago 111MB
ubuntu <none> 2a4cca5ac898 9 days ago 111MB
以後,可使用新的鏡像來啓動容器
$ sudo docker run -t -i ubuntu:latest /bin/bash
root@8e40ef590fb1:/#
利用 Dockerfile 來建立鏡像
使用 docker commit 來擴展一個鏡像比較簡單,可是不方便在一個團隊中分享。咱們可使用 docker build 來建立一個新的鏡像。爲此,首先須要建立一個Dockerfile,包含一些如何建立鏡像的指令。
新建一個目錄和一個 Dockerfile
$ mkdir py
$ cd py
py$ touch Dockerfile
Dockerfile 中每一條指令都建立鏡像的一層,例如:
$ vim Dockerfile
# this is a comment
FROM ubuntu:16.04
MAINTAINER Docker py <pyuser@docker.com>
RUN apt-get install -y python3
RUN apt-get install -y python3-pip
RUN python3 -m pip install selenium
Dockerfile 基本的語法是
編寫完成 Dockerfile 後可使用 docker build 來生成鏡像。
sudo docker build -f Dockerfile -t ubuntu-py:v1 .
能夠看到build 進程在執行操做。它要作的第一件事情就是上傳這個 Dockerfile 內容,由於全部的操做都要依據 Dockerfile 來進行。 而後, Dockfile 中的指令被一條一條的執行。每一步都建立了一個新的容器,在容器中執行指令並提交修改(就跟以前介紹過的docker commit同樣)。當全部的指令都執行完畢以後,返回了最終的鏡像 id。全部的中間步驟所產生的容器都被刪除和清理了。
2018年10月7日 星期日
12:23
Docker Compose 是 Docker 官方編排(Orchestration)項目之一, 負責快速在集羣中部署分佈式應用。
Dockerfile 可讓用戶管理一個單獨的應用容器;而 Compose 則容許用戶在一個模板(YAML 格式)中定義一組相關聯的應用容器(被稱爲一個 project,即項目),例如一個Web服務容器再加上後端的數據庫服務容器等。
安裝
該項目由 Python 編寫,實際上調用了 Docker 提供的 API 來實現。 經過pip安裝。
$ python3 -m pip install docker-compose
安裝成功後,能夠查看docker-compose命令的用法。
$ docker-compose
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name (default: directory name)
--verbose Show more output
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
……
建立 Flask 應用
建立使用Flask web應用,並將數值記入Redis。
1、建立 Web 應用
建立一個Flask web 應用,app.py 文件:
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello World! I have been seen %s times.' % redis.get('hits')
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
建立依賴文件 requirements.txt, 內容以下:
flask
redis
2、建立 Dockerfile
在同一目錄下,建立 Dockerfile。
FROM python:3.5
ADD . /code
WORKDIR /code
RUN python3 -m pip install -r requirements.txt
CMD python3 app.py
對上面的Dockerfile作一下簡單說明:
3、建立編排腳本
在同一目錄下,建立 docker-compose.yml
version: '1'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- redis
redis:
image: redis
對上面的編排腳本作一下簡單說明:
全部文件都已經準備就緒。
$ ls
app.py docker-compose.yml Dockerfile requirements.txt
4、啓動應用
docker-compose執行編排腳本,分別製做和抓取web,redis鏡像,啓動容器。
$ sudo docker-compose up
……
redis_1 | 1:M 02 Feb 04:13:15.129 * Ready to accept connections
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1 | * Restarting with stat
web_1 | * Debugger is active!
web_1 | * Debugger PIN: 170-376-971
整個過程會比較漫長。。。
5、訪問應用
打開瀏覽器方位: http://0.0.0.0:5000/
效果以下:
來自 <http://www.testclass.net/docker/10-compose/>
2018年10月7日 星期日
12:24
wordpress是最多見博客系統,通常部署須要LAMP/WAMP環境,這介紹經過Docker compose對它進行編排和部署。
Docker Hub地址: https://hub.docker.com/_/wordpress/
wordpress 應用部署
1、 創建一個應用的目錄
$ mkdir wordpress
$ cd wordpress
2、建立 docker-compose.yml
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8081:80
environment:
WORDPRESS_DB_PASSWORD: pw123
mysql:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: pw123
3、啓動應用
docker-compose執行編排腳本,分別製做和抓取web,redis鏡像,啓動容器。
$ sudo docker-compose up
……
Creating wordpress_mysql_1 ... done
Creating wordpress_wordpress_1 ... done
整個過程會比較漫長。。。
5、訪問應用
打開瀏覽器方位: http://0.0.0.0:5081/
進入wordpress安裝配置界面:
2018年10月7日 星期日
12:24
官方文檔:https://docs.docker.com/machine/overview/
可使用Docker Machine作什麼?
什麼是Docker Machine?
Docker Machine是一個工具,可讓你在虛擬主機上安裝Docker Engine,並用docker-machine命令管理主機。你可使用計算機在本地Mac或Windows計算機上,公司網絡,數據中心或雲提供商(如Azure,AWS或Digital Ocean)上建立Docker主機。
使用docker-machine命令,你能夠啓動,檢查,中止和從新啓動託管主機,升級Docker客戶端和守護進程,並配置Docker客戶端與主機通訊。
將機器CLI指向正在運行的託管主機,而且能夠直接在該主機上運行docker命令。例如,運行docker-machine env default指向一個名爲default的主機,按照屏幕上的說明完成env設置,而後運行docker ps,docker run hello-world等等。
Machine是在Docker v1.12以前在Mac或Windows上運行Docker的惟一方法。從測試版和Docker v1.12開始,Docker for Mac和Docker for Windows做爲本地應用程序提供,而且是更新桌面和筆記本電腦上更好的選擇。咱們鼓勵你嘗試這些新的應用程序。 Docker for Mac和Docker for Windows的安裝程序包括Docker Machine和Docker Compose。
若是你不肯定從哪裏開始,請參閱Docker入門,它將指導您完成Docker的簡要端到端教程。
爲何要使用Docker Machine?
Docker Machine使你可以在各類類型的Linux上配置多個遠程Docker主機。
此外,Machine容許你在舊版Mac或Windows系統上運行Docker,如上一主題中所述。
Docker Machine有這兩個普遍的用例。
若是你主要工做不符合新版Docker for Mac和Docker for Windows應用程序要求的較舊的Mac或Windows筆記本電腦或臺式機上,那麼須要在本地運行Docker機器運行Docker Engine。使用Docker Toolbox安裝程序在Mac或Windows上安裝Docker Machine能夠爲本地虛擬機配置Docker Engine,使您可以鏈接它並運行docker命令。
Docker Engine在Linux系統上本地運行。若是你有一個Linux系統做爲你的主系統,而且想要運行docker命令,你只須要下載並安裝Docker Engine。可是,若是你想要在網絡上,雲中甚至本地配置多個Docker主機,須要一種高效的方法,那麼須要Docker Machine。
不管的主系統是Mac,Windows仍是Linux,均可以在其上安裝Docker Machine,並使用docker-machine命令來配置和管理大量的Docker主機。它會自動建立主機,在其上安裝Docker Engine,而後配置Docker客戶端。每一個託管主機(「機器」)是Docker主機和配置的客戶機的組合。
Docker Engine和Docker Machine有什麼區別?
當人們說「Docker」時,他們一般指的是Docker Engine,由Docker守護進程組成的 客戶端-服務器 應用程序,指定與守護進程交互的接口的REST API,以及與守護進程交談的命令行界面(CLI) (經過REST API包裝)。 Docker Engine接受來自CLI的docker命令,如 docker run <image>,docker ps列出正在運行的容器,docker image ls列出鏡像等等。
Docker Machine是一個配置和管理Docker化主機的工具(Docker Engine上的主機)。一般,在本地系統上安裝Docker Machine。 Docker Machine擁有本身的命令行客戶端docker-machine和Docker Engine客戶端 docker。 你可使用Machine在一個或多個虛擬系統上安裝Docker Engine。這些虛擬系統能夠是本地的(例如當你使用計算機在Mac或Windows上的VirtualBox上安裝和運行Docker引擎)或遠程(如使用計算機在雲提供程序上配置Docker化主機時)。Docker化主機自己能夠被認爲是有時被稱爲管理的「Machine」。
2018年10月7日 星期日
12:25
在macOS和Windows上,當你安裝Docker for Mac,Docker for Windows或Docker Toolbox時,Machine將與其餘Docker產品一塊兒安裝。
若是你只須要Docker Machine,則能夠按照下一節中的說明直接安裝Machine二進制文件。 你能夠在GitHub上的docker/machine release 頁面上找到最新版本的二進制文件。
直接安裝
1、安裝 Docker。
2、下載Docker Machine二進制文件並將其解壓到PATH。
若是你是 macOS 系統,運行:
$ curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && \
chmod +x /usr/local/bin/docker-machine
若是你是 Linux 系統,運行:
$ curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \
sudo install /tmp/docker-machine /usr/local/bin/docker-machine
若是你是 Windows 系統,經過Git BASH 運行:
$ if [[ ! -d "$HOME/bin" ]]; then mkdir -p "$HOME/bin"; fi && \
curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe" && \
chmod +x "$HOME/bin/docker-machine.exe"
注意:只有當你使用像Git BASH這樣的支持Linux命令(如chmod)的終端模擬器時,上面的命令才能在Windows上運行。
3、查看 Machine 版本
$ docker-machine version
docker-machine version 0.13.0, build 9371605
2018年10月7日 星期日
12:25
這一小節演示Machine的基本使用。
以 macOS 系統爲例:
建立一個machine
指令:
$ docker-machine create --driver virtualbox my-machine
Creating CA: /Users/fnngj/.docker/machine/certs/ca.pem
Creating client certificate: /Users/fnngj/.docker/machine/certs/cert.pem
Running pre-create checks...
Creating machine...
(my-machine) Copying /Users/fnngj/.docker/machine/cache/boot2docker.iso to /Users/fnngj/.docker/machine/machines/my-machine/boot2docker.iso...
(my-machine) Creating VirtualBox VM...
(my-machine) Creating SSH key...
(my-machine) Starting the VM...
(my-machine) Check network to re-create if needed...
(my-machine) Found a new host-only adapter: "vboxnet0"
(my-machine) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env my-machine
查看machine列表
指令:
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
my-machine - virtualbox Running tcp://192.168.99.100:2376 v18.01.0-ce
能夠看到咱們剛建立的「my-machine」已出如今 machine 的列表當中。
查看 machine 的環境變量的配置信息。
指令:
$ docker-machine env my-machine
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/fnngj/.docker/machine/machines/my-machine"
export DOCKER_MACHINE_NAME="my-machine"
# Run this command to configure your shell:
# eval $(docker-machine env my-machine)
鏈接到machine的shell。
指令:
$ eval "$(docker-machine env my-machine)"
若是沒有任何錯誤提示說明鏈接該 machine 成功了,由於該 machine 已安裝了docker client,因此此時你能夠執行 docker 的相關操做。如查看 Docker 版本指令:
$ docker --version
Docker version 18.01.0-ce, build 03596f5
用 docker run 啓動一個容器驗證前面的安裝和設置沒有問題。
指令:
$ docker run hello-world
獲取指定 machine 的 ip
指令:
$ docker-machine ip my-machine
192.168.99.100
在容器中運行一個頁面服務器(Nginx)
指令:
$ docker run -d -p 8080:80 --name web-server nginx
經過瀏覽器訪問:http://192.168.99.100:8080
訪問上面獲取到的 ip 和映射的端口號組成的網址,這裏是192.168.99.100:8080
指令:
$ curl $(docker-machine ip my-machine):8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
經過一樣的方法你能夠建立和管理不少運行着 Docker 的本地 Machine(VMs);只需運行「docker-machine create」指令;而運行「docker-machine ls」則能夠顯示全部的 machine 組成的列表。
啓動和中止 machines
中止指令: ··· $ docker-machine stop my-machine ···
啓動指令:
$ docker-machine start my-machine
docker-machine 的指令列表: