特性 | 容器 | 虛擬機 |
---|---|---|
啓動 | 秒級 | 分鐘級 |
硬盤使用 | 通常爲 MB | 通常爲 GB |
性能 | 接近原生 | 弱於 |
系統支持量 | 單機支持上千個容器 | 通常幾十個 |
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程 API 來管理和建立 Docker 容器。html
Docker 容器經過 Docker 鏡像來建立。mysql
容器與鏡像的關係相似於面向對象編程中的對象與類。linux
Docker | 面向對象 |
---|---|
容器 | 對象 |
鏡像 | 類 |
名詞 | 說明 |
---|---|
鏡像(Images) | Docker 鏡像是用於建立 Docker 容器的模板。 |
容器(Container) | 容器是獨立運行的一個或一組應用。 |
客戶端(Client) | Docker 客戶端經過命令行或者其餘工具使用 Docker API (docs.docker.com/reference/a…) 與 Docker 的守護進程通訊。 |
主機(Host) | 一個物理或者虛擬的機器用於執行 Docker 守護進程和容器。 |
倉庫(Registry) | Docker 倉庫用來保存鏡像,能夠理解爲代碼控制中的代碼倉庫。Docker Hub(hub.docker.com) 提供了龐大的鏡像集合供使用。 |
Docker Machine | Docker Machine是一個簡化Docker安裝的命令行工具,經過一個簡單的命令行便可在相應的平臺上安裝Docker,好比VirtualBox、 Digital Ocean、Microsoft Azure。 |
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
複製代碼
sudo systemctl enable docker
sudo systemctl start docker
複製代碼
/etc/docker/daemon.json
中寫入以下內容(若是文件不存在請新建該文件){
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
複製代碼
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
複製代碼
Registry Mirrors:
https://registry.docker-cn.com/
複製代碼
yum list installed | grep docker
複製代碼
yum -y remove 上面列出來的包
複製代碼
以前提到過,Docker Hub 上有大量的高質量的鏡像能夠用,這裏咱們就說一下怎麼獲取這些鏡像。nginx
從 Docker 鏡像倉庫獲取鏡像的命令是 docker pull。其命令格式爲:git
docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標籤]github
具體的選項能夠經過 docker pull --help 命令看到,這裏咱們說一下鏡像名稱的格式。web
docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
bf5d46315322: Pull complete
9f13e0ac480c: Pull complete
e8988b5b3097: Pull complete
40af181810e7: Pull complete
e6f7c7e5c03e: Pull complete
Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe
Status: Downloaded newer image for ubuntu:16.04
複製代碼
上面的命令中沒有給出 Docker 鏡像倉庫地址,所以將會從 Docker Hub 獲取鏡像。而鏡像名稱是 ubuntu:16.04,所以將會獲取官方鏡像 library/ubuntu 倉庫中標籤爲 16.04 的鏡像。sql
從下載過程當中能夠看到咱們以前說起的分層存儲的概念,鏡像是由多層存儲所構成。下載也是一層層的去下載,並不是單一文件。下載過程當中給出了每一層的 ID 的前 12 位。而且下載結束後,給出該鏡像完整的 sha256 的摘要,以確保下載一致性。docker
在使用上面命令的時候,你可能會發現,你所看到的層 ID 以及 sha256 的摘要和這裏的不同。這是由於官方鏡像是一直在維護的,有任何新的 bug,或者版本更新,都會進行修復再以原來的標籤發佈,這樣能夠確保任何使用這個標籤的用戶能夠得到更安全、更穩定的鏡像。shell
要想列出已經下載下來的鏡像,有兩個命令。
docker images
複製代碼
或者
docker image ls
複製代碼
結果以下
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 2a697363a870 38 hours ago 119MB
tomcat latest 27600aa3d7f1 8 days ago 463MB
ubuntu <none> a3551444fc85 2 weeks ago 119MB
複製代碼
列表包含了 倉庫名、標籤、鏡像 ID、建立時間 以及 所佔用的空間。
若是仔細觀察,會注意到,這裏標識的所佔用空間和在 Docker Hub 上看到的鏡像大小不一樣。好比,ubuntu:16.04 鏡像大小,在這裏是 127 MB,可是在 Docker Hub 顯示的倒是 50 MB。這是由於 Docker Hub 中顯示的體積是壓縮後的體積。在鏡像下載和上傳過程當中鏡像是保持着壓縮狀態的,所以 Docker Hub 所顯示的大小是網絡傳輸中更關心的流量大小。而 docker image ls 顯示的是鏡像下載到本地後,展開的大小,準確說,是展開後的各層所佔空間的總和,由於鏡像到本地後,查看空間的時候,更關心的是本地磁盤空間佔用的大小。
另一個須要注意的問題是,docker image ls 列表中的鏡像體積總和並不是是全部鏡像實際硬盤消耗。因爲 Docker 鏡像是多層存儲結構,而且能夠繼承、複用,所以不一樣鏡像可能會由於使用相同的基礎鏡像,從而擁有共同的層。因爲 Docker 使用 Union FS,相同的層只須要保存一份便可,所以實際鏡像硬盤佔用空間極可能要比這個列表鏡像大小的總和要小的多。
你能夠經過如下命令來便捷的查看鏡像、容器、數據卷所佔用的空間。
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 1 700.2MB 237.5MB (33%)
Containers 2 0 65.95kB 65.95kB (100%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
複製代碼
上面的鏡像列表中,還能夠看到一個特殊的鏡像,這個鏡像標籤爲 none
ubuntu <none> a3551444fc85 2 weeks ago 119MB
複製代碼
這個鏡像本來是有鏡像名和標籤的, 鏡像發佈新版本後,從新docker pull
的時候, 這個鏡像名被轉移到了新下載的鏡像身上, 而舊的鏡像上的這個名稱則被取消,從而成爲了 。除了 docker pull 可能致使這種狀況,docker build 也一樣能夠致使這種現象。因爲新舊鏡像同名,舊鏡像名稱被取消,從而出現倉庫名、標籤均爲 的鏡像。這類無標籤鏡像也被稱爲 虛懸鏡像(dangling image) ,能夠用下面的命令專門顯示這類鏡像:
docker images -f dangling=true
複製代碼
爲了加速鏡像構建、重複利用資源,Docker 會利用 中間層鏡像。因此在使用一段時間後,可能會看到一些依賴的中間層鏡像。默認的 docker image ls 列表中只會顯示頂層鏡像,若是但願顯示包括中間層鏡像在內的全部鏡像的話,須要加 -a 參數。
docker images -a
複製代碼
不加任何參數的狀況下,docker images 會列出全部頂級鏡像,可是有時候咱們只但願列出部分鏡像。docker image ls 有好幾個參數能夠幫助作到這個事情。
docker images ubuntu
ubuntu 16.04 2a697363a870 38 hours ago 119MB
ubuntu <none> a3551444fc85 2 weeks ago 119MB
複製代碼
docker images ubuntu:16.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 2a697363a870 38 hours ago 119MB
複製代碼
若是要刪除本地的一個鏡像,可使用 docker image rm 命令,其格式爲:
docker image rm [選項] <鏡像1> [<鏡像2> ...]
複製代碼
或者
docker rmi [選項] <鏡像1> [<鏡像2> ...]
複製代碼
docker image prune
複製代碼
其中,<鏡像> 能夠是 鏡像短 ID、鏡像長 ID、鏡像名 或者 鏡像摘要。<>
表明必須參數,[]
表明可選參數
Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,所以每一條指令的內容,就是描述該層應當如何構建。
這裏以定製 tomcat 鏡像爲例,咱們使用 Dockerfile 來定製本身的tomcat
docker run -p 8080:8080 tomcat
複製代碼
docker exec -it f208e826caf2 bash
複製代碼
cd webapps/ROOT
echo "hello docker tomcat" >> index.jsp
複製代碼
以上咱們對原來的tomcat容器作了修改,但沒有更改鏡像,致使每次啓動一個容器,都要進入容器進行修改。若是直接修改鏡像,那麼只會跑起來的容器都不在須要一一修改。
如今建立一個Dockerfile 文件來構建咱們本身的鏡像
cd /usr/local
mkdir -p docker/mytomcat
cd docker/mytomcat
複製代碼
vi Dockerfile
複製代碼
FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -rf *
RUN echo "hello docker tomcat" > /usr/local/tomcat/webapps/ROOT/index.html
複製代碼
FROM tomcat: 選定基礎鏡像爲tomcat WORKDIR /usr/local/tomcat/webapps/ROOT/:指定工做目錄,進入到這個目錄 RUN rm -rf * : 刪除當前目錄全部文件 RUN echo "hello docker tomcat" > /usr/local/tomcat/webapps/ROOT/index.html: 寫入一個index.html文件到當前目錄
docker build -t mytomcat .
複製代碼
mytomcat
爲你要構建的鏡像的標籤名 .
表示當前目錄。
好了,如今已經構建好咱們本身的tomcat鏡像了。運行起來
docker run -p 8080:8080 mytomcat
複製代碼
功能爲運行指定的命令
RUN命令有兩種格式
在linux操做系統上默認 /bin/sh -c
在windows操做系統上默認 cmd /S /C
第二種是相似於函數調用。
可將executable理解成爲可執行文件,後面就是兩個參數。
兩種寫法比對:
RUN /bin/bash -c 'source HOME RUN ["/bin/bash", "-c", "echo hello"] 注意:多行命令不要寫多個RUN,緣由是Dockerfile中每個指令都會創建一層.
多少個RUN就構建了多少層鏡像,會形成鏡像的臃腫、多層,不只僅增長了構件部署的時間,還容易出錯。
RUN書寫時的換行符是\
看這個名字就知道,又是一個複製命令
語法以下:
COPY的只能是本地文件,其餘用法一致
一個複製命令,把文件複製到景象中。
若是把虛擬機與容器想象成兩臺linux服務器的話,那麼這個命令就相似於scp,只是scp須要加用戶名和密碼的權限驗證,而ADD不用。
語法以下:
路徑的填寫能夠是容器內的絕對路徑,也能夠是相對於工做目錄的相對路徑
能夠是一個本地文件或者是一個本地壓縮文件,還能夠是一個url
若是把寫成一個url,那麼ADD就相似於wget命令
若是把的文件是個tar.gz包, 發送以後就會自動解壓縮。
docker run -p 8081:8080 tomcat
複製代碼
run:啓動一個容器,啓動一個容器即啓動了一個進程
-p: 指定端口, 第一個參數爲宿主機的端口,第二個參數爲docker容器的端口。意思是把宿主機8081端口映射到容器中的8080端口上, 咱們直接訪問宿主機的8081端口就能直接訪問到8080
tomcat:鏡像名
也就是後臺運行,不佔用主線程,不會被日誌卡住在主線程。
docker run -d -p 8080:8080 tomcat
複製代碼
這種方式啓動後, 只會返回一個完整的容器Id, 要查看啓動時輸出的日誌使用如下命令查看:
docker container logs 容器Id
複製代碼
docker exec -it 容器Id bash
複製代碼
進入容器後, 有些linux 命令會不能使用,好比ll
、vi
,由於tomcat這個鏡像是基於最簡單的linux構建的。
docker container ls -a
複製代碼
或者
docker ps -a
複製代碼
docker container stop
複製代碼
docker container rm 容器Id
複製代碼
或者
docker container prune
複製代碼
docker container prune
複製代碼
一個容器銷燬後, 容器裏面的數據也就丟失了。 如何把容器中的數據和宿主機之間作讀取,作到容器中的數據持久化呢, 這就是容器數據的持久化,須要使用到docker的數據卷
。
數據卷
是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,能夠提供不少有用的特性:
下面運行一個tomcat容器, 把ROOT
目錄指定爲宿主機上的目錄
ROOT
mkdir ROOT
cd /ROOT
vi index.html
複製代碼
內容爲 hello I am domain , this is index.html in volume
docker run -d -p 8081:8080 -v /root/ROOT:/usr/local/tomcat/webapps/ROOT tomcat
複製代碼
-v: 第一個參數表示宿主機的目錄,第二個參數表示容器中的目錄,意思是把容器中的ROOT
目錄替換爲宿主機中ROOT
目錄
瀏覽器中訪問 8081 端口就能看到 剛剛宿主機中index.html中的內容了。
能夠查看容器中數據卷的信息:
docker inspect 容器Id
複製代碼
數據卷
信息在 "Mounts" Key 下面
不指定標籤,默認從官網拉取最新的mysql鏡像
docker pull mysql
複製代碼
帶數據卷啓動容器
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
複製代碼
下面是每行參數的意思
-v /usr/local/docker/mysql/logs:/var/log/mysql
: 掛載日誌文件,左邊宿主機目錄, 右邊容器目錄。
-v /usr/local/docker/mysql/data:/var/lib/mysql
:掛載 數據文件。
-e MYSQL_ROOT_PASSWORD=123456
:經過環境變量設置root用戶的密碼
Compose 項目是 Docker 官方的開源項目,負責實現對 Docker 容器集羣的快速編排。
Compose 中有兩個重要的概念:
服務
(service):一個應用的容器,實際上能夠包括若干運行相同鏡像的容器實例。
項目
(project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。
Compose 的默認管理對象是項目,經過子命令對項目中的一組容器進行便捷地生命週期管理。
這裏使用二進制包的方式來安裝和卸載
從github上面下載安裝並給docker-compose
命令執行權限
curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
複製代碼
刪除二進制文件便可。
rm /usr/local/bin/docker-compose
複製代碼
這裏經過docker-compose
來啓動一個項目,啓動項目須要啓動兩個容器, 一個tomcat
,一個mysql
。 這就是前面說的服務
組成項目
。
docker-compose
是經過docker-compose.yml
文件來構建的 .
docker-compose.yml
文件cd /usr/local/docker
mkdir myshop
cd myshop
vi docker-compose.yml
version: '3'
services:
tomcat:
restart: always
image: 'tomcat'
container_name: tomcat
ports:
- 8080:8080
volumes:
- /usr/local/docker/myshop/ROOT:/usr/local/tomcat/webapps/ROOT
mysql:
restart: always
image: mysql
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
複製代碼
這裏配置了兩個服務, 兩個服務都使用了數據卷, tomcat
中的使用數據卷是常見的格式: 宿主機目錄:容器目錄
,mysql
中使用的是 統一管理數據卷的方式, 使用docker分配的宿主機目錄,而不是本身指定。下面是配置中的意思:
- mysql-data:/var/lib/mysql
: 左邊宿主機目錄名,右邊是容器目錄,而後在下面volumes
節點下聲明這個宿主機目錄
volumes:
mysql-data:
複製代碼
docker-compose.yml
文件所在目錄,執行啓動命令docker-compose up -d
複製代碼
-d
表示以守護態運行,不佔用操做系統主線程,不在主線程輸出日誌。
docker-compose.yml
文件所在目錄,執行啓動命令docker-compose down
複製代碼
那麼以守護態運行後,怎麼查看日誌?經過如下命令:
docker-compose logs
複製代碼
version: '3.1'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
ports:
- 3306:3306
volumes:
- ./data:/var/lib/mysql
adminer:
image: adminer
restart: always
ports:
- 8080:8080
複製代碼
經過docker-compos 來部署一個 git 託管平臺,很是的方便。
在/usr/local/docker/gitlab
目錄下建立一個docker-compose.yml
配置文件,內容以下:
version: '3'
services:
web:
image: 'twang2218/gitlab-ce-zh'
restart: always
hostname: '192.168.65.130'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.65.130:8080'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 8080
ports:
- '8080:8080'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
複製代碼
下面是每一個節點屬性的意思:
去到官網搜索鏡像gitlab-ce-zh
,拉取鏡像:
docker pull twang2218/gitlab-ce-zh
複製代碼
在docker-compose.yml文件所在目錄, 執行啓動命令:
docker-compose up
複製代碼
容器很大, 啓動時間較長, 須要等待一段時間。啓動成功後,提示修改密碼,這裏修改的是root的密碼。 修改完後就可使用 root 帳號和剛剛修改的密碼登陸啦。
Nexus
是一個強大的倉庫管理器,部署後,能夠把本身的sdk上傳這裏。 配置後便可拉取使用
/usr/local/docker/nexus3
目錄下,建立docker-compose.yml
配置文件,內容以下:version: '3.1'
services:
nexus:
restart: always
image: sonatype/nexus3
container_name: nexus
ports:
- 8081:8081
volumes:
- /usr/local/docker/nexus3/data:/nexus-data
複製代碼
docker-compose up
複製代碼
啓動報錯, 沒有IO權限,經過更改當前目錄的data目錄權限解決:
chmod 777 data
複製代碼
把以前的容器關閉,再從新啓動:
docker-compose down
docker-compose up
複製代碼
settings.xml
中添加 Nexus 認證信息(servers 節點下):<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
複製代碼
在 pom.xml 中添加以下代碼:
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://192.168.65.130:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://192.168.65.130:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
複製代碼
這裏的id
需和上面節點中定義的id
一致,url
爲nexus中browse拷貝對應版本的url
mvn deploy
複製代碼
# 如第三方JAR包:aliyun-sdk-oss-2.2.3.jar
mvn deploy:deploy-file
-DgroupId=com.aliyun.oss
-DartifactId=aliyun-sdk-oss
-Dversion=2.2.3
-Dpackaging=jar
-Dfile=D:\aliyun-sdk-oss-2.2.3.jar
-Durl=http://127.0.0.1:8081/repository/maven-3rd/
-DrepositoryId=nexus-releases
複製代碼
注意事項:
本地->私服->官服