在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
# 創建docker組 sudo groupadd docker # 將當前用戶加入docker組 sudo usermod -aG docker $USER
註銷當前用戶,從新登陸Ubuntu,輸入docker info,此時能夠直接出現信息。ubuntu
配置國內鏡像加速vim
在/etc/docker/daemon.json 中寫入以下內容(若是文件不存在請新建該文件)安全
{ "registry-mirrors": [ "https://registry.docker-cn.com" ] }
從新啓動服務bash
sudo systemctl daemon-reload sudo systemctl restart docker
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鏡像。一次操做容器在處理完操做後會當即關閉容器。
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 給啓動的容器自定義名稱,方便後續的容器選擇操做
啓動交互式的容器,就是相似虛擬機、雲主機的操做方式,操做完一個命令後仍然能夠繼續:
docker run -i -t ubuntu /bin/bash
查看容器:docker ps [-a] [-l]
省略 列出正在運行的容器
-a all 列出全部容器
-l latest 列出最近的容器
查看指定容器:docker inspect name | id
name指代具體的容器名稱,id則是容器的惟一id標識。inspect命令能夠詳細的展現出容器的具體信息。
docker inspect haha
從新啓動中止的容器:docker start [-i] 容器名
實際使用時,不必每次都從新啓動一個新的容器,咱們能夠從新啓動以前建立的容器,現實狀況也須要咱們這樣使用。
docker start -i haha
刪除中止的容器:docker rm name | id
docker rm thirsty_kepler docker rm upbeat_albattani
交互式容器在運行完命令退出後即中止,而實際中咱們經常須要可以長時間運行,即便退出也能後臺運行的容器,而守護式容器具有這一功能。守護式容器具備:
以守護形式運行容器
咱們執行完須要的操做退出容器時,不要使用exit退出,能夠利用Ctrl+P Ctrl+Q代替,以守護式形式退出容器。
附加到運行中的容器
退出正在運行的容器,想要再次進入,須要使用attach命令:docker attach name | id
docker attach haha
啓動守護式容器
啓動守護式容器,能夠在後臺爲咱們執行操做:docker run -d IMAGE_NAME [COMMAND] [ARG…]
當命令在後臺執行完畢,容器仍是會關閉。這裏防止容器馬上退出,寫一個腳本循環輸出「hello world」。
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…]
docker exec -i -t hiahia /bin/bash
中止守護式容器
發送信號中止容器:docker stop 容器名
強制中止:docker kill 容器名
命令:run [-P] [-p]
-P,–publish-all=true | false,大寫的P表示爲容器暴露的全部端口進行映射;
-p,–publish=[],小寫的p表示爲容器指定的端口進行映射,有四種形式:
例如:
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
準備環境:
# 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
建立靜態頁面:
mkdir -p /var/www/html cd /var/www/html vim index.html
修改Nginx配置文件:
# 查看Nginx安裝位置 whereis nginx # 修改配置文件 vim /etc/nginx/sites-enabled/default
運行Nginx:
# 啓動nginx nginx # 查看進程 ps -ef
驗證網站訪問:
# 退出容器 Ctrl+P Ctrl+Q # 查看容器進程 docker top web # 查看容器端口映射狀況 docker port web
經過宿主機地址加映射端口訪問:
列出鏡像: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中提供了兩種方式來構建鏡像:
使用commit命令構建鏡像
命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
參數:-a,–author=「」,指定鏡像的做者信息
-m,–message=「」,提交信息
-p,–pause=true,commit時是否暫停容器
使用Dockerfile文件構建鏡像
Docker容許咱們利用一個相似配置文件的形式來進行構建自定義鏡像,在文件中能夠指定原始的鏡像,自定義鏡像的維護人信息,對原始鏡像採起的操做以及暴露的端口等信息。好比:
# 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上新建的倉庫名稱一致,不然上傳失敗。給鏡像打標籤的命令以下。
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
命令直接上傳鏡像。
docker push <hub-user>/<repo-name>:<tag>
如圖,咱們已經上傳成功。因爲以前介紹的分層存儲系統,咱們這裏是直接對已有的ubuntu鏡像進行上傳,只是從新打了標籤,因此真正上傳的只是變化的部分。
Docker 還提供了 docker load
和 docker save
命令,用以將鏡像保存爲一個tar文件。好比此次咱們將ubuntu:latest這個鏡像保存爲tar文件。
查看本地磁盤,便可看見名爲ubuntu18.04的tar包。咱們能夠將其拷貝給其餘PC,利用load命令從新導入。