具體安裝步驟請參考阿里雲docker安裝html
Docker 是一個開源的應用容器引擎,基於 Go 語言 並聽從Apache2.0協議開源。java
Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。python
容器是徹底使用沙箱機制,相互之間不會有任何接口(相似 iPhone 的 app),更重要的是容器性能開銷極低。mysql
Docker 從 17.03 版本以後分爲 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版),咱們用社區版就能夠了。nginx
Web 應用的自動化打包和發佈。git
自動化測試和持續集成、發佈。redis
在服務型環境中部署和調整數據庫或其餘的後臺應用。sql
從頭編譯或者擴展示有的OpenShift或Cloud Foundry平臺來搭建本身的PaaS環境。docker
容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。shell
具體說來,Docker 在以下幾個方面具備較大的優點。
3.1 更快速的交付和部署
對開發和運維(devop)人員來講,最但願的就是一次建立或配置,能夠在任意地方正常運行。
開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。 Docker 能夠快速建立容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。
3.2 更高效的虛擬化
Docker 容器的運行不須要額外的 hypervisor 支持,它是內核級的虛擬化,所以能夠實現更高的性能和效率。
3.3 更輕鬆的遷移和擴展
Docker 容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。 這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。
3.4 更簡單的管理
使用 Docker,只須要小小的修改,就能夠替代以往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。
從下圖能夠看出,VM是一個運行在宿主機之上的完整的操做系統,VM運行自身操做系統會佔用較多的CPU、內存、硬盤資源。Docker不一樣於VM,只包含應用程序以及依賴庫,基於libcontainer運行在宿主機上,並處於一個隔離的環境中,這使得Docker更加輕量高效,啓動容器只需幾秒鐘以內完成。因爲Docker輕量、資源佔用少,使得Docker能夠輕易的應用到構建標準化的應用中。但Docker目前還不夠完善,好比隔離效果不如VM,共享宿主機操做系統的一些基礎庫等;網絡配置功能相對簡單,主要以橋接方式爲主;查看日誌也不夠方便靈活。
Docker 在容器的基礎上,進行了進一步的封裝,從文件系統、網絡互聯到進程隔離等等,極大的簡化了容器的建立和維護。使得 Docker 技術比虛擬機技術更爲輕便、快捷。
做爲一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具備衆多的優點。Docker 容器的啓動能夠在秒級實現,這相比傳統的虛擬機方式要快得多;Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器。
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和建立Docker容器。
Docker 容器經過 Docker 鏡像來建立。
容器與鏡像的關係相似於面向對象編程中的對象與類。
Docker 鏡像(Images) | Docker 鏡像是用於建立 Docker 容器的模板。 |
---|---|
Docker 容器(Container) | 容器是獨立運行的一個或一組應用。 |
Docker 客戶端(Client) | Docker 客戶端經過命令行或者其餘工具使用 Docker API (docs.docker.com/reference/a…) 與 Docker 的守護進程通訊。 |
Docker 主機(Host) | 一個物理或者虛擬的機器用於執行 Docker 守護進程和容器。 |
Docker 倉庫(Registry) | Docker 倉庫用來保存鏡像,能夠理解爲代碼控制中的代碼倉庫。Docker Hub(hub.docker.com) 提供了龐大的鏡像集合供使用。 |
Docker Machine | Docker Machine是一個簡化Docker安裝的命令行工具,經過一個簡單的命令行便可在相應的平臺上安裝Docker,好比VirtualBox、 Digital Ocean、Microsoft Azure。 |
Dockerfile由一行行命令語句組成,而且支持以#開頭的註釋行。
通常的,Dockerfile分爲四部分:基礎鏡像信息,維護者信息,鏡像操做指令和容器啓動時執行指令。
dockerfile能夠說是docker學習部分的精華所在。我這裏總結的dockerfile的命令,具體操做能夠參照docker hub
指令的通常格式爲 INSTRUCTION arguments,指令包括 FROM、MAINTAINER、RUN 等。
格式爲 FROM 或FROM
:。
第一條指令必須爲 FROM 指令。而且,若是在同一個Dockerfile中建立多個鏡像時,可使用多個 FROM 指令(每一個鏡像一次)。
MAINTAINER
格式爲 MAINTAINER ,指定維護者信息。
格式爲 RUN 或 RUN ["executable", "param1", "param2"]。
前者將在 shell 終端中運行命令,即 /bin/sh -c;後者則使用 exec 執行。指定使用其它終端能夠經過第二種方式實現,例如 RUN ["/bin/bash", "-c", "echo hello"]。
每條 RUN 指令將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像。當命令較長時可使用 \ 來換行。
支持三種格式
CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
CMD command param1 param2 在 /bin/sh 中執行,提供給須要交互的應用;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數;
指定啓動容器時執行的命令,每一個 Dockerfile 只能有一條 CMD 命令。若是指定了多條命令,只有最後一條會被執行。
若是用戶啓動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。
格式爲 EXPOSE [...]。
告訴 Docker 服務端容器暴露的端口號,供互聯繫統使用。在啓動容器時須要經過 -P,Docker 主機會自動分配一個端口轉發到指定的端口。
格式爲 ENV 。 指定一個環境變量,會被後續 RUN 指令使用,並在容器運行時保持。
例如
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL example.com/postgres-$P… | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-PATH
格式爲 ADD 。
該命令將複製指定的 到容器中的 。 其中 能夠是Dockerfile所在目錄的一個相對路徑;也能夠是一個 URL;還能夠是一個 tar 文件(自動解壓爲目錄)。
格式爲 COPY 。
複製本地主機的 (爲 Dockerfile 所在目錄的相對路徑)到容器中的 。
當使用本地目錄爲源目錄時,推薦使用 COPY。
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啓動後執行的命令,而且不可被 docker run 提供的參數覆蓋。
每一個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
格式爲 VOLUME ["/data"]。
建立一個能夠從本地主機或其餘容器掛載的掛載點,通常用來存放數據庫和須要保持的數據等。
格式爲 USER daemon。
指定運行容器時的用戶名或 UID,後續的 RUN 也會使用指定用戶。
當服務不須要管理員權限時,能夠經過該命令指定運行用戶。而且能夠在以前建立所須要的用戶,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時獲取管理員權限可使用 gosu,而不推薦 sudo。
格式爲 WORKDIR /path/to/workdir。
爲後續的 RUN、CMD、ENTRYPOINT 指令配置工做目錄。
可使用多個 WORKDIR 指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑。例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終路徑爲 /a/b/c。
格式爲 ONBUILD [INSTRUCTION]。
配置當所建立的鏡像做爲其它新建立鏡像的基礎鏡像時,所執行的操做指令。
例如,Dockerfile 使用以下的內容建立了鏡像 image-A。
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
若是基於 image-A 建立新的鏡像時,新的Dockerfile中使用 FROM image-A指定基礎鏡像時,會自動執行ONBUILD 指令內容,等價於在後面添加了兩條指令。
FROM image-A
Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的鏡像,推薦在標籤中註明,例如 ruby:1.9-onbuild。
systemctl start docker
systemctl stauts docker
systemctl restart docker
systemctl stop docker
複製代碼
docker search image_name
複製代碼
docker pull image_name:版本
複製代碼
Docker鏡像保存在/var/lib/docker目錄下:
docker images
複製代碼
執行docker pull centos會將Centos這個倉庫下面的全部鏡像下載到本地repository。
docker rmi docker.io/tomcat:7.0.77-jre7
或者 docker rmi b39c68b7af30
複製代碼
登錄到一個Docker鏡像倉庫,若是未指定鏡像倉庫地址,默認爲官方倉庫 Docker Hub
登出一個Docker鏡像倉庫,若是未指定鏡像倉庫地址,默認爲官方倉庫 Docker Hub
語法
docker login [OPTIONS] [SERVER]
docker logout [OPTIONS] [SERVER]
複製代碼
OPTIONS說明:
實例
登錄到Docker Hub
docker login -u 用戶名 -p 密碼
複製代碼
登出Docker Hub
docker logout
複製代碼
將本地的鏡像上傳到鏡像倉庫,要先登錄到鏡像倉庫
語法
docker push [OPTIONS] NAME[:TAG]
複製代碼
OPTIONS說明:
實例
上傳本地鏡像myapache:v1到鏡像倉庫中。
docker push myapache:v1
複製代碼
docker ps
複製代碼
docker ps -a
複製代碼
docker run :建立一個新的容器並運行一個命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
複製代碼
OPTIONS說明:
使用docker鏡像nginx:latest之後臺模式啓動一個容器,並將容器命名爲mynginx。
docker run --name mynginx -d nginx:latest
複製代碼
docker create :建立一個新的容器但不啓動它
用法同 docker run
語法
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
複製代碼
docker start container_name/container_id
docker stop container_name/container_id
docker restart container_name/container_id
複製代碼
docker kill :殺掉一個運行中的容器。
docker kill [OPTIONS] CONTAINER [CONTAINER...]
複製代碼
後臺啓動一個容器後,若是想進入到這個容器,可使用attach命令:
docker attach container_name/container_id
複製代碼
docker rm container_name/container_id
複製代碼
docker pause :暫停容器中全部的進程。
docker unpause :恢復容器中全部的進程。
語法
docker pause [OPTIONS] CONTAINER [CONTAINER...]
docker unpause [OPTIONS] CONTAINER [CONTAINER...]
複製代碼
實例
暫停數據庫容器db01提供服務。
docker pause db01
複製代碼
恢復數據庫容器db01提供服務。
docker unpause db01
複製代碼
**docker exec :**在運行的容器中執行命令
語法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
複製代碼
OPTIONS說明:
實例
在容器 mynginx 中以交互模式執行容器內 /root/runoob.sh 腳本:
runoob@runoob:~$ docker exec -it mynginx
/bin/sh /root/runoob.shhttp://www.runoob.com/
複製代碼
在容器 mynginx 中開啓一個交互模式的終端:
runoob@runoob:~$ docker exec -i -t
mynginx /bin/bashroot@b1a0703e41e7:/#
複製代碼
info|version
查看當前系統Docker信息
docker info
複製代碼
顯示 Docker 版本信息
docker version :顯示 Docker 版本信息。
語法
docker version [OPTIONS]
複製代碼
OPTIONS說明:
**docker commit :**從容器建立一個新的鏡像。
語法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
複製代碼
OPTIONS說明:
實例
將容器a404c6c174a2 保存爲新的鏡像,並添加提交人信息和說明信息。
runoob@runoob:~$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
runoob@runoob:~$ docker images mymysql:v1
REPOSITORY TAG IMAGE ID CREATED SIZEmy
mysql v1 37af1236adef 15 seconds ago 329 MB
複製代碼
docker cp :用於容器與主機之間的數據拷貝。
語法
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH- CONTAINER:DEST_PATH
複製代碼
OPTIONS說明:
**docker cp :**用於容器與主機之間的數據拷貝。
檢查容器裏文件結構
docker diff : 檢查容器裏文件結構的更改。
語法
docker diff [OPTIONS] CONTAINER
複製代碼
docker images : 列出本地鏡像。
語法
docker images [OPTIONS] [REPOSITORY[:TAG]]
複製代碼
OPTIONS說明:
docker rmi : 刪除本地一個或多少鏡像。
語法
docker rmi [OPTIONS] IMAGE [IMAGE...]
複製代碼
OPTIONS說明:
docker import : 從歸檔文件中建立鏡像。
語法
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
複製代碼
OPTIONS說明:
docker save : 將指定鏡像保存成 tar 歸檔文件。
語法
docker save [OPTIONS] IMAGE [IMAGE...]
複製代碼
OPTIONS 說明:
docker load : 導入使用 docker save 命令導出的鏡像。
語法
docker load [OPTIONS]
複製代碼
OPTIONS 說明:
這些都是我平時有用到的容器,能夠參考一下,出現問題能夠留言互相學習
這裏使用Elasticsearch的版本是6.4.3,同時使用kibana可視化工具使用,對elasticsearch-head感興趣的能夠download使用
docker pull elasticsearch:6.4.3
docker pull mobz/elasticsearch-head:5
docker pull kibana:6.4.3
複製代碼
docker run -it --name elasticsearch -d -p 9200:9200 -p 9300:9300 -p 5601:5601 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" elasticsearch:6.4.3
複製代碼
注意事項
kibana的container共用elasticsearch的網絡
elasticsearch服務有跨域問題,致使elasticsearch-head沒法鏈接到ES,所以須要進入ES容器修改配置
docker exec -it elasticsearch /bin/bash
vi config/elasticsearch.yml
加入跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
複製代碼
退出容器:exit
docker restart elasticsearch
docker run -it -d -e ELASTICSEARCH_URL=http://ip:9200 --name kibana --network=container:elasticsearch kibana:6.4.3
複製代碼
docker run -it --name elasticsearch-head -d -p 9100:9100 docker.io/mobz/elasticsearch-head:5
複製代碼
docker run -d -p 6379:6379 --name 自定義名字 鏡像id
複製代碼
docker run -d -p 5672:5672 -p 15672:15672 --name 自定義名字 鏡像id
複製代碼
docker run -p 3306:3306 --name mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
複製代碼
命令說明:
-p 12345:3306:將主機的12345端口映射到docker容器的3306端口。
--name mysql:運行服務名字
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d :將主機/zzyyuse/mysql錄下的conf/my.cnf 掛載到容器的 /etc/mysql/conf.d
-v /zzyyuse/mysql/logs:/logs:將主機/zzyyuse/mysql目錄下的 logs 目錄掛載到容器的 /logs。
-v /zzyyuse/mysql/data:/var/lib/mysql :將主機/zzyyuse/mysql目錄下的data目錄掛載到容器的 /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用戶的密碼。
-d mysql:5.6 : 後臺程序運行mysql5.6
docker exec -it MySQL運行成功後的容器ID /bin/bash
複製代碼
或者
#啓動
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Lzslov123! -d mysql
#進入容器
docker exec -it mysql bash
#登陸mysql
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Lzslov123!';
#添加遠程登陸用戶
CREATE USER 'liaozesong'@'%' IDENTIFIED WITH mysql_native_password BY 'Lzslov123!';
GRANT ALL PRIVILEGES ON *.* TO 'liaozesong'@'%';
複製代碼
數據備份小測試(能夠不作)
docker exec myql服務容器ID sh -c ' exec mysqldump --all-databases -uroot -p"123456" ' > /zzyyuse/all-databases.sql
docker run --name 容器名稱 -p 8081:80 -d nginx
複製代碼
建立目錄 nginx, 用於存放後面的相關東西。
mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf
複製代碼
拷貝容器內 Nginx 默認配置文件到本地當前目錄下的 conf 目錄,容器 ID 能夠查看 docker ps 命令輸入中的第一列:
docker cp 6dd4380ba708:/etc/nginx/nginx.conf ~/nginx/conf
複製代碼
部署命令
$ docker run -d -p 8082:80 --name 容器名稱
-v ~/nginx/www:/usr/share/nginx/html
-v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v ~/nginx/logs:/var/log/nginx nginx
複製代碼
啓動以上命令後進入 ~/nginx/www 目錄:
cd ~/nginx/www
複製代碼
建立 index.html 文件,內容以下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>hello world</h1>
</body>
</html>
複製代碼
docker run -d -p 8082:80 --name nginx-8082 -v /usr/local/nginx/www:/usr/share/nginx/html -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/nginx/logs:/var/log/nginx nginx
複製代碼
使用docker鏡像構建tracker容器(跟蹤服務器,起到調度的做用)
docker run -d --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
複製代碼
使用docker鏡像構建storage容器(存儲服務器,提供容量和備份服務)
docker run -d --network=host --name storage -e TRACKER_SERVER=134.175.30.90:22122 -v /var/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage
複製代碼
docker run -d --network=host --name storage -e TRACKER_SERVER=172.16.102.58:22122 -v /var/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage
上傳一個文件
[root@VM_0_13_centos fdfs]# vi a.txt
[root@VM_0_13_centos fdfs]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf a.txt
group1/M00/00/00/rBAADVzgLcCALwIQAAAADfGNUoI054.txt
[root@VM_0_13_centos fdfs]#
複製代碼