一篇文章瞭解_docker

(一)Docker介紹

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能夠運行在不一樣的平臺,用戶能夠輕鬆的將一個應用從一個平臺遷移到另外一個平臺。
  • 節省開支: Docker容器除了運行其中應用外,基本不消耗額外的系統資源,一臺設備能夠運行上千個容器。

Docker基本概念github

 

Docker包括三個基本概念web

  • 鏡像(Image)

Docker提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。鏡像能夠用來建立Docker容器。redis

  • 容器(Container)

容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、 刪除。每一個容器都是相互隔離的、保證安全的平臺。

  • 倉庫(Repository)

倉庫是集中存放鏡像文件的場所。倉庫分爲公開倉庫(Public)和私有倉庫(Private) 兩種形式。

最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。 中國官方鏡像加速

 

 

(二)Docker安裝(Ubuntu)

2018年10月7日 星期日

12:20

 

官方文檔:https://docs.docker.com/

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

 

 

(三)Docker 鏡像

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

在列出信息中,能夠看到幾個字段信息:

  • 來自於哪一個倉庫,好比 ubuntu
  • 鏡像的標記,好比 14.04
  • 它的 ID 號(惟一)
  • 建立時間
  • 鏡像大小

獲取鏡像

可使用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 新手,咱們先掌握如何使用別人的鏡像,至於建立鏡像放到後面介紹。

 

 

(四)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:/#

  • -t 選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上。
  • -i 則讓容器的標準輸入保持打開。

此時,你已經在ubuntu容器中了。這是一個獨立的ubuntu 系統。經過 root@543a324ea841 標識能夠看出。

當利用docker run 來建立容器時,Docker在後臺運行的標準操做包括:

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  • 利用鏡像建立並啓動一個容器
  • 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
  • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
  • 從地址池配置一個IP地址給容器
  • 執行用戶指定的應用程序
  • 執行完畢後容器被終止

退出容器,可使用exit命令。

root@543a324ea841:/# exit 
exit
fnngj@ubuntu:~$

守護狀態運行

更多的時候,須要讓 Docker容器在後臺以守護態(Daemonized)形式運行。

$ sudo docker run -d ubuntu /bin/echo "hello docker"
839fee657bfe893b9b2c76aebbb2b620efefc091a04fd90b1c5eda82b9e36730

  • -d 表示容器以守護態(Daemonized)形式運行。

查看容器

經過 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 。

 

 

(五)Docker 倉庫

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

 

 

 

(六) 建立Nginx容器

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

  • -name 指定啓動容器的名稱爲 some-nginx。
  • -d 讓Docker容器在後臺以守護態(Daemonized)形式運行。
  • -d 將容器的80端口映射到主機的8080端口
  • registry.docker-cn.com/library/nginx 爲啓動容器的鏡像。

訪問Nginx服務器

 

處理過程: 瀏覽器 –> ubuntu(8080) –> Nginx容器(80)

 

備註:這裏只是介紹如何把一個Nginx容器運行起來,而後,Nginx自己只是一箇中間件,經過它來運行不一樣的Web項目纔會真的有價值。

 

 

(七) 建立docker selenium容器

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

  • -d 表示容器以守護態(Daemonized)形式運行。
  • -P 表示 Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口。

五、啓動分支node chrome 容器

$ sudo docker run -d --link selenium-hub:hub selenium/node-chrome

  • –link 經過 link 關聯 selenium-hub 容器,併爲其設置了別名hub

六、查看容器

$ 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...

三、查看截圖

 

百度頁面是被渲染出來了,但中文有亂碼。

 

 

(八)Docker Dockerfile

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"]

  • FROM

Dockerfile 都必須以 FROM 命令開始。 FROM命令會指定鏡像基於哪一個基礎鏡像建立,接下來的命令也會基於這個基礎鏡像。

  • USER

指定運行容器時的用戶名或 UID,後續的RUN、CMD、ENTRYPOINT也會使用指定用戶。

  • EXPOSE

告訴 Docker 服務端容器對外映射的本地端口,須要在 docker run 的時候使用-p或者-P選項生效。

  • ENV

指定一個環節變量,會被後續 RUN 指令使用,並在容器運行時保留。

  • CMD

