Ubuntu16.04+
在Ubuntu系統中安裝較爲簡單,官方提供了腳本供咱們進行安裝。html
sudo apt install curl curl -fsSL get.docker.com -o get-docker.sh sudo sh get-docker.sh --mirror Aliyun
執行這個命令後,腳本就會自動的將一切準備工做作好,而且把Docker CE 的Edge版本安裝在系統中。nginx
啓動Docker CEweb
sudo systemctl enable docker sudo systemctl start docker
創建docker 用戶組docker
默認狀況下,docker 命令會使用Unix socket 與Docker 引擎通信。而只有root 用戶和docker 組的用戶才能夠訪問Docker 引擎的Unix socket。出於安全考慮,通常Ubuntu系統上不會直接使用root 用戶。所以,更好地作法是將須要使用docker 的用戶加入docker用戶組。json
註銷當前用戶,從新登陸Ubuntu,輸入docker info,此時能夠直接出現信息。ubuntu
配置國內鏡像加速vim
在/etc/docker/daemon.json 中寫入以下內容(若是文件不存在請新建該文件)安全
{ "registry-mirrors": [ "https://registry.docker-cn.com" ] }
從新啓動服務bash
1
2
|
sudo systemctl daemon-reload
sudo systemctl restart docker
|
IV. Docker的C/S模式
Docker 採用了C/S 架構,包括客戶端和服務端。Docker 守護進程(Daemon)做爲服務端
接受來自客戶端的請求,並處理這些請求(建立、運行、分發容器)。架構
Docker 守護進程通常在宿主主機後臺運行,等待接收來自客戶端的消息;Docker 客戶端則爲用戶提供一系列可執行命令,用戶用這些命令實現跟Docker 守護進程交互。咱們以前在Win10的命令行中即是最主要的客戶端:
Docker也爲咱們提供了Remote API來操做Docker的守護進程,也意味着咱們能夠經過本身的程序來控制Docker的運行。客戶端和服務端既能夠運行在一個機器上,也可經過socket 或者RESTful API 來進行通訊:
至於Docker的客戶端與守護進程之間的通訊,其鏈接方式爲socket鏈接。主要有三種socket鏈接方式:
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
完整的Docker的C/S鏈接方式的本質能夠通常表示爲以下:
V. 使用Docker
容器的基本操做
啓動一次操做容器:docker run IMAGE_NAME [COMMAND] [ARG…]
例如,啓動一個容器輸出hello world。因爲剛裝上Docker,沒有任何鏡像,因此會先下載一個最新的ubuntu18.04的docker鏡像。一次操做容器在處理完操做後會當即關閉容器。
1
|
docker run ubuntu echo
'hello world'
|
啓動交互式容器:docker run -t -i –name=自定義名稱 IMAGE_NAME /bin/bash
-i –interactive=true | false,默認是false
-t –tty=true | false,默認是false
–name 給啓動的容器自定義名稱,方便後續的容器選擇操做
啓動交互式的容器,就是相似虛擬機、雲主機的操做方式,操做完一個命令後仍然能夠繼續:
1
|
docker run -i -t ubuntu /bin/bash
|
查看容器:docker ps [-a] [-l]
省略 列出正在運行的容器
-a all 列出全部容器
-l latest 列出最近的容器
查看指定容器:docker inspect name | id
name指代具體的容器名稱,id則是容器的惟一id標識。inspect命令能夠詳細的展現出容器的具體信息。
1
|
docker inspect haha
|
從新啓動中止的容器:docker start [-i] 容器名
實際使用時,不必每次都從新啓動一個新的容器,咱們能夠從新啓動以前建立的容器,現實狀況也須要咱們這樣使用。
1
|
docker start -i haha
|
刪除中止的容器:docker rm name | id
1
2
|
docker rm thirsty_kepler
docker rm upbeat_albattani
|
守護式容器
交互式容器在運行完命令退出後即中止,而實際中咱們經常須要可以長時間運行,即便退出也能後臺運行的容器,而守護式容器具有這一功能。守護式容器具備:
- 可以長期運行;
- 沒有交互式會話;
- 適合於運行應用程序和服務。
以守護形式運行容器
咱們執行完須要的操做退出容器時,不要使用exit退出,能夠利用Ctrl+P Ctrl+Q代替,以守護式形式退出容器。
附加到運行中的容器
退出正在運行的容器,想要再次進入,須要使用attach命令:docker attach name | id
1
|
docker attach haha
|
啓動守護式容器
啓動守護式容器,能夠在後臺爲咱們執行操做:docker run -d IMAGE_NAME [COMMAND] [ARG…]
當命令在後臺執行完畢,容器仍是會關閉。這裏防止容器馬上退出,寫一個腳本循環輸出「hello world」。
1
|
docker run --name hiahia -d ubuntu /bin/sh -c
"while true; do echo hello world; sleep 1; done"
|
查看容器日誌
當守護式容器在後臺運行時,咱們能夠利用docker的日誌命令查看其輸出:docker logs [-f] [-t] [–tail] IMAGE_NAME
-f –follows=true | false,默認是false,顯示更新
-t –timestamps=true | false,默認是false,顯示時間戳
–tail=「all」 | 行數,顯示最新行數的日誌
查看容器內進程
對運行的容器查看其進程:docker top IMAGE_NAME
運行中容器啓動新進程
Docker的理念是一個容器運行一個服務,可是每每須要對一個服務進行監控,因此也須要在已經運行服務的容器啓動新的進程:docker exec [-d] [-i] [-t] IMAGE_NAME [COMMAND] [ARG…]
1
|
docker exec -i -t hiahia /bin/bash
|
中止守護式容器
發送信號中止容器:docker stop 容器名
強制中止:docker kill 容器名
VI. 案例:在容器中部署靜態網站
容器的端口映射
命令:run [-P] [-p]
-P,–publish-all=true | false,大寫的P表示爲容器暴露的全部端口進行映射;
-p,–publish=[],小寫的p表示爲容器指定的端口進行映射,有四種形式:
- containerPort:只指定容器的端口,宿主機端口隨機映射;
- hostPort:containerPort:同時指定容器與宿主機端口一一映射;
- ip::containerPort:指定ip和容器的端口;
- ip:hostPort:containerPort:指定ip、宿主機端口以及容器端口。
例如:
1
2
3
4
|
docker run -p 80 -i -t ubuntu /bin/bash
docker run -p 8080:80 -i -t ubuntu /bin/bash
docker run -p 0.0.0.0::80 -i -t ubuntu /bin/bash
docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
|
容器中部署Nginx服務
準備環境:
1
2
3
4
5
6
7
8
|
# 1. 建立映射80端口的交互式容器
docker run -p 80 --name web -i -t ubuntu /bin/bash
# 2. 更新源
apt-
get
update
# 3. 安裝Nginx
apt-
get
install -y nginx
# 4. 安裝Vim
apt-
get
install -y vim
|
建立靜態頁面:
1
2
3
|
mkdir -p /
var
/www/html
cd /
var
/www/html
vim index.html
|
修改Nginx配置文件:
1
2
3
4
|
# 查看Nginx安裝位置
whereis nginx
# 修改配置文件
vim /etc/nginx/sites-enabled/
default
|
運行Nginx:
1
2
3
4
|
# 啓動nginx
nginx
# 查看進程
ps -ef
|
驗證網站訪問:
1
2
3
4
5
6
|
# 退出容器
Ctrl+P Ctrl+Q
# 查看容器進程
docker top web
# 查看容器端口映射狀況
docker port web
|
經過宿主機地址加映射端口訪問:
VII. 鏡像基操
查看刪除鏡像
列出鏡像:docker images [OPTIONS] [REPOSITORY]
-a,–all=false,顯示全部鏡像
-f,–filter=[],顯示時過濾條件
–no-trunc=false,指定不使用截斷的形式顯示數據
-q,–quiet=false,只顯示鏡像的惟一id
查看鏡像:docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE]
-f,–format=「」
刪除鏡像:docker rmi [OPTIONS] IMAGE [IMAGE]
-f,–force=false,強制刪除鏡像
–no-prune=false,保留未打標籤的父鏡像
虛懸鏡像:既沒有倉庫名,也沒有標籤,均爲\
獲取推送鏡像
查找鏡像:docker search [OPTIONS] TEAM
–automated=false,僅顯示自動化構建的鏡像
–no-trunc=false,不以截斷的方式輸出
–filter,添加過濾條件
拉取鏡像:docker pull [OPTIONS] NAME [:TAG]
-a,–all-tags=false,下載全部的鏡像(包含全部TAG)
推送鏡像:docker push NAME [:TAG]
Docker容許上傳咱們本身構建的鏡像,須要註冊DockerHub的帳戶。
構建鏡像
構建Docker鏡像,能夠保存對容器的修改,而且再次使用。構建鏡像提供了自定義鏡像的能力,以軟件的形式打包並分發服務及其運行環境。Docker中提供了兩種方式來構建鏡像:
- 經過容器構建:docker commit
- 經過Dockerfile:docker build
使用commit命令構建鏡像
命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
參數:-a,–author=「」,指定鏡像的做者信息
-m,–message=「」,提交信息
-p,–pause=true,commit時是否暫停容器
使用Dockerfile文件構建鏡像
Docker容許咱們利用一個相似配置文件的形式來進行構建自定義鏡像,在文件中能夠指定原始的鏡像,自定義鏡像的維護人信息,對原始鏡像採起的操做以及暴露的端口等信息。好比:
1
2
3
4
5
6
|
# Sample Dockerfile
FROM ubuntu:16.04
MAINTAINER wgp
"Kingdompin@163.com"
RUN apt-
get
update
RUN apt-
get
install -y nginx
EXPOSE 80
|
命令:docker build [OPTIONS] DockerFile_PATH | URL | -
參數:–force-rm=false
–no-cache=false
–pull=false
-q,quite=false,構建時不輸出信息
–rm=true
-t,tag=「」,指定輸出的鏡像名稱信息
VIII. 鏡像遷移
咱們製做好的鏡像,通常會遷移或分享給其餘須要的人。Docker提供了幾種將咱們的鏡像遷移、分享給其餘人的方式。推薦鏡像遷移應該直接使用Docker Registry,不管是直接使用Docker Hub仍是使用內網私有Registry均可以。使用鏡像頻率不高,鏡像數量很少的狀況下,咱們能夠選擇如下兩種方式。
上傳Docker Hub
首先,須要在Docker Hub上申請註冊一個賬號(人機驗證時須要***)。而後咱們須要建立倉庫,指定倉庫名稱。
在終端中登陸你的Docker Hub帳戶,輸入docker login
,輸入用戶名密碼便可登陸成功。
查看須要上傳的鏡像,並將選擇的鏡像打上標籤,標籤名需和Docker Hub上新建的倉庫名稱一致,不然上傳失敗。給鏡像打標籤的命令以下。
1
|
docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]
|
其中existing-image
表明本地待上傳的鏡像名加tag,後面<hub-user>/<repo-name>[:<tag>]
則是爲上傳更改的標籤名,tag不指定則爲latest。
能夠看到,咱們從新爲ubuntu:16.04的鏡像打上標籤,觀察IMAGE ID可知,同一鏡像能夠擁有不一樣的標籤名。接下來,咱們利用push
命令直接上傳鏡像。
1
|
docker push <hub-user>/<repo-name>:<tag>
|
如圖,咱們已經上傳成功。因爲以前介紹的分層存儲系統,咱們這裏是直接對已有的ubuntu鏡像進行上傳,只是從新打了標籤,因此真正上傳的只是變化的部分。
導出文件互傳
Docker 還提供了 docker load
和 docker save
命令,用以將鏡像保存爲一個tar文件。好比此次咱們將ubuntu:latest這個鏡像保存爲tar文件。
查看本地磁盤,便可看見名爲ubuntu18.04的tar包。咱們能夠將其拷貝給其餘PC,利用load命令從新導入。