蠻吉學 Docker

What is Docker?

docker 是一個能夠放東西的容器,那東西是什麼?能夠是redis、nginx、mysql。總之你能在系統上安裝的均可以在dokcer裏面安裝。java

蠻吉:爲何這麼作?

集中管理,使用方便,安裝更方便,不用到各各目錄上去找配置文件啊,啓動文件之類的。mysql

在咱們測試環境明明是好的啊?」,這句話是否是很熟悉?(壞笑)linux

好比咱們代碼須要的組件,redis在測試環境有不少配置須要修改,可是在線上環境若是少了一個甚至版本不一致了,那麼在上線的時候,都會出現不可預料的問題。nginx

那麼有了docker 就能夠把組件、環境、配置封裝到一個鏡像,交給運維就能夠避免許屢次臉紅脖子粗的事情了。
封裝好的鏡像就能夠在不一樣的系統中運行,這封裝和處處運行的思想和Java比較一致。redis

名詞解釋:
鏡像:相似於安裝包。
容器:一個應用對應一個容器,好比,我安裝一個redis,一個nginx ,那麼就是兩個容器,分別裝有redis和nginx。
用java思想理解:鏡像是對象,容器是實例spring

圖片描述

安裝nginx

咱們先安裝一個nginx試試,
第一步搜索一下倉庫有沒有nginx的鏡像sql

docker search nginx

clipboard.png

咱們發現列出了不少,那麼咱們須要的是第一個,把它拉下來(默認最新版)須要特訂版本後面加上冒號和版本號。docker

docker pull nginx

這時候可使用 docker images 命令查看已經下載下來的鏡像們。json

clipboard.png

有了鏡像咱們就安裝吧centos

docker run -p 80:80 -d --name nginx nginx

安裝成功!對!你沒有看錯。

clipboard.png

我來解釋一下上面那條命令的參數,

  • -p 後面跟端口,冒號前面是宿主機的端口,後面是容器內nginx 的端口
  • -d 後臺運行
  • --name 啓動後容器的別名
  • 最後一個nginx 是鏡像的名稱。

docker ps 能夠查看正在運行的容器,dockers ps -a 查看全部容器。

clipboard.png

蠻吉:若是我想修改nginx 的配置怎麼辦?

容器數據卷

  1. 可使用 docker exec -it [CONTAINER ID] bash 進入容器裏面找到並修改,exit命令退出容器。
  2. 也能夠在啓動的時候使用-v 參數掛載目錄,給容器和宿主機指定目錄作個映射。只須要在宿主機指定目錄操做,不須要進入容器。-v 可使用多個。
    我先在主機新建好了目錄和配置文件。

    • 主機nginx配置文件:/app/nginx/conf/nginx.conf
    • 容器nginx配置文件:/etc/nginx/nginx.conf
    • 主機redis日誌目錄:/app/nginx/logs
    • 容器redis日誌目錄:/var/log/nginx
docker run -d -p 8082:80 --name nginx3 -v /app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /app/nginx/logs:/var/log/nginx nginx

若是安裝redis 也是那麼簡單,兩條命令就能夠完成安裝

docker pull redis
docker run -p 6379:6379 -d --name  redis-6379  redis

當你 docker exec -it [CONTAINER ID] bash 進入容器後發現,原來裏面是一個精簡版的linux.

製做鏡像

蠻吉:那咱們能不能本身製做鏡像?

答案是確定的,

咱們就用運行jar包爲例。
好比我寫了一個spring-boot 的項目,把它打成jar包 :datashare-0.0.1-SNAPSHOT.jar
怎麼打jar包?先這樣,而後那樣,最後再這樣一下就行了。

蠻吉:怎麼運行?

java -jar datashare-0.0.1-SNAPSHOT.jar & ?
nohup java -jar datashare-0.0.1-SNAPSHOT.jar >info.log & ?

no no no
我要用docker 部署。
用docker 部署 就要先有鏡像,製做鏡像只須要一個Dockerfile文件就能夠啦
如下是Dockerfile的內容:

# openjdk 基礎鏡像 是我pull到本地的,運行Jar 須要jdk 環境
 FROM openjdk
 
# ?做者簽名
 MAINTAINER MSHU
 
# ?簡化 jar 的名字路徑 
 COPY datashare-0.0.1-SNAPSHOT.jar datashare.jar
 
# ?執行 java -jar 命令
 CMD java -jar datashare.jar
 
# ?設置對外端口爲 8089
 EXPOSE 8089

運行Jar 須要jdk 環境,因此我提早docker pull openjdk到本地了。
將咱們新建的 Dockerfile 和datashare-0.0.1-SNAPSHOT.jar放一塊兒,該目錄不要有其餘文件。

運行 docker build -t datashare . 開始製做。

  • datashare 表明製做的鏡像名稱,.表明使用當前目錄的 Dockerfile 。

鏡像作好了放入容器吧。
docker run -p 8089:8089 -d --name datashare datashare

成功了!
clipboard.png

蠻吉:若是我想把這個鏡像拷貝出來,在我同事電腦運行行不行?

知足你!
docker save -o datashare.img datashare
在當前目錄導出名爲 datashare.img 的鏡像。
而後複製到你同事電腦上並運行docker load -i datashare.img就導入了。

鏡像加速

官方倉庫在國外,下載緩慢,使用如下方法能夠更快!和 maven 一個道理。

centos7以上
修改 /etc/docker/daemon.json文件,若是沒有就新建 !
內容:

{
 "registry-mirrors": ["http://hub-mirror.c.163.com"]
 }

重啓docker不能忘 !

systemctl restart docker

珍藏命令

docker pull [nginx] 下載容器
docker ps 查看正在運行的容器
docker ps -a 查看全部容器
docker exec -t -i [id] bash 根據id進入對應的軟件目錄
docker start [id] 啓動某個容器
docker stop [id] 中止某個容器
docker restart [id] 重啓容器
docker images 查看全部已安裝的鏡像
docker inspect [id] 查看啓動容器的掛載信息
docker rm [id] 刪除容器
docker rmi [鏡像id] 刪除鏡像
docker logs -f -t --tail 200 容器ID 查看容器日誌
systemctl enable docker 設置開機啓動
service docker start 啓動docker服務
usermod -G docker [用戶名] 給指定用戶添加權限
docker cp [id]:目錄 /主機目錄 複製容器某路徑下的文件(夾)到主機某路徑下的文件(夾)
docker commit -m="提交的描述信息" -a="做者" [原容器id:[標籤名]] 將容器封裝成鏡像

docker run 後面也有不少參數,我知道的也很少,各位自行搜索吧,我去看《魁拔》啦,真心話真好看!

相關文章
相關標籤/搜索