CMD 有三種使用方式:

  • CMD 「executable」,「param1」,「param2」
  • CMD 「param1」,「param2」
  • CMD command param1 param2 (shell form)

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

 

 

(九)建立 Docker 鏡像

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

  • -m 來指定提交的說明信息,跟咱們使用的版本控制工具同樣;
  • -a 能夠指定更新的用戶信息;

以後是用來建立鏡像的容器的 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 基本的語法是

  • 使用 # 來註釋
  • FROM 指令告訴 Docker 使用哪一個鏡像做爲基礎
  • 接着是維護者的信息
  • RUN 開頭的指令會在建立中運行,好比安裝一個軟件包,在這裏使用apt 來安裝了一些軟件

編寫完成 Dockerfile 後可使用 docker build 來生成鏡像。

sudo docker build -f Dockerfile -t ubuntu-py:v1 .

  • -t標記來添加 tag,指定新的鏡像的用戶信息。
  • 「.」 是 Dockerfile 所在的路徑(當前目錄),也能夠替換爲一個具體的 Dockerfile 的路徑

能夠看到build 進程在執行操做。它要作的第一件事情就是上傳這個 Dockerfile 內容,由於全部的操做都要依據 Dockerfile 來進行。 而後, Dockfile 中的指令被一條一條的執行。每一步都建立了一個新的容器,在容器中執行指令並提交修改(就跟以前介紹過的docker commit同樣)。當全部的指令都執行完畢以後,返回了最終的鏡像 id。全部的中間步驟所產生的容器都被刪除和清理了。

 

 

(十)Docker Compose安裝與建立Flask web應用

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作一下簡單說明:

  • 容器使用Python 3.5的鏡像
  • 將當前目錄下文件拷貝到容器內/code
  • 指定工做目錄爲/code
  • 安裝python須要的庫:flask, redis
  • 容器執行命令 python3 app.py

3、建立編排腳本

在同一目錄下,建立 docker-compose.yml

version: '1'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
    depends_on:
     - redis
  redis:
    image: redis

對上面的編排腳本作一下簡單說明:

  • 這個應用定義了兩個服務:web, redis
  • web容器經過當前路徑下的Dockerfile生成
  • web容器內的5000端口映射到主機的5000端口
  • 將當前目錄掛載到web容器內/code
  • web容器依賴於redis容器
  • redis容器從Docker Hub獲取鏡像

全部文件都已經準備就緒。

$ 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/>

 

 

 

(十一)Docker Compose建立Wordpress應用

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

  • images 鏡像名
  • restart 指定版本
  • ports 80爲鏡像端口, 映射的8081爲主機端口。
  • environment 環境配置,例,WORDPRESS_DB_PASSWORD 爲wordpress數據庫密碼。

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安裝配置界面:

 

 

 

 

(十二)Docker Machine介紹

2018年10月7日 星期日

12:24

 

官方文檔:https://docs.docker.com/machine/overview/

可使用Docker Machine作什麼?

  • 在Mac或Windows上安裝並運行Docker
  • 配置和管理多個遠程Docker主機
  • 提供Swarm集羣

什麼是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有這兩個普遍的用例。

  • 你有一個較舊的桌面系統,並但願在Mac或Windows上運行Docker

 

若是你主要工做不符合新版Docker for Mac和Docker for Windows應用程序要求的較舊的Mac或Windows筆記本電腦或臺式機上,那麼須要在本地運行Docker機器運行Docker Engine。使用Docker Toolbox安裝程序在Mac或Windows上安裝Docker Machine能夠爲本地虛擬機配置Docker Engine,使您可以鏈接它並運行docker命令。

  • 我想在遠程系統上配置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」。

 

 

 

(十三)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

 

 

 

 

(十四)Docker Machine基本使用

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 的指令列表:

    • docker-machine config
    • docker-machine env
    • docker-machine inspect
    • docker-machine ip
    • docker-machine kill
    • docker-machine provision
    • docker-machine regenerate-certs
    • docker-machine restart
    • docker-machine ssh
    • docker-machine start
    • docker-machine status
    • docker-machine stop
    • docker-machine upgrade
    • docker-machine url
相關文章
相關標籤/搜索